VSFTPD c SSL или TLS под Gentoo Linux
Один из лучших ftp демонов под Gentoo. Не буду переписывать здесь то, что уже очень хорошо документированно. Вот необходимые ссылки:
Установка и настройка
Для аутентификации я не использую виртуальных пользователей, а отталкиваюсь от реально существующих в системе (в /etc/passwd). Поэтому PAM поддержка при установке мне "вредит".
Устанавливаем следующие USE флаги:
Use Flags: ssl -pam -tcpd (?)
Устанавливаем прогргамму:
Добавляем демон в автозапуск:
Пример кофигурационного файла
Привожу пример конфига. Все параметры прокомментированы. Но я отдельно дам комментарии к некоторым параметрам, на которые важно обратить внимание.
# 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 Можно либо поменять домашнюю папку юзеру
Либо добавить строчку в конфиге
anon_root=/home/ftp/pub
Либо сделать всё сразу, чтобы все анонимные коннекты перекидывались в /home/ftp/pub
Настройка прав на файлы и папки для анонимного пользователя
Почему-то по умолчанию активирован режим работы, когда анонимный пользователь видит только те папки и файлы, для которых установлены права на чтение\исполнение для "всех". В терминах ОС это выдаётся командой
Если же поступить грамотно и выдать права для анонимного пользователя, которым по факту является ftp или на крайняк для его группы, то файлы видны при анонимном коннекте не будут! То есть прав типа
будет НЕ достаточно. Анонимный коннект увидит пустоту.
Решает проблему вот эта настройка
anon_world_readable_only=NO
Добавляем пользователя со своими правами в своей папке
Этот ФТП демон оперирует пользователями, которые есть в системе. Для того, чтобы можно было авторизоваться под каким-то особым юзером, его надо сперва добавить. Например добавим пользователя external с основной группой ftp и дополнительной users
Этот пользователь будет располагаться в домашней паке /home/ftp и за её пределы выйти не сможет (chroot jail). Теперь даём пароль этому юзеру:
После чего нам нужно создать для него его папку и дать ему требуемые права, учитывая так же его первичную и вторичные группы. Например:
Раздел конфига Vsftpd для настройки SSL или TLS под Gentoo
Сперва нам надо создать сертификаты на сервере. Создаём папку для их хранения:
Далее собственно генерируем их в этой папке:
Далее приведу с коментариями кусочек конфигурационного файла по настройке безопастного доступа к файлам по протоколам FTP + Explicit TLS v.1 или FTP + Explicit SSL v.3.
#----------SSL---TLS-----------
#enable implicit secure connections
ssl_enable=yes
implicit_ssl=no
#allow anonymous to connect to your server using secure connection
allow_anon_ssl=yes
#allow anonymous users not to use ssl during logins and transfering data
force_anon_data_ssl=no
force_anon_logins_ssl=no
#allow users identificating by user name and password login and transfering without using ssl connections
# you can force such kind of users to use ssl during login and transfering procedures
force_local_data_ssl=no
force_local_logins_ssl=no
#use only ssl3 and tls1 for securities reasons
ssl_sslv3=yes
ssl_tlsv1=yes
#paths to your certificates for encryption
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!), so it's a good reason to disable it
require_ssl_reuse=no
#work but i'm afraid of it =). It's a good idea for securities reasons but only a few clients support this feature
#strict_ssl_read_eof=yes
#doesn't work with WinSCP
#require_cert=yes