Настройка VSFTPD с PAM и виртуальными пользователями

В статье настраиваем FTP-доступ к www-root директории веб-сервера (как в старые добрые времена) с иcпользованием демона VSFTPD и хранением виртуальных пользователей для работы через pam_pwdfile.so

Сделано допущение, что данный сервер будет находиться в локальном контуре, поэтому не настраивается ни SSL, ни firewall, ни пассивный режим FTP

Дано:

  • Ubuntu server 24.04
  • доступ к директории /var/www/site1/
  • будем использовать centos-стиль, чтоб не разбрасывать файлы по /etc
  • пользователя создадим site1
  • все виртуальные пользователи будут матчиться на системного пользователя ftp. То есть залитые файлы будут принадлежать пользователю ftp. Если к каталогу обращается другой сервис (например веб-сервер) и ему нужна запись — нужно сопоставить другого пользователя: либо в guest_username заменить ftp на нужного юзера (например www-data), либо нужна общая группа с setgid-битом на каталоге.

Устанавливаем пакеты

apt install vsftpd libpam-pwdfile openssl

По умолчанию в Ubuntu конфигурационный файл находится по пути /etc/vsftpd.conf. По причине того, что будем создавать еще несколько файлов — делаем директорию для хранения всех конфигов (создаем подкаталог users, заодно и корневой), переносим туда конфиг и делаем симлинк по новому адресу

mkdir -p /etc/vsftpd/users

mv /etc/vsftpd.conf /etc/vsftpd/

ln -s /etc/vsftpd/vsftpd.conf /etc/vsftpd.conf

Приводим основной конфиг к такому виду (правим дефолтный/раскомменчиваем-дописываем, создаем новый — вообще всё равно):

listen=YES
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
use_localtime=YES
xferlog_enable=YES
connect_from_port_20=YES
chroot_local_user=YES
secure_chroot_dir=/var/run/vsftpd/empty
# Ниже параметры для работы с виртуальными пользователями
# Включаем PAM
pam_service_name=vsftpd
# Выключаем userlist, т.к. всё через PAM
userlist_enable=NO
# После успешной аутентификации все виртуальные пользователи мапятся на системного пользователя ftp
guest_enable=YES
guest_username=ftp
# Дать виртуальным пользователям локальные привилегии
virtual_use_local_privs=YES
# директория с конфигами юзеров, аналогично ccd в OpenVPN
user_config_dir=/etc/vsftpd/users
allow_writeable_chroot=YES

Далее создаем в подкаталоге users файл с именем пользователя site1 с содержимым

local_root=/var/www/site1

Теперь генерируем хеш пароля

openssl passwd -6 спросит два раза пароль

Теперь создаем файл /etc/vsftpd/ftpd.passwd с правами 0600 и строкой username:hash

site1:$6$HG27FiX61.BGIx9M$GN4m7JFOKWZRQM3nK7C.7C./jOaajUkixGjfoWiimGoWzd20mDzAZM2qfzfCtCDVq4M3fBvcYQBzw3X7puhpo/

Если нужно много пользователей: добавляем пару пользователь:хеш в вышеупомянутый файл, а в директории users создаем конфиг пользователя, где прописываем нужный каталог для расшаривания через параметр local_root

Теперь необходимо настроить PAM. Стандартные настройки файла /etc/pam.d/vsftpd совершенно не подходят, комментируем все строки и дописываем в конец файла

auth required pam_pwdfile.so pwdfile=/etc/vsftpd/ftpd.passwd
account required pam_permit.so

Перезагружаем vsftpd
systemctl restart vsftpd

Если ничего не упало — можно подключиться FTP-клиентом под пользователем site1 и паролем Passwd, должны увидеть содержимое каталога /var/www/site1

Если что — логи PAM смотреть через journalctl или в /var/log/auth.log. Логи самого FTP-сервера пишутся в /var/log/vsftpd.log

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *