Используя ProFTPd настроим доступ по FTP к сайтам на сервере VDS под управлением CentOS 7. Создадим файловую базу пользователей для авторизации с правами от Nginx. Применим подключение с использованием сертификата для TLS.

Введение

Периодически возникает необходимость  давать доступ к файлам сайта для веб разработчиков или других пользователей. Так как используется VDS сервер с настроенным функционалом на базе Nginx, то все права на файлы при добавлении и изменении должны быть как у указанного сервиса. Вначале пытался настроить vsftpd но функционал позволяет настроить только права на редактируемые файлы чтобы они оставались такие как были но вот все новые были с правами пользователя. Поэтапно опишу все действия которые привели меня к желаемому результату.

Более подробно вы можете ознакомиться с документацией по настройке сервера FTP на сайте разработчика ProFTPd.
Сайт разработчика

Предварительная подготовка CentOS 7

Подключим репозиторий Еpel:

yum -y install epel-release

Установим необходимые пакеты для работы:

yum -y install mc openssl net-tools htop yum-utils

Отключим SELinux:

mcedit /etc/sysconfig/selinux
= необходимые изменения =
SELINUX=disabled

Чтобы изменения вступили в силу, необходимо перезагрузить сервер  или указать команду, чтобы параметры применялись без перезагрузки:

setenforce 0

Настройка FirewallD

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

Проверим наличие firewalld:

systemctl status firewalld
= вывод команды =
Unit firewalld.service could not be found.

В минимальной версии CentOS Firewalld не установлен.

Установим FirewallD вез вопросов командой:

yum -y install firewalld

Добавим в автозагрузку и запустим:

systemctl enable firewalld
systemctl start firewalld

Проверим статус короткой командой:

firewall-cmd --state
= вывод команды =
running

Всё хорошо. Можно приступать к настройке доступа к серверу FTP.

Открытие портов для работы по ftp

Добавим порты в FirewallD:

firewall-cmd --permanent --zone=public --add-service=ftp
firewall-cmd --permanent --zone=public --add-port=49000-55000/tcp

Перезагрузим правила FirewallD:

firewall-cmd --reload
= вывод команды =
success

Проверим:

firewall-cmd --permanent --list-all
 public
 target: default
 icmp-block-inversion: no
 interfaces:
 sources:
 services: dhcpv6-client ftp ssh
 ports: 49000-55000/tcp
 protocols:
 masquerade: no
 forward-ports:
 sourceports:
 icmp-blocks:
 rich rules:

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

Установим сервер ftp:

yum install proftpd proftpd-utils

Создание файловой базы пользователей ProFTPd

Узнаем ID пользователя и группы Nginx, так как именно под этими данными и должны работать наши пользователи:

cat /etc/passwd
= вывод команды. Необходимая информация =
 nginx:x:996:994:nginx user:/var/cache/nginx:/sbin/nologin

Создадим файл /etc/ftpd.passwd и добавим туда пользователя sevo44 c id пользователя 996 uid и группой 994 gid и домашним каталогом /web/sites/sevo44.ru/www

ftpasswd --passwd --file=/etc/ftpd.passwd --name=sevo44 --uid=996 --gid=994 --home=/web/sites/sevo44.ru/www --shell=/bin/false
 = вывод команды =
 ftpasswd: using alternate file: /etc/ftpd.passwd
 ftpasswd: creating passwd entry for user sevo44

ftpasswd: /bin/false is not among the valid system shells. Use of
 ftpasswd: "RequireValidShell off" may be required, and the PAM
 ftpasswd: module configuration may need to be adjusted.
 Password: -- вводим пароль
 Re-type password: -- повторяем пароль

ftpasswd: entry created

Откроем и посмотрим файл базы пользователей:

cat /etc/ftpd.passwd
= вывод команды =
 sevo44:$1$HpmDikdn$.3vuwu56cjTvdg8qtrsy//:996:994::/web/sites/sevo44.ru/www:/bin/false

Видим нашего добавленного пользователя. Для удаления пользователя достаточно закоментировать или удалить строку.

Сменить пароль можно выполнив команду:

ftpasswd --passwd --name=sevo44 --change-password

Включение Ban листа и возможность подключения по TLS

Включим необходимые значения указные в главном файле конфигурации сервиса:

mcedit /etc/sysconfig/proftpd
= Необходимая информация для размещения =
PROFTPD_OPTIONS="-DDYNAMIC_BAN_LISTS -DTLS"

Если параметр -DTLS включен то без наличия правильно созданного сертификата сервис не стартует. В случае работы без TLS просто не указывайте параметр.

Получение сертификата для TLS подключения

Для работы по TLS необходимо создать сертификат. Создадим сертификат на 365 дней:

openssl req -new -x509 -days 365 -nodes -out \
/etc/pki/tls/certs/proftpd.sert.pem -keyout \
/etc/pki/tls/certs/proftpd.key.pem
= вывод команды с пояснениями =
 Generating a 2048 bit RSA private key
 ................................+++
 .........+++
 writing new private key to '/etc/pki/tls/certs/proftpd.key.pem' -- Путь где будет находится ключ
 -----
 You are about to be asked to enter information that will be incorporated
 into your certificate request.
 What you are about to enter is what is called a Distinguished Name or a DN.
 There are quite a few fields but you can leave some blank
 For some fields there will be a default value,
 If you enter '.', the field will be left blank.
 -----
 Country Name (2 letter code) [XX]:RU -- Буквенный код Страны
 State or Province Name (full name) []:Kostroma state -- Область проживания
 Locality Name (eg, city) [Default City]:Kostroma -- Город
 Organization Name (eg, company) [Default Company Ltd]:SEVO44 -- Название организации
 Organizational Unit Name (eg, section) []: -- Название отдела в организации
 Common Name (eg, your name or your server's hostname) []:sevo44.ru -- Доменное имя сервера
 Email Address []:info@sevo44.ru -- адрес электронной почты

После получения перейдите в папку указанную в пути и убедитесь что сертификаты созданы и имеют не нулевой размер! При настройке я неправильно указывал команду создания сертификата и они создавались с нулевым размером.

Редактирование proftpd.conf

Файл хорошо задокументирован и имеет большое количество настроек. В файле будут указанны параметры которые необходимы для наших требований.

Сделаем оригинал копии и откроем главный файл настройки сервиса:

cp /etc/proftpd.conf /etc/proftpd.conf.orig
mcedit /etc/proftpd.conf
= вывод команды с необходимыми комментариями =
ServerName "FTP server"
ServerIdent on "FTP Server ready."
ServerAdmin root@localhost
DefaultServer on
# По умолчанию используется 21 в случае замены используйте параметр ниже
# Внимание! Не забудьте дать доступ!
#Port 21111

# Изолировать каждого пользователя FTP, в своем домашнем каталоге
DefaultRoot ~

# Отключили и добавили строки для того чтобы шла авторизация только пользователей с файла /etc/ftpd.passwd
#AuthPAMConfig proftpd
#AuthOrder mod_auth_pam.c* mod_auth_unix.c
AuthOrder mod_auth_file.c
#Модуль авторизации по файлу грузится сам и включать его не надо 
#LoadModule mod_auth_file.c
AuthUserFile /etc/ftpd.passwd
RequireValidShell off
AuthPAM off
#RootLogin off
#Диапазон пассивных портов необходимых для работы
PassivePorts 49000 55000

# Не делать обратного DNS-запроса
UseReverseDNS off

# Для предотвращения DOS-атак, установить максимальное количество дочерних процессов
# до 20. Если вам нужно, чтобы позволить более 20 одновременных подключений
# на один раз, просто увеличьте это значение. Обратите внимание, что это работает только
# в автономном режиме, в то inetd режим следует использовать в inetd сервера
# что позволяет ограничить максимальное количество процессов на обслуживание
# (например, xinetd)
MaxInstances 20

# Отключить функция sendfile по умолчанию, так как это нарушает отображение скорости загрузки в
# ftptop и ftpwho
UseSendfile off

# Настройки видов записи и типы логирования
# Define the log formats
LogFormat default "%h %u %t \"%r\" %s %b"
LogFormat auth "%v [%P] %h %t \"%r\" %s"
ExtendedLog /var/log/proftpd/all.log ALL default
ExtendedLog /var/log/proftpd/access.log READ,WRITE default
ExtendedLog /var/log/proftpd/auth.log AUTH auth
ServerLog /var/log/proftpd/server.log
SystemLog /var/log/proftpd/system.log
TransferLog /var/log/proftpd/transfer.log
DebugLevel 9

# Обеспечить внешнюю кэш SSL-сессии с использованием разделяемой памяти
# (contrib/mod_tls_shmcache.html)
LoadModule mod_tls_shmcache.c

# TLS
#LoadModule mod_tls.c
<IfDefine TLS>
TLSEngine on
# В случае ON подключиться можно только по TLS
TLSRequired on
TLSRSACertificateFile /etc/pki/tls/certs/proftpd.sert.pem
TLSRSACertificateKeyFile /etc/pki/tls/certs/proftpd.key.pem
TLSCipherSuite ALL:!ADH:!DES
TLSOptions NoCertRequest
TLSVerifyClient off
#TLSRenegotiate ctrl 3600 data 512000 required off timeout 300
TLSLog /var/log/proftpd/tls.log
<IfModule mod_tls_shmcache.c>
TLSSessionCache shm:/file=/var/run/proftpd/sesscache
</IfModule>
</IfDefine>

# Динамические списки блокировки
# Включение параметром PROFTPD_OPTIONS=-DDYNAMIC_BAN_LISTS 
#в /etc/sysconfig/proftpd
<IfDefine DYNAMIC_BAN_LISTS>
LoadModule mod_ban.c
BanEngine on
BanLog /var/log/proftpd/ban.log
BanTable /var/run/proftpd/ban.tab

# Если же клиент достигает предела MaxLoginAttempts 2 раза
# в течение 10 минут, автоматически добавить запрет для клиента, что
# истекает через один час.
BanOnEvent MaxLoginAttempts 2/00:10:00 01:00:00

# Информировать пользователя о том, что он попал в бан
BanMessage "Машина %a иннна для доступа по FTP"

# Разрешить FTP и админ вручную добавить/удалить щелбаны
BanControlsACLs all allow user ftpadm
</IfDefine>

# Установить сетевые специфические "качества обслуживания" (QoS) и биты на пакеты, используемые
# на сервере (contrib/mod_qos.html)
<IfDefine QOS>
LoadModule mod_qos.c
# RFC791 TOS parameter compatibility
QoSOptions dataqos throughput ctrlqos lowdelay
# For a DSCP environment (may require tweaking)
#QoSOptions dataqos CS2 ctrlqos AF41
</IfDefine>

# Глобальной конфигурации - конфигурации, общие для Настройки сервера и виртуальных Хостов
<Global>

#Значение umask 022-хороший стандарт umask, чтобы предотвратить новые каталоги и файлы
# от группы и для
Umask 022

# Разрешить пользователям перезаписать файлы, а также изменять разрешения
AllowOverwrite yes
<Limit ALL SITE_CHMOD>
AllowAll
</Limit>
</Global>

Управление сервером ProFTPd

Добавим в автозагрузку и запустим:

systemctl enable proftpd
systemctl start proftpd

Проверим статус:

systemctl status proftpd
 ● prоftpd.service - PrоFTPD FTP Server
 Loaded: loaded (/usr/lib/systemd/system/prоftpd.service; enabled; vendor preset: disabled)
 Active: active (running) since Вт 2017-04-25 21:18:12 MSK; 4min 24s ago
 Main PID: 23220 (prоftpd)
 CGroup: /system.slice/prоftpd.service
 └─23220 prоftpd: (accepting connections)

апр 25 21:18:12 centos7.sevo44.loc systemd[1]: Starting PrоFTPD FTP Server...
 апр 25 21:18:12 centos7.sevo44.loc systemd[1]: Started PrоFTPD FTP Server.

Сервис в автозагрузке и никаких ошибок нет.

Проверим порт на котором работает сервис:

netstat -tulpn | grep proftpd
 tcp6 0 0 :::21 :::* LISTEN 2658/prоftpd: (acce

Консольные утилиты статуса ProFTPd

В консоли можно вывести просмотр онлайн статистики выполнив команду:

ftptop

Просмотр количества подключений выполняется командой:

 ftpwho

Логи сервиса

Все логи вы можете посмотреть в папке /var/log/proftpd. Ротация логов работает но вы можете это проверить и настроить на примере раздела «Ротация логов сайта» в статье » Virtual Hosts на web-сервере NGINX»

Подключение по FTP c использованием TLS

Для подключения я использую программу FileZilla и приведу скриншоты настройки моего подключения.

Настройка:

Настройка FileZilla для TLS ProFTPd

 

Информация TLS:

Информация о сертификате для TLS

Вывод

Произведя данную настройку мы полностью сделали разграничение доступа к разным сайтам на сервере. Обеспечили надежное подключение используя сертификат и ведение всей статистики работы с файлами.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Хотите сказать денежное спасибо? Подарите денежку!