Статья рассказывает о том, как установить vsftpd в операционной системе CentOS 7 с включенной системой контроля доступа SELinux и настроить аутентификацию посредством виртуальных пользователей
В приводимых далее шагах на все создаваемые папки и файлы по умолчанию устанавливаются права "755", а в качестве их владельцев назначаются пользователь и группа "root"
- устанавливаем пакет vsftpd
- yum install vsftpd
- устанавливаем пакет libdb (Berkeley DB), который будет использоваться для создания базы данных с учетными данными пользователей FTP
- yum install libdb
- устанавливаем пакет с утилитами для работы с SELinux
- yum install policycoreutils-python
- в папке /etc/vsftpd удаляем все файлы, кроме vsftpd.conf
- заменяем содержимое файла /etc/vsftpd/vsftpd.conf следующим
-
# включаем прослушивание входящих подключений на IPv4-интерфейсе
listen=YES
# включаем создание подключений для передачи данных через порт 20
connect_from_port_20=YES
# указываем имя PAM-сервиса для проверки подлинности
pam_service_name=vsftpd
# указываем учетную запись, которую vsftpd может использовать в качестве непривилегированной
nopriv_user=vsftpd
# запрещаем анонимные подключения
anonymous_enable=NO
# разрешаем использование локальных и виртуальных пользователей
local_enable=YES
# включаем использование виртуальными пользователями прав локальных пользователей, а не анонимных
virtual_use_local_privs=YES
# включаем параметр, благодаря которому все неанонимные подключения будут считаться "гостевыми"
guest_enable=YES
# указываем имя пользователя, от имени которого будут выполняться все "гостевые" подключения
guest_username=vsftpd
# включаем использования chroot для виртуальных пользователей
chroot_local_user=YES
# задаем имя папки, которая будет использоваться для окружения chroot
secure_chroot_dir=/var/vsftpd/chroot
# задаем переменную с именем виртуального пользователя
user_sub_token=$USER
# указываем корневую папку виртуального пользователя
local_root=/var/vsftpd/users/$USER
# включаем параметр, благодаря которому в FTP-клиентах вместо имен пользователей и групп будет отображаться значение "ftp"
hide_ids=YES
# разрешаем любые FTP-команды для записи данных
write_enable=YES
# включаем журналирование скачиваний и загрузок
xferlog_enable=YES - создаем файл /etc/vsftpd/credentials.txt с учетными данными пользователей FTP
-
user1
password1 - Замечание: файл должен заканчиваться пустой строкой
- создаем файл базы данных /etc/vsftpd/credentials.db с учетными данными пользователей FTP
- db_load -T -t hash -f /etc/vsftpd/credentials.txt /etc/vsftpd/credentials.db
- Замечание: просмотреть содержимое файла базы данных можно командой db_dump -p /etc/vsftpd/credentials.db
- настраиваем права доступа к файлам в папке /etc/vsftpd
- chmod -R 400 /etc/vsftpd/*
- заменяем содержимое файла /etc/pam.d/vsftpd следующим
-
#%PAM-1.0
auth required pam_userdb.so db=/etc/vsftpd/credentials
account required pam_userdb.so db=/etc/vsftpd/credentials
session required pam_loginuid.so - создаем пользователя и группу vsftpd
-
useradd -s /sbin/nologin vsftpd
passwd vsftpd - создаем папку для хранения данных пользователей "/var/vsftpd/users", а также папку для окружения chroot "/var/vsftpd/chroot"
- mkdir /var/vsftpd /var/vsftpd/users /var/vsftpd/chroot
- создаем папку /var/vsftpd/users/user1, которая будет использоваться как корневая папка в chroot для пользователя user1, а также папку /var/vsftpd/users/user1/data, в которой будут храниться данные пользователя user1
- mkdir /var/vsftpd/users/user1 /var/vsftpd/users/user1/data
- Замечание: папка /var/vsftpd/users/user1/data необходима потому, что пользователь vsftpd не должен иметь права записи на корневую папку chroot пользователя user1, т.е. на папку /var/vsftpd/users/user1
- настраиваем владельца папки /var/vsftpd/users/user1/data и права доступа к ней
-
chown vsftpd:vsftpd /var/vsftpd/users/user1/data
chmod 700 /var/vsftpd/users/user1/data - определяем текущий контекст SELinux содержимого папки /var/vsftpd/users
- ls -ldZ /var/vsftpd/users
- добавляем в политику SELinux информацию о новом контексте содержимого папки /var/vsftpd/users
- semanage fcontext -a -t public_content_rw_t "/var/vsftpd/users(/.*)?"
- устанавливаем контекст содержимого папки /var/vsftpd/users
- restorecon -F -R -v /var/vsftpd/users
- включаем переключатель SELinux с именем "ftpd_anon_write"
- setsebool -P ftpd_anon_write on
- Замечание: просмотреть состояние переключателей SELinux, имеющих отношение к FTP, можно командой getsebool -a | grep ftp
- включаем автоматический запуск vsftpd при старте системы
- systemctl enable vsftpd
- запускаем vsftpd
- service vsftpd start
Замечание: можно настроить подключение к папкам с данными пользователей соответствующих SMB-ресурсов (как это сделать, рассказывается здесь); при этом также нужно будет включить переключатель SELinux с именем "ftpd_use_cifs"