Настройка vsftpd
Для организации доступа к виртуальному хостингу по FTP можно воспользоваться популярным FTP-сервером vsftpd. При этом может оказаться удобнее и безопаснее настроить отдельный файл с виртуальными пользователями, любой из которых будет работать с привилегиями одного специально выделенного системного пользователя.
В интернете можно найти массу рецептов, использующих для этих целей PAM-модуль pam_userdb. Мне он показался неудобным, поскольку:
- требует использования Berkeley DB,
- пароли хранятся в файле учётных записей в открытом виде,
- имя пользователя и пароль располагаются в файле учётных записей на отдельных строчках, что повышает риск ошибиться, пропустив строчку с паролем или логином.
Я воспользовался другим вариантом - PAM-модулем pwdfile. Он позволяет использовать файл паролей, подобный создаваемому общеизвестной утилитой htpasswd, без использования Berkley DB, с хэшированием паролей и с расположением имени пользователя и пароля в одной строчке файла.
Установка и настройка
Установим пакет vsftpd и PAM-модуль для аутентификации по файлу паролей:
# apt-get install vsftpd libpam-pwdfile
Добавим определение политики PAM, которая будет использоваться сервером vsftpd. Пропишем в файл /etc/pam.d/vsftpd.virtual следующее содержимое:
auth required pam_pwdfile.so pwdfile /etc/vsftpd/passwd
account required pam_permit.so
Пропишем в файл конфигурации /etc/vsftpd.conf следующие настройки:
# Работать в режиме демона - ждать подключений на TCP-порт 21
listen=YES
# Запрещаем анонимный доступ, пользователь должен авторизоваться
anonymous_enable=NO
# Разрешить подключаться не анонимным пользователям
local_enable=YES
# Указываем имя используемой политики PAM для не анонимных пользователей
pam_service_name=vsftpd.virtual
# Операции записи глобально не запрещены
write_enable=YES
# Все пользователи по умолчанию попадают в chroot
chroot_local_user=YES
# Указываем шаблон домашнего каталога пользователя
user_sub_token=$USER
local_root=/home/www/$USER
# Аутентифицированные пользователи будут работать с привилегиями системного пользователя ftp
guest_enable=YES
guest_username=ftp
# Скрывать информацию о владельце и группе владельцев файла
hide_ids=YES
# Виртуальные пользователи пользуются привилегиями локального пользователя,
# а не привилегиями анонимного пользователя
virtual_use_local_privs=YES
# В этом chroot vsftpd будет производить операции, не требующие доступа к файлам
secure_chroot_dir=/var/run/vsftpd/empty
# Использовать универсальное время
use_localtime=NO
# Вести через PAM сеансы подключений
session_support=YES
# Вести журнал скачиваний и закачек файлов
xferlog_enable=YES
# В случае активного соединения для данных со стороны сервера
# (при этом клиент пассивно ожидает подключения от сервера)
# соединение будет устанавливаться с TCP-порта 20
connect_from_port_20=YES
Осталось перезапустить vsftpd, чтобы его новые настройки вступили в силу:
# /etc/init.d/vsftpd restart
Файл паролей
Создание файла с первым пользователем и добавление нового пользователя, по замыслу разработчиков модуля PAM, должно выглядеть так:
# htpasswd -c /etc/vsftpd/passwd user1
# htpasswd /etc/vsftpd/passwd user2
С тех пор разработчики Apache заменили алгоритм хэширования паролей MD5 в утилите htpasswd на собственную версию алгоритма, использующего соль, перемешивание частей хэша и 1000 итераций MD5. Их версия алгоритма хэширования паролей получила название apr1.
Таким образом, утилита htpasswd оказалась непригодной для управления файлом паролей, который воспринимался бы PAM-модулем pwdfile. Вместо неё для генерации хэшей можно воспользоваться утилитой openssl, которая позволяет генерировать хэши по MD5 и по другим алгоритмам, включая апачевский apr1 и классический crypt:
$ openssl passwd -1
$ openssl passwd -crypt
$ openssl passwd -apr1
После генерации можно прописать полученный хэш через двоеточие после имени пользователя в файле /etc/vsftpd/passwd.
Вместо openssl можно воспользоваться утилитой mkpasswd, поставляемой в составе пакета whois. Она позволяет генерировать хэши паролей по алгоритмам DES (тот же crypt), MD5, SHA-256 и SHA-512. Сгенерировать нужный хэш можно одной из следующих команд:
$ mkpasswd -m md5
$ mkpasswd -m des
$ mkpasswd -m sha-256
$ mkpasswd -m sha-512
Настройка SSL
Сгенерировать сразу самоподписанный сертификат с ключом можно одной из следующих команд:
$ openssl req -x509 -nodes -days 3065 -newkey rsa:1024 -keyout /etc/vsftpd/vsftpd.pem -out /etc/vsftpd/vsftpd.pem
$ openssl req -new -x509 -nodes -days 365 -sha256 -newkey rsa:1024 -keyform PEM -keyout /etc/vsftpd/vsftpd.pem -outform PEM -out /etc/vsftpd/vsftpd.pem -subj '/O=Org name/CN=ftp.domain.tld/DC=tld/DC=domain/DC=ftp'
Для включения SSL необходимо вписать в файл /etc/vsftpd.conf следующие настройки:
# Включить использование SSL
ssl_enable=YES
# Указываем, какие конкретно версии SSL/TLS можно использовать
ssl_sslv2=NO
ssl_sslv3=NO
ssl_tlsv1=YES
# Обязательно использовать SSL/TLS для аутентифицированных клиентов
# для управляющего соединения и соединения для данных
force_local_logins_ssl=YES
force_local_data_ssl=YES
# Файл, содержащий сертификат и закрытый RSA-ключ
rsa_cert_file=/etc/vsftpd/vsftpd.pem
Осталось перезапустить FTP-сервер:
# /etc/init.d/vsftpd restart
Ссылки
- Возможности vsftpd и примеры их использования - обзор различных настроек vsftpd
- vsftpd - подробное описание различных вариантов настройки vsftpd
- Setup Virtual Users and Directories in VSFTPD - краткое HowTo, положенное в основу этой заметки
- PAM'ятка матерого юниксоида. Модули аутентификации на все случаи жизни - о модуле pwdfile на русском языке
- Virtual Users: Simple - тут написано о неработающем htpasswd