avatar Debian Настройка FTP сервера vsFTPd на Debian/Ubuntu

FTP очень полезная вещь, он позволяет легко подключаться к удаленному серверу, для загрузки или скачивания данных.
Со всеми недостатками и изъянами в безопасности, FTP должен был отойти на второй план, как и протокол telnet, однако у него оказалось намного больше преимуществ, по этому он используется по сей день и довольно успешно. К нему появилось довольно много модификаций, которые позволяют например: заворачивать трафик в SSL/TLS для повышения безопасности переделываемых по сети данных, как это сделать можно ознакомиться в статье- Настрока ProFTPd для использования TLS Но на этот раз не о Proftpd.
Данная статья была вынесена в отдельный топик, для того чтобы ее было проще найти на сайте. Раньше она находилась в статье по настройке Nginx+Apache, но думаю что она будет намного полезнее в качетсве самостоятельного материала.
Переходим в режим супер пользователя root:
Для Debian:
su

Для Ubuntu
sudo su


Устанавливаем vsFTPd:
aptitude install vsftpd


Нашей основной задачей является блокирование пользователя внутри своей домашней директории, для того, чтобы не допустить его переход в папки «соседей» по серверу. Для этого мы немного подредактируем конфигурационный файл vsftpd.conf.

nano /etc/vsftpd.conf


Находим и редактируем следующие строчки:

Разрешаем запись:
write_enable=YES


ascii_upload_enable=YES
ascii_download_enable=YES


напишем свой баннер для входа, хотя он и не обязателен( на работу он не влияет):
ftpd_banner=Welcome to our FTP service


Запираем пользователей в домашних директориях:
chroot_local_user=YES


ну под данной записью добавим:
allow_writeable_chroot=YES


Разрешаем вход локальным пользователям:
local_enable=YES


Запрещаем анонимный доступ, необходимо найти строку:
#anonymous_enable=YES

И привести ее к виду:
anonymous_enable=NO


Ну и добавим работу в пассивном режиме:
pasv_min_port=50000 
pasv_max_port=60000


Поддержка IPv6 в vsFTPd
Для того чтобы добавить возможность работы с ip версии 6, то в конфигурационном файле находим строку:
listen=YES

Её необходимо за комментировать, чтобы она выглядела:
#listen=YES

Также, нам необходимо найти строку:
#listen_ipv6=YES

И снять с нее комментарий.
После этого, наш FTP сервер будет доступен по IPv4 и IPv6

Права доступа на файлы и директории


Параметр local_umask отвечает за то, какие права будут присвоены файлам, которые были закачаны через FTP, по умолчанию там установлено local_umask=022, маска расчитывается очень просто, по формуле 777-A=X
Где:
777-права полного доступа
А-права которые необходимо получить
Х-маска, которую необходимо выставить
Предположим, нам необходимо получить права 754 что соотвествует drwxr-xr--, тогда 777-754=23 получается local_umask=023.
В любом случае, тот кто закачал файлы является их владельцем и может расширить права доступа к ним.
В общем, находим строку:
local_umask=022


И меняем 022 на 023 или на ту которая необходима в вашей ситуации:
local_umask=023


Авторизация vsftpd и /bin/false


Для обеспечения безопасности сервера, пользователям виртуальных хостов будет отключен шелл, как пишут на просторах интернетов, рекомендуется это делать следующим способом:

useradd username -b /home -m -U -s /bin/false


Создадим для него пароль:
passwd username

Рассмотрим это выражение более подробно.
Где:
username -имя пользователя(логин)
home-Директория где будет находиться его домашний каталог
ключ -m — указывает на то, что его домашней директории будет присвоено название которое было указано в username.
ключ -U -Указывает на то что необходимо создать одноименную группу.
-s /bin/false -что пользователю будет отключен шелл (это важный и тонкий момент!)
Назначение остальных ключей можно нагуглить за пару минут.

Если пользователю отключить шелл, то он не сможет залогиниться на FTP сервер, его будет просто отфутболивать.
Вдумчивое чтение документации по vsFTPd рассказало мне, что доступ к FTP могут получить пользователи которые имеют работоспособный шелл т.е. /bin/bash, для того чтобы пользователи с /bin/false могли авторизироваться на нашем ftp, нам необходимо отредактировать файл /etc/pam.d/vsftpd

nano /etc/pam.d/vsftpd


Найти и закоментировать строку (она самая последняя)
auth   required        pam_shells.so


чтобы она выглядела:
#auth   required        pam_shells.so


И перезапускаем vsftpd
/etc/init.d/vsftpd restart


И еще немного для общего развития- Пользователь с отключенным шеллом, не сможет подключиться по SSH! Это можно считать дополнительным плюсом к безопастности.
Как отключить шелл уже существующему в системе пользователю:
nano /etc/passwd


там находим нужного пользователя и /bin/bash меняем на /bin/false, после перезагрузки, изменения переменятся.

На этом можно закончить.
Чтобы устранить проблему с настройкой vsFTPd на Ubuntu 12.04, воспользуйтесь заметкой: Ремонтируем vsFTPd в Ubuntu 12.04

62 комментария

avatar
А у меня такая проблема с Proftpd, когда кто-то что загружает или скачивает, то оперативная память исчезает со скоростью передачей данных файлов, вот скриншот с чем это может быть связанно?
avatar
Это буфферизируемая память, поставьте пакет htop чем top, он выдает более развернутую информацию, вам все станет ясно+ у него есть отличная справка-какой параметр что показывает.
Таже петрушка наблюдается при работе Samba при закачке на него больших файлов, отжерается ОЗУ ровно по размеру файла который был закачан на сервер. Так что, это не проблема.
avatar
А можно это как-то отключить в proftpd чтобы он на прямую передавал файл?
avatar
я не понял вопроса. Он непосредственно принимает файл и пишет его на диск.
На это просто не нужно обращать внимания, утечки памяти там нет, память сама освободится-не волнуйтесь.
avatar
Отключить буфферизируемую память для proftpd
avatar
Она выделяется системой и не контролируется proftpd да и не имеет смысла, просто не напрягайтесь, она как заполнилась так и освободилась…
avatar
Все спасибо за информацию
avatar
для отключения шела по ssh можно еще в /etc/ssh/sshd_config добавить запись DeniGroups groupname например и команда чуть изменится useradd username -b /home/ -m -g groupname -s /bin/false
avatar
без -s /bin/false имелось ввиду))
avatar
Отличная идея, я и забыл что в ssh можно рулить на основе групп…
avatar
Всем доброго времени суток! Подскажите где можно почитать или опишите тут как настроить ФТП таким образом:
user1 видит 3 папки с 1 может только качать во 2 только скидывать и в 3 делать все что угодно кроме запуска файлов;
user2 видит все папки user1 и может делать там все что угодно
Заранее спасибо!
avatar
Здравствуйте
Первым делом отключаем чрутинг, чтобы выпустить пользователей из домашних директорий.
#chroot_local_user=YES


FTP не поддерживает удаленный запуск приложений, как например smb, по эту препятствовать запуску приложений на клиентском ПК вы не сможете т.к. у него стоит доступ на чтение, а значит пользователь может забрать файл себе и запустить!
Создаем группу, для примера назовем ее poweruser в нее добавляем пользователей user1 и user2
Создадим 3 папки, назовем их folder1 folder2 folder3 и сделаем их владельцем пользователя user2
расставим на них права доступа folder1 владелец RWX группа poweruser R__ остальные ___
переходим к folder2 владелец RWX группа poweruser _W_ остальные ___
и folder3 владелец RWX группа poweruser RW_ остальные ___
Чмоды посчитаете сами!

После этого создаем маску для создаваемых файлов, о том как ее рассчитать написано в статье, и пользуетесь.
avatar
useradd username -b /home/ -m -U -s /bin/false


ключ не правильный у вас, должен быть -d
avatar
Почему не правильно?
Вот полный список ключей для запуска.
-b, --base-dir BASE_DIR       base directory for the home directory of the new account
  -c, --comment COMMENT         GECOS field of the new account
  -d, --home-dir HOME_DIR       home directory of the new account
  -D, --defaults                print or change default useradd configuration
  -e, --expiredate EXPIRE_DATE  expiration date of the new account
  -f, --inactive INACTIVE       password inactivity period of the new account
  -g, --gid GROUP               name or ID of the primary group of the new account
  -G, --groups GROUPS           list of supplementary groups of the new account
  -h, --help                    display this help message and exit
  -k, --skel SKEL_DIR           use this alternative skeleton directory
  -K, --key KEY=VALUE           override /etc/login.defs defaults
  -l, --no-log-init             do not add the user to the lastlog and
                                faillog databases
  -m, --create-home             create the user's home directory
  -M, --no-create-home          do not create the user's home directory
  -N, --no-user-group           do not create a group with the same name as the user
  -o, --non-unique              allow to create users with duplicate (non-unique) UID
  -p, --password PASSWORD       encrypted password of the new account
  -r, --system                  create a system account
  -s, --shell SHELL             login shell of the new account
  -u, --uid UID                 user ID of the new account
  -U, --user-group              create a group with the same name as the user
  -Z, --selinux-user SEUSER     use a specific SEUSER for the SELinux user mapping

А как, по вашему, должно быть?
avatar
Наверно я просто не так уж и понял что вы хотели сказать под «Директория где будет находиться его домашний каталог» (я понял как в папке (директория) /home/ будут его файлы(каталог), что с ключом -b не верно. Просто не привычно когда одно и то же в одном приложении называют двумя разными словами. Простите.
avatar
Я так и не понял, что вы хотели сказать :)
Сама идея чтобы домашняя директория пользователя создавалась в директории /home автоматически
avatar
При попытке залить что-нибудь в домашнюю категорию — все ок, при попытки в другую — начинаются проблемы:
Команда: TYPE A
Ответ: 200 Switching to ASCII mode.
Команда: PASV
Ответ: 227 Entering Passive Mode (46,4,196,249,222,199).
Команда: STOR config.php
Ответ: 553 Could not create file.

chroot отключен: chroot_local_user=NO
В чем может быть проблема?
avatar
В правах, на директории.
avatar
Спасибо :)
Решил проблему через chmod 777 /home/beta и такие же права на подпапку www. С любыми другими правами подпапки была ошибка:
Статус: Получение списка каталогов…
Команда: CWD /home/beta
Ответ: 250 Directory successfully changed.
Команда: CWD www
Ответ: 550 Failed to change directory.
Ошибка: Не могу получить список каталогов!

Это конечно как-то неправильно, но ftp буду пользоваться редко => редко буду и включать 777 права.
avatar
Так прав 777 и не должно быть, их необходимо предоставлять ТОЛЬКО на отдельные директории, в целях безопасности.
avatar
А какие права тогда cnjbn выставить?
avatar
Права необходимо выставлять только те- которые достаточны для работы, а это права на чтение, а на запись только на определенные директории.
Принцип очень простой-запретить все, разрешить только то, что необходимо и не более…
avatar
Добрый день.
Вроде сделал все так как здесь написано, но при попытке подключиться пользователь видит сообщение:
500 OOPS: vsftpd: refusing to run with writable root inside chroot()
Не могу понять как закрыть пользователя в домашнем каталоге? Если снимаю параметр chroot_local_user=YES, то пользователь может смотреть все директории, если ставлю параметр, то 500-ая ошибка.
avatar
Решил проблему путем запрета записи в домашнем каталоге пользователя (команда chmod a-w каталог).
avatar
на самом деле очень странно, такое решение.
Нужно будет пересмотреть документацию и подправить статью.
avatar
Да, подтверждаю слова , в /etc/vsftpd.conf строчка chroot_local_user=YES раскомментирована, при попытке подлкючиться спрашивает логин/пароль, все принимает и выдает
500 OOPS: vsftpd: refusing to run with writable root inside chroot()
Похоже, за решением надо отправляться в гугл, если эта проблема присутствует у всех =)
avatar
Или же добавить в /etc/vsftpd.conf строчку allow_writeable_chroot=YES
avatar
Не лучшее решение — добавил эту строчку, теперь вообще подключиться невозможно — даже до этапа запроса логина/пароля не доходит, а сразу «Не удалось соединиться».
avatar
Зарегистрировался что бы сказать:
Спасибо! Огромнейшее спасибо.
Использовал кучу мануалов, но все как то коряво работало и shell… Я тут все как по полочкам.
avatar
Рад что статья оказалась вам полезной…
avatar
Ну и добавим работу в пассивном режиме:
pasv_min_port=50000
pasv_max_port=60000
Эти параметры в ручную добавлять надо? в конфиги их нет! Если в ручную, то откуда такие значения?
avatar
Да в ручную.
С потолка-порты из этого диапазона выбираются случайным образом.
avatar
Появился вопрос по правам на файлы в директории ftp.
Был создан пользователь для скачивания документации, по примеру с useradd username -b /home/ -m -U -s /bin/false
Файлы заливаются другим пользователем через su
-rw-r--r-- 1 root root 16 Авг 28 17:01 user_right.txt

в итоге, пользователь username, может удалять файлы с ftp.
Что не так?
avatar
Вернее сформулирую вопрос по другому. Как пользователю запретить в своей домашней директории удалять и переименовывать файлы?
avatar
Решил данную проблему с помощью команды chattr
avatar
Приветствую!
установил, Спасибо прошло гладко, есть один момент при установке vsFTPd, запросила удалить dnsmasq-base с фразой «в дальнейшем не требуется», как и просили удалил
apt-get autoremove dnsmasq-base

но у меня теперь проблема появилась, все порты закрыты, и те правила что прописал в rc.local не срабатывают, как открыть порты? или вернуть dnsmasq-base на место? есть ли вариант утилиты для открытия/закрытия портов, для начала так-как являюсь зеленным новичком и только осваиваюсь в мире консоли :-) (стаж 5 недель)
avatar
Откровенно говоря, я впервые слышу чтобы vsftps удалял dnsmasq, у меня данный функционал на нескольких серверах и нигде таких проблем на вызывал.
поставьте этот пакет обратно да и все.
Открывать порты только через iptables, руководств по нему, вагон и большая тележка.
avatar
в вашем мануале опечатка, после
#auth   required        pam_shells.so

И перепапускаем vsftpd
Надеюсь я помог, а не помешал.
avatar
Спасибо исправил.
З.Ы. можно было и в личку написать.
avatar
Все сделал, но вот одно не ясно, что делать с этим:
useradd username -b /home/ -m -U -s /bin/false
Создадим для него пароль:
passwd username
Как создать логин и пароль?
Можно растолковать на пальцах? А то беда просто…
avatar
А что вам тут не понятно?!
например нам нужно добавить пользователя vasia
Тогда все это будет выглядеть так:

useradd vasia -b /home/ -m -U -s /bin/false
 Создадим для него пароль: 
 passwd vasia
вводим пароль пользователя vasia, 2 раза!


В статье все это расписывается, включая ключи, пункт Авторизация vsftpd и /bin/false куда уж понятнее, в чем у вас проблема?
avatar
я отвечу: непонятно почему не удается подключиться… ошибка 530
пользователь создается, пароль устанавливается, но только не подключается… (
в чем причина? я не понимаю…

может, здесь кто-нибудь знает? )
avatar
Что в логах?
avatar
а как посмотреть?
я ничего подходящего не нашел здесь /var/log
может, надо организовать запись?
avatar
/var/log/vsftpd.log
avatar
Так все разобрался.
500 OOPS: vsftpd: refusing to run with writable root inside chroot()
Если вы ставите на Ubuntu 12.04 / 12.10 то в пакете из репозиториев есть глюк, вам можно скачать версию посвежее, например от debian
Что нужно сделать вам:
1 качаем свежий пакет vsftpd (например для amd64)
wget http://ftp.ru.debian.org/debian/pool/main/v/vsftpd/vsftpd_3.0.2-3_amd64.deb


2 Устанавливаем:
sudo dpkg -i ./vsftpd_3.0.2-3_amd64.deb


В vsftpd.conf добавляем следующее:
allow_writeable_chroot=YES

чтобы выглядело, НАПРИМЕР, так:
chroot_local_user=YES
allow_writeable_chroot=YES


3 Перезапускаем vsftpd
sudo /etc/init.d/vsftpd restart

Пользуемся…
avatar
не понял… это мне?
у меня ubuntu 10.04
vsftpd сами поставили мне.
а лог такой:
Sat Apr 20 22:28:13 2013 [pid 29638] CONNECT: Client «85.26.183.192»
Sat Apr 20 22:28:42 2013 [pid 29637] [sotnik] FAIL LOGIN: Client «85.26.183.192»
остальное отличается только pid
смотрел редактором, хотя пишут, что так нежелательно делать.
avatar
не понял, vsftpd ставил я?
avatar
извините за идиотизм, но меня в вашем ответе сильно смущает слово например, и непонятно, можно попробовать так, как вы написали, или это надо сначала адаптировать для своего случая.
avatar
а что вас смущает!? Я написал под какую архитектуру можно поставить пакет, дальше берете конфиг из статьи и добавляете в него то что я приложил в комментарии… все
avatar
написал под какую архитектуру можно поставить пакет
— то есть надо взять подходящий сервер?
avatar
ОС сервера у вас скольки разрядная?
avatar
значит ставим пакет amd64
avatar
(Reading database… 21655 files and directories currently installed.)
Preparing to replace vsftpd 2.2.2-3ubuntu6.3 (using ./vsftpd_3.0.2-3_amd64.deb)…
vsftpd stop/waiting
Unpacking replacement vsftpd…
dpkg-deb: file `./vsftpd_3.0.2-3_amd64.deb' contains ununderstood data member data.tar.xz, giving up
dpkg: error processing ./vsftpd_3.0.2-3_amd64.deb (--install):
subprocess dpkg-deb --fsys-tarfile returned error exit status 2
vsftpd start/running, process 17184
Errors were encountered while processing:
./vsftpd_3.0.2-3_amd64.deb
avatar
Ну попробуйте установить готовый пакет другим способом или собрать deb пакет самому.
avatar
У меня есть вопрос, назревал уже давно, а вопрос такой при вводе в браузере ftp://site.ru вылезает вот это
Содержание /
Имя	Размер	Последнее изменение


Как от этого избавится?
avatar
никак, это стандартная инфа. для сервера файлов
avatar
Вроди и сделал все как нужно было, но вот не подуключается и все…
FileZilla пишет
«Статус: Не удалось установить соединение с „ECONNREFUSED — Connection refused by server“.
Ошибка: Невозможно подключиться к серверу»

В качестве логина использую нового пользователя которого создал, в качестве пароля — пароль который ему присвоил.
В качестве хоста IP сервера к которому подключался по SSH.
Первый раз ковыряюсь в серверах если чесно. прошу помощи и совета в знающих людей.
Спасибо.
avatar
Здравствуйте.
мало информации
Что в логах по данному вопросу?
Какая версия ОС и разрядность?
21й порт доступен для внешних подключений?
avatar
Спасибо за статью. Очень удобный и простой в настройке сервер. Хотелось бы узнать, можно ли прикрутить такую фичу. Нужно чтобы, на почту, приходили сообщения о загруженных файлах. Можно?
avatar
можно отслеживать события из лога и отправлять, допустим загружать скрипт который парсит лог, а как поступить с полученной информацией, уже ваше дело.
Есть что добавить? Регистрируйся и оставляй комментарии!