Настройка 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

Ссылки