FTP сервер vsftpd с виртуальными пользователями на Centos 7

Подключение FTP будет по 21 порту по протоколу SSL

Установка vsftpd:

yum install vsftpd

Установка openssl:

yum install openssl

Очистить конфиги которые по умолчанию:

rm -rf /etc/vsftpd/*

Создать файл /etc/vsftpd/vsftpd.conf и приводим к:

# Запуск сервера в режиме службы
listen=YES

# Работа в фоновом режиме
background=YES

# Разрешить подключаться виртуальным пользователям
guest_enable=YES

# Системный пользователь от имени котрого подключаются виртуальные
guest_username=ftp

# Виртуальные пользователи имеют те же привелегии, что и локальные
virtual_use_local_privs=YES

# Автоматическое назначение домашнего каталога для виртуальных пользователей
user_sub_token=$USER
local_root=/ftp/$USER

# Имя pam сервиса для vsftpd
pam_service_name=vsftpd

# Входящие соединения контроллируются через tcp_wrappers
tcp_wrappers=YES

# Запрещает подключение анонимных пользователей
anonymous_enable=NO

# Каталог, куда будут попадать анонимные пользователи, если они разрешены
#anon_root=/ftp

# Разрешает вход для локальных пользователей
local_enable=YES

# Разрешены команды на запись и изменение
write_enable=YES

# Указывает исходящим с сервера соединениям использовать 20-й порт
connect_from_port_20=YES

# Логирование всех действий на сервере
xferlog_enable=YES

# Путь к лог-файлу
xferlog_file=/var/log/vsftpd.log

# Включение специальных ftp команд, некоторые клиенты без этого могут зависать
async_abor_enable=YES

# Локальные пользователи по-умолчанию не могут выходить за пределы своего домашнего каталога
chroot_local_user=YES

# Разрешить список пользователей, которые могут выходить за пределы домашнего каталога
chroot_list_enable=YES

# Список пользователей, которым разрешен выход из домашнего каталога
chroot_list_file=/etc/vsftpd/chroot_list

# Разрешить запись в корень chroot каталога пользователя
allow_writeable_chroot=YES

# Директория с настройками пользователей
user_config_dir=/etc/vsftpd/users

# Показывать файлы, начинающиеся с точки
force_dot_files=YES

# Маска прав доступа к создаваемым файлам
local_umask=022

# Порты для пассивного режима работы
pasv_min_port=40000
pasv_max_port=50000

# SSL
rsa_cert_file=/ssl/certificate.pem
rsa_private_key_file=/ssl/private.pem
ssl_enable=YES

# To force local users to use SSL
force_local_data_ssl=YES
force_local_logins_ssl=YES

# The following option depend of the authentication mode you require
# for TLS Version 1
ssl_tlsv1=YES
# for SSL Version 2
ssl_sslv2=YES
# for SSL Version 3
ssl_sslv3=YES

# Uncomment ssl_request_cert option if SSL/TLS connection is used by IBM's zOS ftp client
# read man vsftpd.conf for further information
ssl_request_cert=no
require_ssl_reuse=no

Ссылки на сертификаты:
rsa_cert_file=/ssl/certificate.pem
rsa_private_key_file=/ssl/private.pem

 

Открыть порты в firewall:

firewall-cmd --permanent --add-port=21/tcp
firewall-cmd --permanent --add-port=40000-50000/tcp
firewall-cmd --reload

Открыть порты на iptables:

iptables -t filter -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 40000:50000 -j ACCEPT
service iptables save

 

Установить пакет compat-db:

yum install compat-db

На всякий случай сохраните оригинальный pam.d файл

cp /etc/pam.d/vsftpd /etc/pam.d/vsftpd.orig

Открыть на редактирование /etc/pam.d/vsftpd и привести к:

#%PAM-1.0
session    optional     pam_keyinit.so    force revoke
auth required pam_userdb.so db=/etc/vsftpd/virt_users
account required pam_userdb.so db=/etc/vsftpd/virt_users
session required pam_loginuid.so

Перезапустить vsftpd:

systemctl restart vsftpd

 

Добавление пользователя

Добавить в файл /etc/vsftpd/virt_users:

user1
password1
user2
password2

Генерируем локальное хранилище учеток:

db_load -T -t hash -f /etc/vsftpd/virt_users /etc/vsftpd/virt_users.db

Добавить в файл /etc/vsftpd/chroot_list:

user1
user2

Создать файлы настроек для пользователей:

Для пользователя user1 — /etc/vsftpd/users/user1:

guest_username=demo
local_root=/home/demo/demo.site.ru/public

Для пользователя user2 — /etc/vsftpd/users/user2:

guest_username=userman
local_root=/home/userman/project

Таким образом пользователь «user1» будет работать под системным пользователем «demo» и начальная директория: /home/demo/demo.site.ru/public

Пользователь «user2» будет работать под системным пользователем «userman» и начальная директория: /home/userman/project

 

Ошибка авторизации виртуальных пользователей

Wed May 11 09:13:10 2022 [pid 30955] [username] FAIL LOGIN: Client "127.127.127.127"

В моем случае помогло:
у файла /etc/vsftpd/virt_users изменить формат конца строк с CR LF на LF
и заново генерируем локальное хранилище учеток:

db_load -T -t hash -f /etc/vsftpd/virt_users /etc/vsftpd/virt_users.db