FTP-сервер с виртуальными пользователями на базе vsftpd

Материал из support.qbpro.ru

Автор: Уваров А.С. 29.01.2016
Vsftpd-virtual-user-000.jpg
Протокол FTP, несмотря на преклонный возраст и серьезные недостатки продолжает широко применяться, во многом благодаря простоте и поддержке со стороны самого широкого спектра устройств и ПО. FTP-сервер является неотъемлемой частью любого веб-сервера, применяется в системах автоматизированного обмена данными. Наиболее часто встающей перед администраторами таких систем задачей является создание сервера с виртуальными пользователями. Сегодня мы расскажем, как это сделать.

Про настройку FTP-сервера на базе vsftpd мы уже рассказывали на страницах нашего сайта, недавно существенно дополнив и обновив статью Простой FTP-сервер на базе Ubuntu (vsftpd). В ней мы рассказали каким образом можно ограничить список пользователей, имеющих возможность подключаться к серверу, и их права. Однако локальные пользователи остаются при этом локальными пользователями и несмотря на ограниченные права могут оказаться объектом атаки, направленной на повышение прав, например, через уязвимости в каком-либо ПО.

Кроме того, ручное редактирование списков и настроек пользователей может оказаться весьма трудоемким делом если их не один-два, а существенно больше. Также иногда возникает ситуация, что светить данные реальных пользователей просто нежелательно, например, FTP используется движком сайта (CMS), связка пользователь-пароль явно прописана в конфиге и теоретически доступна любому работающему с сайтом сотруднику.

В таких ситуациях следует использовать виртуального пользователя, который будет иметь доступ исключительно к данному FTP-ресурсу и учетные данные которого можно смело сообщить всем принимающих участие в работе реальным сотрудникам.

В нашей статье мы настроим FTP-сервер для реализации следующей схемы:

Vsftpd-virtual-user-001.jpg
Пусть в нашем распоряжении имеется некий веб-сервер под управлением которого находятся три сайта: 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
..