Одной из первых статей в этом блоге была статья Debian, ftpd, vtpd, vsftpd. Very fast way. Восемь, мать его, лет назад!
Собственно, по той статье некоторое время назад настроить vsftpd в дебиане стало невозможно. Поэтому я решил написать новую. Формально статья могла бы стать одной из частей Большого мануала, но я очень не хочу, чтобы потом про мой мануал говорили «вот там советуют ftp настроить».
Нужно понимать, что сам по себе FTP в 2018 году уже не нужен. Разве что где-нибудь дома в закрытой одноранговой сети, но опять же — зачем? Этот протокол небезопасен (есть ftps, который по сути представляет из себя аналог https для http, но кто с этим будет заморачиваться?), авторизация — только по паролям, большинство клиентов подвержены атакам различных троянов (у sftp с этим попроще — таких троянов меньше, да и авторизация по ключам, опять же). Сам протокол ftp неплох, тот же webdav — хуже на практике.
Но, повторюсь, в рамках Мануала я вам настоятельно рекоммендую использовать для доступа «от людей к файлам» именно sftp (встроенный в openssh). FTP вам скорее понадобится для всякой автоматики, которая ничего другого не умеет. Вот прямо из горяченького — у одной из фирм поблизости есть 2 самописных программы для винды, которые синхронизируют файлы исключительно по FTP и камера в офисе, которая умеет заливать файлы на сервер только по FTP (к слову, ни камера, ни программы не умеют ftp over tls, shit). Для таких случаев vsftpd как раз и пригодится.
Что настраиваем:
- Пускаем пользователей из /etc/passwd (то есть с паролями от системы) по строгому списку.
- Всех пользователей чрутим в /home/user, в другие каталоги перейти будет невозможно.
- Пользователи могут писать только в каталог data/ (аналогично сделано в Большом мане и для sftp, если помните)
- Анонимные пользователи запрещены.
- ftp over tls закомментирован в примере, но если есть сертификат — включайте.
Погнали. Ставим vsftpd:
Создаём пользователя (подробности описаны в Большой мануал: часть 9. Cоздаём пользователей, группы и структуру каталогов на будущее). В примере ниже мы не заводим дополнительных каталогов (www, mod-tmp) внутри data/ , но если вы создадите пользователя по статье полностью — всё будет так же хорошо работать. Имя пользователя в примере ниже — bob.
Пользователя заводить нужно именно так, иначе vsftpd его не пустит. Группа secure добавлена во-первых для совместимости с мануалом, во-вторых, если вам хочется запретить пользователям в системе ходить в домашний каталог bob-a — то просто добавьте и их тоже в эту группу.
Чистим конфиг и качаем нормальный (ниже он будет описан). Если у вас есть ssl-сертификат — то редактируем конфиг, там внизу есть закомментированная секция про ssl — просто раскомментируйте эти строки. Только учтите, что включение ftps отключает возможность ходить через незашифрованнный ftp (и исправить это можно только запуском двух vsftpd с разными конфигами на разных портах). Так же почти все клиенты будут проверять валидность сертификата для указанного fqdn, так что сертификат нужен валидный (подойдет от letsencrypt).
Создаём файл /etc/vsftpd.users и добавляем в него пользователя bob. Именно здесь будет список пользователей, которых vsftpd будет пускать — у остальных он даже пароля спрашивать не будет, сразу отшивать:
В общем-то всё. Рестартим и можно пользоваться:
Сам конфиг:
listen=YES
# Отключаем анонимов
anonymous_enable=NO
# Включаем доступ системным пользователям.
local_enable=YES
# разрешаем в принципе какую-то запись через наш ftp
write_enable=YES
# Все файлы по ftp будут записаны с chmod 755
local_umask=022
# если в каталоге создать файл .message, то FTP-клиент при входе в этот каталог должен показать текст из этого файла (полезно класть инструкции для пользователей таким образом, но можно и выключить).
dirmessage_enable=YES
# включаем лог всех действий с файлами (в /var/log/vsftpd.log)
xferlog_enable=YES
# Необходимо для совместимости с некоторыми клиентами (что-то там заумное про исходящие коннекты от сервера к клиентам с двадцатого порта).
connect_from_port_20=YES
# сообщение-баннер, пользователь его увидит при подключении (до авторизации).
ftpd_banner=Welcome to ftp
# ограничиваем пользователя конкретным каталогом, он не сможет выйти из него выше по дереву файлов.
chroot_local_user=YES
# В нашем случае это будет каталог вида /home/bob
local_root=/home/$USER
# указываем переменную в конфиге, в которую передаётся имя пользователя (мы её уже использовали строкой выше).
user_sub_token=$USER
# включаем список пользователей, а следующей строкой сообщаем, что этот список _разрешает_ пользователям авторизоваться. Всем остальным будет запрещено.
userlist_enable=YES
userlist_deny=NO
# Путь до файла со списком пользователей.
userlist_file=/etc/vsftpd.users
# Включаем возможность использовать ls рекурсивно (и строить дерево файлов).
ls_recurse_enable=YES
# дальше ничего менять не стоит =) Но на самом деле эти настройки подробно описаны здесь - https://wiki.debian.org/ru/vsftpd/vsftpd.conf
secure_chroot_dir=/var/run/vsftpd
pam_service_name=vsftpd
rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
# Если у вас есть валидный ssl-сертификат, то расскоментируйте всё до конца.
## uncomment to enable FTP over TLS (aka FTPS):
## Beware, you probably need valid SSL-certificate for it.
## Путь до сертификата и ключа. Можно в одном файле, можно прямо в /etc/nginx, как в примере. Только не забудьте chmod 0600 на файл сделать.
#rsa_cert_file=/etc/nginx/ssl/cert.pem
#rsa_private_key_file=/etc/nginx/ssl/cert.pem
## Включаем FTPS (выключая при этом незашифрованный FTP).
#ssl_enable=YES
#allow_anon_ssl=NO
## По описанию эти опции по сути "редирект" с FTP на FTPS. На практике - не работают, ведь FTP отключен. Но для надежности оставляем.
#force_local_data_ssl=YES
#force_local_logins_ssl=YES
## Отключаем небезопасные протоколы SSL, оставляем только TLS.
#ssl_tlsv1=YES
#ssl_sslv2=NO
#ssl_sslv3=NO
## require_ssl_reuse нужно выставить в NO для совместимости с некоторыми ftp-клиентами. Если конкретно ваш ftp-клиент работает с YES - лучше включить, так безопаснее.
#require_ssl_reuse=NO
## Оставляем только алгоритмы шифрования с ключом 128+ бит.
#ssl_ciphers=HIGH
Комментариев пока нет.