В статье настраиваем 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