Используя ProFTPd настроим доступ по FTP к сайтам на сервере VDS под управлением CentOS 7. Создадим файловую базу пользователей для авторизации с правами от Nginx. Применим подключение с использованием сертификата для TLS.
Содержание:
- 1 Введение
- 2 Подготовка CentOS 7
- 3 Настройка FirewallD
- 4 Установка и настройка ProFTPd
- 4.1 Создание файловой базы пользователей ProFTPd
- 4.2 Включение Ban листа и возможность подключения по TLS
- 4.3 Получение сертификата для TLS подключения
- 4.4 Редактирование proftpd.conf
- 4.5 Управление сервером ProFTPd
- 4.6 Консольные утилиты статуса ProFTPd
- 4.7 Логи сервиса
- 4.8 Подключение по FTP c использованием TLS
- 5 Вывод
Введение
Периодически возникает необходимость давать доступ к файлам сайта для веб разработчиков или других пользователей. Так как используется 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 и приведу скриншоты настройки моего подключения.
Настройка:
Информация TLS:
Вывод
Произведя данную настройку мы полностью сделали разграничение доступа к разным сайтам на сервере. Обеспечили надежное подключение используя сертификат и ведение всей статистики работы с файлами.