FTP-сервер с виртуальными пользователями на базе vsftpd
Автор: Уваров А.С. 29.01.2016
Протокол FTP, несмотря на преклонный возраст и серьезные недостатки продолжает широко применяться, во многом благодаря простоте и поддержке со стороны самого широкого спектра устройств и ПО. FTP-сервер является неотъемлемой частью любого веб-сервера, применяется в системах автоматизированного обмена данными. Наиболее часто встающей перед администраторами таких систем задачей является создание сервера с виртуальными пользователями. Сегодня мы расскажем, как это сделать.
Про настройку FTP-сервера на базе vsftpd мы уже рассказывали на страницах нашего сайта, недавно существенно дополнив и обновив статью Простой FTP-сервер на базе Ubuntu (vsftpd). В ней мы рассказали каким образом можно ограничить список пользователей, имеющих возможность подключаться к серверу, и их права. Однако локальные пользователи остаются при этом локальными пользователями и несмотря на ограниченные права могут оказаться объектом атаки, направленной на повышение прав, например, через уязвимости в каком-либо ПО.
Кроме того, ручное редактирование списков и настроек пользователей может оказаться весьма трудоемким делом если их не один-два, а существенно больше. Также иногда возникает ситуация, что светить данные реальных пользователей просто нежелательно, например, FTP используется движком сайта (CMS), связка пользователь-пароль явно прописана в конфиге и теоретически доступна любому работающему с сайтом сотруднику.
В таких ситуациях следует использовать виртуального пользователя, который будет иметь доступ исключительно к данному FTP-ресурсу и учетные данные которого можно смело сообщить всем принимающих участие в работе реальным сотрудникам.
В нашей статье мы настроим FTP-сервер для реализации следующей схемы:
Пусть в нашем распоряжении имеется некий веб-сервер под управлением которого находятся три сайта: blue.lab, green.lab и red.lab, физически расположенные в одноименных директориях. Наша задача создать FTP-сервер с виртуальными пользователями, каждый из которых имеет доступ только к своему сайту.
Важное замечание, в данной схеме все сайты должны работать от имени веб-сервера (www-data), если вы используете запуск каждого сайта от имени своего (реального) пользователя, то вам лучше настроить FTP-сервер для работы с реальными пользователями или дополнительно обеспечить нужные права доступа для виртуальных пользователей, что может представлять из себя нетривиальную задачу.
Прежде всего установим соглашение: имя виртуального пользователя должно совпадать и именем корневой FTP-папки, в нашем случае папки сайта, а все такие папки должны располагаться в одном месте, т.е. подпадать под шаблон /var/www/$USER. Это позволит в дальнейшем с легкостью манипулировать сайтами и виртуальными пользователями, а также избежать путаницы в именах и настройках.
Определившись с моделью размещения данных можно переходить к настройкам ПО. Кроме vsftpd нам понадобятся пакеты libpam-pwdfile и apache2-utils. Последний входит в состав одноименного веб-сервера и если у вас уже работает Apache, то устанавливать его не надо.
Сама установка предельно проста:
apt-get install vsftpd libpam-pwdfile apache2-utils
После чего перейдем к настройкам FTP-сервера, которые расположены в файле /etc/vsftpd.conf, мы перечислим опции в порядке их нахождения в файле.
Данная опция запускает FTP-сервер как службу
listen=YES
ниже имеется аналогичная взаимоисключающая опция:
listen_ipv6=NO
Первая из них обеспечивает поддержку IPv4, вторая сразу IPv6 и IPv4, поэтому должна быть включена только одна из них.
Запрещаем анонимных пользователей:
anonymous_enable=NO
И разрешаем локальных (и виртуальных) пользователей:
local_enable=YES
Также разрешаем запись:
write_enable=YES
и задаем маску для вновь создаваемых файлов и папок:
local_umask=022
Это обеспечит установку прав 755 на папки и 644 на файлы, т.е. полный доступ только владельцу и чтение для группы и остальных.
Чтобы FTP использовал локальное время сервера, а не GMT установим:
use_localtime=YES
И включим лог загружаемых и скачиваемых файлов:
xferlog_enable=YES
Разрешаем передачу данных через порт 20, требуется для лучшей совместимости с некоторыми клиентами:
connect_from_port_20=YES
Задаем путь к логу и его формат:
xferlog_file=/var/log/vsftpd.log xferlog_std_format=YES
Укажем таймауты:
idle_session_timeout=600 data_connection_timeout=120
Первый задает время отключения бездействующего пользователя, а второй время ожидания возобновления неоконченной передачи.
Для корректной работы с текстовыми данными, в частности с символами переноса строки в разных ОС (CR+LF в Windows, LF в Linux) включим поддержку ASCII, это полезно, если вы скачиваете скрипты или файлы с Linux сервера, правите их в среде Windows и заливаете обратно. В этом случае FTP автоматически будет менять символы переноса строки для соответствия стандартам системы.
ascii_upload_enable=YES ascii_download_enable=YES
Обязательно изолируем пользователя в корне его домашней директории и рядом впишем опцию, разрешающую запись в корень:
chroot_local_user=YES allow_writeable_chroot=YES
Остальные опции оставляем без изменения.
Ниже добавим необходимые нам настройки. Разрешим пассивный режим и явно укажем диапазон портов:
pasv_enable=YES pasv_min_port=7000 pasv_max_port=7100
Включим виртуальных пользователей:
guest_enable=YES
Укажем от имени какого реального пользователя они будут работать, так как в нашем случае нам надо работать с содержимым веб-сервера, то указываем соответствующего пользователя www-data.
guest_username=www-data
Применяем к виртуальным пользователям настройки локальных, иначе к ним будут применены ограничения анонимных.
virtual_use_local_privs=YES
Укажем шаблон для автоматической генерации домашнего каталога виртуального пользователя:
user_sub_token=$USER
Теперь можно задать сами домашние директории
local_root=/var/www/$USER
Также иногда неплохо будет скрыть реальных владельцев содержимого, для этого добавьте:
hide_ids=YES
Если вы используете Ubuntu, то добавьте следующую недокументированную опцию:
seccomp_sandbox=NO
Это позволит избежать ошибки 500 OOPS: prctl PR_SET_SECCOMP failed, которая возникает из некорректной совместной работы vsftpd и системы безопасности seccomp, в Debian данная ошибка не проявляется.
На этом настройка FTP-сервера закончена, сохраняем файл и переходим к настройке правил аутентификации. Откроем /etc/pam.d/vsftpd, закомментируем в нем все строки и добавим две свои:
auth required pam_pwdfile.so pwdfile /etc/vsftpwd account required pam_permit.so
После этого аутентификация локальных пользователей на FTP-сервере будет невозможна, работать будут только виртуальные. Опция pwdfile /etc/vsftpwd указывает путь к файлу паролей, его нам необходимо будет создать на следующем шаге.
Для создания пользователей будем использовать утилиту htpasswd из состава apache2-utils, для создания файла паролей и первого пользователя введите:
htpasswd -c -B /etc/vsftpwd blue.lab
или
htpasswd -c -p -b /etc/vsftpwd mylogin $(openssl passwd -1 -noverify mypassword)
Ключ -c предписывает создать файл паролей, если он существует, то все данные в нем будут очищены, а файл перезаписан, -B задает необходимый для vsftpd алгоритм шифрования хэша пароля (bcrypt).
Следующие пользователи создаются командой (в нашем примере это пользователь green.lab):
htpasswd -B /etc/vsftpwd green.lab
Для удаления пользователя используйте (удаляем red.lab):
htpasswd -D /etc/vsftpwd red.lab
После чего можно перезапустить службу FTP-сервера и проверить его работу:
service vsftpd restart
Как видим, настроить FTP-сервер с виртуальными пользователями по нашей инструкции (в отличие от многих иных "инструкций" в сети) абсолютно несложно и недолго. Если вы будете внимательно следовать всем нашим рекомендациям, то сложностей у вас возникнуть не должно.
ИСТОЧНИК:
ПОЛЕЗНОЕ:
Пример правил iptables с пробросом портов с шлюза (eth0 - 88.12.90.221) на внутренний vsftp на другом хосте 10.10.5.10:
.. iptables -t nat -A PREROUTING -p tcp -m tcp -d 88.12.90.221 --dport 6021 -j DNAT --to-destination 10.10.5.10:21 iptables -t nat -A PREROUTING -p tcp -m tcp -d 88.12.90.221 --dport 6021 -j DNAT --to-destination 10.10.5.10:20 iptables -t nat -A PREROUTING -i eth0 -p tcp -m tcp --dport 7000:7100 -j DNAT --to-destination 10.10.5.10 ..