VSFTPD c SSL или TLS под Gentoo Linux

Материал из AlexNook
Перейти к навигацииПерейти к поиску

Один из лучших ftp демонов под Gentoo. Не буду переписывать здесь то, что уже очень хорошо документированно. Вот необходимые ссылки:

  1. Статья на Gentoo Wiki (устарела).
  2. Статья на Gentoo official wiki
  3. man по vsftpd.

Установка и настройка

Для аутентификации я не использую виртуальных пользователей, а отталкиваюсь от реально существующих в системе (в /etc/passwd). Поэтому PAM поддержка при установке мне "вредит".

Устанавливаем следующие USE флаги:

Use Flags: ssl -pam -tcpd (?)

Устанавливаем прогргамму:

emerge net-ftp/vsftpd

Добавляем демон в автозапуск:

rc-update add vsftpd default

Пример кофигурационного файла

Привожу пример конфига. Все параметры прокомментированы. Но я отдельно дам комментарии к некоторым параметрам, на которые важно обратить внимание.

Из общего отмечу, файл нацелен на коннект двух видом пользователей: Анонимных (anonymous), которые мапятся сразу на системного пользователя FTP (можно кстати анонимный коннект срарзу под ним поднимать) И локальных пользователей в ОС, где установлен vsftpd, которые будут заходить под своим паролем.

Note: Пароль для анонима может быть пустым и не проверяется!

Так же коннекты настроены только по FTPS Explicit с TLS 1.2+

Анонимные пользователи НЕ могут заливать или менять файлы. Только читать (скачивать).

Локальные системные юзеры могут заливать файлы, в том числе в свою домашнюю директорию сразу.

Логирование ведётся в собственном формате для vsftpd

Локальные пользователи заперты в своей домашней директории и не могут гулять по файловой системе (впрочем как и анонимные)

File: /etc/vsftpd.conf
# allow anon users
anonymous_enable=YES
# allow anon without passwords
no_anon_password=YES
# This is the name of the user we use for handling anonymous FTP. The home directory of this user is the root of the anonymous FTP area.
ftp_username=ftp
# represents a directory which vsftpd will try to change into after an anonymous login. May be different from real home dir of FTP user in /etc/passwd
anon_root=/home/ftp/pub
# When enabled, anonymous users will only be allowed to download files which are world readable (chmod o+rx)
anon_world_readable_only=NO
# no uploads, mkdir and other for anonymous
anon_upload_enable=NO
anon_mkdir_write_enable=NO
anon_other_write_enable=NO

nopriv_user=ftp

# allow uploads
write_enable=YES

#Enable local system users to login
local_enable=YES
# lock local system users in home dir
chroot_local_user=YES
# allow users in the /etc/vsftpd.chroot_list not to be locked in chroot
chroot_list_enable=NO
# allow uploads in local system user's home dir
allow_writeable_chroot=YES

# allow users with /sbin/nologin shell to login
check_shell=NO


# no too detailed logs. Useful for debugging.
log_ftp_protocol=NO
# enable vsftpd logging
xferlog_enable=YES
# don't use xfer format for logs. Just custom vsftpd format
xferlog_std_format=NO
# where to store logs
vsftpd_log_file=/var/log/vsftpd.log

# The following error may occur on ftp clients with vsftpd 3.0.x: 500 OOPS: priv_sock_get_cmd OR DISCONNECTS
# This is caused by seccomp filter sanboxing. To workaround this issue, disable seccomp filter sanboxing:
seccomp_sandbox=NO

# The permissions with which uploaded files are created. Umasks are applied on top of this value.
file_open_mode=0666
# The value that the umask for file creation is set to for local users. NOTE! If you want to specify octal values, remember the "0" prefix otherwise the value will be treated as a base 10 integer!
local_umask=0077

max_clients=25
max_per_ip=5

# If enabled, vsftpd will run in standalone mode. This means that vsftpd must not be run from an inetd of some kind.
listen=YES
# If vsftpd is in standalone mode, this is the port it will listen on for incoming FTP connections.
listen_port=21

# This controls whether PORT style data connections use port 20 (ftp-data) on the server machine
connect_from_port_20=YES
# The port from which PORT style connections originate (as long as the poorly named connect_from_port_20 is enabled)
ftp_data_port=20


idle_session_timeout=600
data_connection_timeout=120



ftpd_banner=Welcome to Donik 24/7 FTP server
# If enabled, users of the FTP server can be shown messages when they first enter a new directory. By default, a directory is scanned for the file .message
dirmessage_enable=YES

# When enabled, this setting will allow the use of "ls -R". This is a minor security risk, because a ls -R at the top level of a large site may consume a lot of resources.
ls_recurse_enable=NO

#----------SSL---TLS-----------
ssl_enable=YES

#
implicit_ssl=NO
# If set to YES, anonymous users will be allowed to use secured SSL connections.
allow_anon_ssl=YES

# If activated, all anonymous logins are forced to use a secure SSL connection in order to send and receive data on data connections.
force_anon_data_ssl=YES
# If activated, all anonymous logins are forced to use a secure SSL connection in order to send the password.
force_anon_logins_ssl=YES

# If activated, all non-anonymous logins are forced to use a secure SSL connection in order to send and receive data on data connections.
force_local_data_ssl=YES
# If activated, all non-anonymous logins are forced to use a secure SSL connection in order to send the password.
force_local_logins_ssl=YES


#Default SSL ciphers used by vsftp are .DES-CBC3-SHA., considered deprecated and not used by newer versions of some FTP clients, like FileZilla
#which will fail the connection in this case. Using ssl_ciphers=HIGH fixes the problem.
ssl_ciphers=ECDHE-RSA-AES256-GCM-SHA384

# disallow TLSv1.0+TLSv1.1 protocols. But it does allow TLSv1.2 + TLSv1.3.
ssl_tlsv1=NO

rsa_cert_file=/etc/ssl/vsftpd/vsftpd.pem
rsa_private_key_file=/etc/ssl/vsftpd/vsftpd.pem



#Even WinSCP doesn't work with this option enabled (and it's enabled by default!)
require_ssl_reuse=NO


# If enabled, SSL data uploads are required to terminate via SSL, not an EOF on the socket.
# This option is required to be sure that an attacker did not terminate an upload prematurely with a faked TCP FIN. Unfortunately, it is not enabled by default because so few clients get it right.
strict_ssl_read_eof=YES

Особенности конфигурационного файла

Папка анонима по умолчанию

По умолчанию у меня в версии net-ftp/vsftpd-3.0.5-r1 портаж создал пользователя под которым осуществляются все анонимные коннекты с именем ftp и домашней директорией: /var/lib/ftp Ранее это была всегда папка /home/ftp Можно либо поменять домашнюю папку юзеру

usermod -d /home/ftp/pub ftp

Либо добавить строчку в конфиге

anon_root=/home/ftp/pub

Либо сделать всё сразу, чтобы все анонимные коннекты перекидывались в /home/ftp/pub

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

Почему-то по умолчанию активирован режим работы, когда анонимный пользователь видит только те папки и файлы, для которых установлены права на чтение\исполнение для "всех". В терминах ОС это выдаётся командой

chmod o+rx

Если же поступить грамотно и выдать права для анонимного пользователя, которым по факту является ftp или на крайняк для его группы, то файлы видны при анонимном коннекте не будут! То есть прав типа

chmod 550

будет НЕ достаточно. Анонимный коннект увидит пустоту.

Решает проблему вот эта настройка

anon_world_readable_only=NO

Запись в домашнюю директорию

Почему-то по умолчанию локальный юзер НЕ может заливать файлы в свою домашнюю директорию. Нужно создавать подпапку для заливки данных. Но это можно обойти настройкой allow_writeable_chroot=YES

Локальные пользователи БЕЗ шела

Для добавления пользователей, которые будут заходить по логину и паролю в свою домашнюю директорию по FTP, но реально НЕ смогут зайти на сервер по тому же SSH можно добавить пользователя БЕЗ доступа до шела. Например добавить пользователя andy в основную группу ftp, дополнительную группу users, с домашней папкой, где будут лежать видосики, и с отсутствием шелла /sbin/nologin

useradd -g ftp -s /sbin/nologin -d /home/ftp/andy_video -G users andy

После добавления такого пользователя в конфиг нужно добавить строчку:

allow_writeable_chroot=YES

Warning: Важно, чтобы vsftpd был собран БЕЗ поддержки PAM

Дисконнекты после загрузки файла

После каждой загрузки файла WinSCP разрывал коннект с ошибкой. При этом сам файл успевал загрузится до конца на сервер.

Решить проблему помогла настройка

seccomp_sandbox=NO

Добавляем пользователя со своими правами в своей папке

Этот ФТП демон оперирует пользователями, которые есть в системе. Для того, чтобы можно было авторизоваться под каким-то особым юзером, его надо сперва добавить. Например добавим пользователя external с основной группой ftp и дополнительной users

useradd -g ftp -s /sbin/nologin -d /home/ftp -G users external

Этот пользователь будет располагаться в домашней паке /home/ftp и за её пределы выйти не сможет (chroot jail).

Note: Можно выбрать другую любую папку типа /mnt/storage/data1/video/films

Теперь даём пароль этому юзеру:

passwd external

После чего нам нужно создать для него его папку и дать ему требуемые права, учитывая так же его первичную и вторичные группы. Например даём права на заливку файлов в upload для пользователя external и права на чтение для группы ftp, куда он так же входит:

chown external:ftp -R /home/ftp/upload
chmod 750 -R /home/ftp/upload

Раздел конфига Vsftpd для настройки SSL или TLS под Gentoo

Доступ возможен только по ftpS для всех пользователей и только с использованием современных безопасных методов передачи данных и авторизации.

Сперва нам надо создать сертификаты на сервере. Создаём папку для их хранения:

mkdir /etc/ssl/vsftpd

Далее собственно генерируем их в этой папке:

openssl req -x509 -nodes -days 3650 -newkey rsa:1024 -keyout /etc/ssl/vsftpd/vsftpd.pem -out /etc/ssl/vsftpd/vsftpd.pemless

Далее приведу с коментариями кусочек конфигурационного файла по настройке безопастного доступа к файлам по протоколам FTP + Explicit TLS v.1.2, v.1.3

Note: Без SSL любых версий и устаревших TLS 1 и 1.1


Используется безопасный на текущий момент ssl_ciphers.

nano /etc/vsftpd.conf


File: /etc/vsftpd.conf
#----------SSL---TLS-----------
ssl_enable=YES

#
implicit_ssl=NO
# If set to YES, anonymous users will be allowed to use secured SSL connections.
allow_anon_ssl=YES

# If activated, all anonymous logins are forced to use a secure SSL connection in order to send and receive data on data connections.
force_anon_data_ssl=YES
# If activated, all anonymous logins are forced to use a secure SSL connection in order to send the password.
force_anon_logins_ssl=YES

# If activated, all non-anonymous logins are forced to use a secure SSL connection in order to send and receive data on data connections.
force_local_data_ssl=YES
# If activated, all non-anonymous logins are forced to use a secure SSL connection in order to send the password.
force_local_logins_ssl=YES


#Default SSL ciphers used by vsftp are .DES-CBC3-SHA., considered deprecated and not used by newer versions of some FTP clients, like FileZilla
#which will fail the connection in this case. Using ssl_ciphers=HIGH fixes the problem.
ssl_ciphers=ECDHE-RSA-AES256-GCM-SHA384

# disallow TLSv1.0+TLSv1.1 protocols. But it does allow TLSv1.2 + TLSv1.3.
ssl_tlsv1=NO

rsa_cert_file=/etc/ssl/vsftpd/vsftpd.pem
rsa_private_key_file=/etc/ssl/vsftpd/vsftpd.pem



#Even WinSCP doesn't work with this option enabled (and it's enabled by default!)
require_ssl_reuse=NO


# If enabled, SSL data uploads are required to terminate via SSL, not an EOF on the socket.
# This option is required to be sure that an attacker did not terminate an upload prematurely with a faked TCP FIN. Unfortunately, it is not enabled by default because so few clients get it right.
strict_ssl_read_eof=YES