Debian.pro/

Про Debian


Настраиваем FTP-сервер. Издание второе, улучшенное и дополненное: vsftpd.

Одной из первых статей в этом блоге была статья 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:

root@server:~# apt-get install vsftpd

Создаём пользователя (подробности описаны в Большой мануал: часть 9. Cоздаём пользователей, группы и структуру каталогов на будущее). В примере ниже мы не заводим дополнительных каталогов (www, mod-tmp) внутри data/ , но если вы создадите пользователя по статье полностью — всё будет так же хорошо работать. Имя пользователя в примере ниже — bob.

root@server:~# username=bob
root@server:~# grep -q secure: /etc/group || addgroup secure ; mkdir -p /home/${username}/data ; useradd -d /home/${username}/data -s /bin/bash ${username} ; chown root:root /home/${username} ; chmod 755 /home/${username} ; chown ${username}:secure /home/${username}/data ; chmod 705 /home/${username}/data ; passwd ${username}

Пользователя заводить нужно именно так, иначе vsftpd его не пустит. Группа secure добавлена во-первых для совместимости с мануалом, во-вторых, если вам хочется запретить пользователям в системе ходить в домашний каталог bob-a — то просто добавьте и их тоже в эту группу.
Чистим конфиг и качаем нормальный (ниже он будет описан). Если у вас есть ssl-сертификат — то редактируем конфиг, там внизу есть закомментированная секция про ssl — просто раскомментируйте эти строки. Только учтите, что включение ftps отключает возможность ходить через незашифрованнный ftp (и исправить это можно только запуском двух vsftpd с разными конфигами на разных портах). Так же почти все клиенты будут проверять валидность сертификата для указанного fqdn, так что сертификат нужен валидный (подойдет от letsencrypt).

root@server:~# mv /etc/vsftpd.conf /etc/vsftpd.conf.orig
root@server:~# wget -O /etc/vsftpd.conf https://debian.pro/files/conf/vsftpd.conf

Создаём файл /etc/vsftpd.users и добавляем в него пользователя bob. Именно здесь будет список пользователей, которых vsftpd будет пускать — у остальных он даже пароля спрашивать не будет, сразу отшивать:

root@server:~# echo "bob" >> /etc/vsftpd.users

В общем-то всё. Рестартим и можно пользоваться:

root@server:~# /etc/init.d/vsftpd restart

Сам конфиг:

# Указываем, что vsftpd сам принимает коннекты (а не через inetd/xinetd).
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

Комментариев пока нет.

Написать комментарий