Настройка FTP-сервера ProFTPD

На момент старта разработки ProFTPD наиболее часто используемым FTP-сервером был wu-ftpd, который обеспечивал отличную производительность и в целом является не плохим продуктом, но в нем не хватало функционала. В ходе доработки wu-ftpd стало понятно, что для реализации желаемого функционала необходим существенный рефакторинг кода. Так стартовал проект ProFTPD, в котором разработчики сделали уклон на безопасность и гибкость в настройке, при его разработке существенное влияние на структуру, гибкость и конфигурацию сервера повлиял проект веб-сервера Apache. 

В качестве основных особенностей ProFTPD следует выделить:

  • один конфигурационный файл, синтаксис которого будет очень знаком администраторам веб-сервера Apache;
  • гибкость настройки через .ftpaccess в каждой директории по аналогии с .htaccess в Apache;
  • легкое создание виртуальных FTP-серверов (см. директиву VirtualHost);
  • возможность работы сервера в режиме демона либо в связке с inetd/xinetd;
  • возможность работы под обычным не привилегированным пользователем, что позволяет снизить последствия возможных хакерских атак на операционную систему (возможность использования функционала зависит от используемой ОС);
  • ведение логов в формате utmp/wtmp. Формат логов аналогичен wu-ftpd, при этом есть возможность увеличить детализированность сообщений;
  • тесная интеграция с системой аутентификации Unix (поддержка аккаунтов с истекшим сроком действия и т.п.);
  • модульная архитектура с возможностью расширения функционала путем подключения внешних библиотек (SQL, LDAP, SSL/TLS, RADIUS и т.п.);
  • поддержка IPv6;
  • и многое другое.

Согласно информации с официального сайта в настоящее время ProFTPD используется на множестве высоконагруженных серверов хостинг провайдеров и других крупных проектов. 

Ладно хватит вводной части, пора перейти к делу. Установку и настройку FTP-сервера я буду производить на FreeBSD версии 12.1. Итак, необходимо обновить информацию о доступных пакетах и установить сервер:

pkg update
pkg add proftpd

Конфигурационный файл сервера находится по пути /usr/local/etc/proftpd.conf. Далее приведу свой конфиг с пояснениями. Структура конфига будет знакома тем, кто занимался настройкой веб-сервера Apache.

# Это основной конфигурационный файл ProFTPD (как правило его имя
# 'proftpd.conf'). По дефолтному конфигу работает единственный 
# экземпляр FTP-сервера с возможностью подключения анонимных пользователей.
# Для нормальной работы в данной конфигурации в системе должны присутствовать
# пользователь и группа "nobody" и "ftp".

# Заданный текст будет выводиться подключенному клиенту на команды HELP или STAT.
ServerName                      "FTP Server"

# Почтовый адрес администратора сервера
ServerAdmin                     "admin@nxlib.ru"

# Режим работы FTP-сервера: демон или через суперсеврер (standalone, inetd).
ServerType                      inetd

# Заданный текст будет отображаться у клиента при подключении к серверу.
ServerIdent                     on "Welcome to ftp.nxlib.ru"

# В случае использования виртуальных хостов, когда не будет найден подходящий,
# ProFTPD будет работать с конфигурацией, которая задана вне директив VirtualHost.
# В ином случае клиенту выведется сообщение:
#   500 Sorry, no server available to handle request on a.b.c.d
DefaultServer           on

# Файл, в котором хранится информация об активных сессиях
ScoreboardFile  /var/run/proftpd/proftpd.scoreboard

# При активации привественное сообщение клиенту будет выводиться 
# только после успешной аутентификации.
DeferWelcome yes

# Сетевой порт, на котором будет работать сервер.
Port                            21

# Директива определяет возможность работы по протоколу IPv6.
UseIPv6                         on

# Со значением Umask 022 новые файлы и директории будут создаваться
# с правами, которые не позволят пользователям группы и остальным
# осуществлять запись
Umask                           022

# Максимальный размер команды от клиента, которую может обработать сервер.
# Указывается в байтах.
CommandBufferSize       512

# Время, которое отводится клиенту на аутентификацию (в секундах).
# Директива имеет значение только в режиме работы standalone.
TimeoutLogin         120

# Время простоя соединения в секундах. То есть при отсутсвии запросов (направления команд)
# от клиента после истичения времени соединение будет разорвано.
TimeoutIdle          600

# Время простоя в секундах, по истечению которого при отсутвии данных
# (загрузки/закачки данных, отправка списка файлов и т.п.) соединение будет разорвано.
TimeoutNoTransfer    900

# Директива устанавливает время в секундах, в рамках которого соединение 
# для передачи данных между proftpd и клиентом может существовать
# без фактической передачи данных (т.е. "приостановлено").
TimeoutStalled      3600

# Директива определяет порядок применения модулей для проверки пары логин/пароль клиента.
# Здесь должно указываться полное имя модуля. Не используйте mod_auth.c, т.к. он
# реализует лишь базовый функционал, используемый другими модулями. Также не следует 
# использовать один mod_auth_pam.c, т.к. он не предоставляет proftpd полную информацию
# о наличии действующей в системе учетной записи пользователя.
# Можно сделать модуль аутентификации "авторитетным", для этого надо добавить символ '*'
# после имени модуля. Обычно это делается для модуля mod_auth_pam.c, чтобы гарантировать,
# что вход в систему завершится с ошибкой в случае сбоя проверки через PAM.
# По умолчанию proftpd используется системный /etc/passwd и PAM.
AuthOrder mod_auth_pam.c* mod_auth_unix.c

# После успешной аутентификации пользователь будет зажат через chroot в указанную директорию,
# за пределы которой он не сможет выйти.
DefaultRoot ~

# Учитывать сведения, указанные в /etc/ftpusers. Если имя пользователя будет найдено
# в данном списке, то аутентификация будет завершена с ошибкой.
UseFtpUsers on

# Директива определяет возможность аутентификации клиента под логином root.
RootLogin off

# Директива определяет возможность перезаписи файла в случае отправки клиентом
# файла с таким же именем.
AllowOverwrite          on

# Сервер будет отображать указанный	IP-адрес или DNS-имя клиенту в ответах
# на команды PASV и EPSV FTP, исходя из предположения, что узел с указанным
# IP-адресом или DNS именем работает как шлюз для proftpd (NAT или прокси-сервер).
MasqueradeAddress ftp.nxlib.ru

# В директиве задается диапазон портов, который используется для отправки данных.
# Это необходимо в случае, если сервер стоит за фаерволом. Имейте  ввиду, что
# количество портов в диапазоне выбирается исходя из нагрузки на сервер.
# Рекомендуется использовать порты с 49152 по 65534 (IANA registered ephemeral port range)
PassivePorts 49152 52999

# Запрет команды SITE CHMOD для всех
<Limit SITE_CHMOD>
  DenyAll
</Limit>

# Данный модуль будет доступен если proftpd собран с опцией NLS
<IfModule mod_lang.c>
  # Включаем модуль в работу. Для клиентов станут доступны команды LANG и OPTS UTF8.
  LangEngine on
  
  # Язык, который используеся на сервере. Список поддерживаемых языков
  # можно получить командой: locale -a
  LangDefault ru_RU
  
  # В данном случае proftpd будет отклонять команды клиента для имен файлов, если они неправильно закодированы.
  LangOptions RequireValidEncoding
</IfModule>

# Если есть модуль Dynamic Shared Objects (DSO), тогда подгружаем расширения
<IfModule mod_dso.c>
  LoadModule mod_tls.c
  LoadModule mod_tls_shmcache.c
  LoadModule mod_deflate.c
</IfModule>

# Модуль mod_tls реализует FTP поверх SSL/TLS (см. FTPS).
# У меня сервер разрешает подключаться клиентам только через TLS.
# Здесь приведены соответствующие настройки для данного модуля.
<IfModule mod_tls.c>
  # Директива определяет состояние активности модуля TLS
  TLSEngine on
  
  # Файл, куда будут записываться сведения о работе модуля TLS
  #TLSLog /var/log/proftpd-tls.log

  # Конфигурация TLS (разрешенные протоколы и шифры)
  TLSProtocol TLSv1.2 TLSv1.3
  TLSCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305

  # Оставляем свободу клиенту, запрещая серверу настаивать на выборе шифров
  TLSServerCipherPreference off
  
  # Ужесточаем работу TLS, запретив "session tickets"
  TLSSessionTickets off

  # При активированной директиве подключение через TLS обязательны.
  # Подключения по незащищенному каналу будут сброшены.
  TLSRequired on

  # Файл с параметрами Diffie-Hellman (DH)
  # Можно создать командой: openssl dhparam -out /path/to/dhparam.pem 2048
  TLSDHParamFile /usr/local/etc/proftpd/dhparams.pem

  # Путь до сертификата и ключа
  TLSRSACertificateFile /usr/local/etc/ssl/vsftpd.crt
  TLSRSACertificateKeyFile /usr/local/etc/ssl/vsftpd.key

  # Путь до сертификата с доверенными CA серверами
  TLSCACertificateFile /usr/local/share/certs/ca-root-nss.crt

  # Проверять сертификаты клиента?
  TLSVerifyClient off

  # Повторное SSL/TLS рукопожатие в рамках существующего соединения.
  # Учтите, что некоторые клиенты не поддерживают данный функционал,
  # в таком случае когда mod_tls настаивает на повторном рукопожатии
  # клиенты могут разорвать соединение.
  # В OpenSSL версии 0.9.8l и выше, SSL/TLS renegotiations запрещено 
  # (см. CVE-2009-3555, CVE-2011-1473). В данной директиве рекомендуется
  # использовать параметр none, чтобы запретить указанный функционал. 
  TLSRenegotiate none

  # Использовать Online Certificate Status Protocol (OCSP) stapling.
  TLSStapling on

  # Место, где будет кэшироваться информация о результатах запросов OCSP
  # Требуется модуль mod_tls_shmcache
  TLSStaplingCache shm:/file=/var/run/proftpd/ocsp_pcache
</IfModule>

<IfModule mod_deflate.c>
  # При включении для клиента будут доступны команда MODE Z, что позволит
  # пересылать данные в сжатом виде
  DeflateEngine on
  
  # Место, куда будут записываться сообщения модуля.
  # Учтите, что при включении в файл будет записываться много отладочной информации.
  #DeflateLog /var/log/proftpd/deflate.log
</IfModule>

# Дополнительные настройки ведения логов
#SyslogFacility ftp
#ExtendedLog syslog:auth AUTH default

Теперь, когда конфигурационный файл готов запустим установленный сервис. Так как  у меня он будет работать через inted, я файл /etc/inetd.conf добавил следующую строку:

ftp     stream  tcp     nowait/0/5      root    /usr/local/sbin/proftpd proftpd -4

Стоит обратить внимание, что в четвертой колонке данной записи я ограничил количество подключений с одного IP-адреса до 5 в минуту. После правки конфига заставляем inetd перечитать его:

service inetd reload

Теперь проверим "висит" ли сервис на нужном порту:

sockstat -4 -l | grep 21
root     inetd      1220  5  tcp4   *:21                  *:*

Если сервис работает, то на этом настройка FTP-сервера закончена. Если же нет, то смотрите логи и проверяйте конфигурационный файл. 

Среди клиентов, которые поддерживают FTPS могу отметить Total Commander и FileZilla. Например, для того, чтобы подключиться к FTP-серверу по протоколу FTPS посредством Total Commander необходимо создать профиль подключения с такими параметрами:

Рисунок 1. Общие настройки соединения.

Рисунок 2. Расширенные настройки соединения.

Настройка FileZilla осуществляется похожим способом. Добавлю, что в ProFTPD можно настроить виртуальные хосты с индивидуальными параметрами как в Apache, а при подключении дополнительных модулей сделать авторизацию через SQL, LDAP и другие плюшки (отправку логов на SQL сервер). В общем ProFTPD очень функционален и удобен в использовании. 

Добавить комментарий

CAPTCHA
Этот вопрос задается для того, чтобы выяснить, являетесь ли Вы человеком или представляете из себя автоматическую спам-рассылку.
Яндекс.Метрика