Настройка безопасного сервера FTP с помощью ProFTP и SSL-сертификата Let’s Encrypt

Протокол FTP широко используется для доступа к файлам на серверах. В связи с его популярностью, он встроен во многие инструменты управления файлами (mc, Filezilla, Windows Commander, Windows Explorer), текстовые редакторы, системы резервного копирования и другие инструменты.

FTP — это очень старый протокол, который появился в 1971 году, когда обмен файлам в незащищенных сетях не использовался. В связи с этим, в изначальном протоколе отсутствуют средства для обеспечения безопасности передачи данных между клиентом и сервером, соответственно, FTP нельзя использовать для передачи чувствительных данных вне доверенных сетей.

Для FTP существует расширение стандарта FTPS, которое позволяет клиенту требовать шифрование соединения с помощью протокола TLS, что делает защиту данных безопасной.

В этой статье мы рассмотрим как можно настроить сервер ProFTP для поддержки защищенной передачи данных с помощью сертификата SSL Let’s Encrypt. Фактически, вы можете использовать самостоятельно сгенерированный сертификат, а не Let’s Encrypt, однако, это приведет к тому, что клиентские приложения будут выдавать предупреждение или просто не будут работать, в зависимости от их реализации.

Установка Certbot

Для работы с сертификатами Let’s Encrypt требуется установить специальный пакет, который называется Certbot:

Debian, Ubuntu

sudo apt update && sudo apt install -y certbot

CentOS 7

sudo yum install -y certbot

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

Убедитесь, что команда hostname —fqdn отдает корректное доменное имя сервера в полном формате. После этого можно запустить команду получения сертификата для домена:

sudo certbot certonly -n --standalone -m user@site.com --agree-tos -d $(hostname --fqdn)

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

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator standalone, Installer None
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for proftp.cs2.netpoint-dc.com
Waiting for verification...
Cleaning up challenges

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/proftp.cs2.netpoint-dc.com-0001/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/proftp.cs2.netpoint-dc.com-0001/privkey.pem
   Your cert will expire on 2019-07-05. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot
   again. To non-interactively renew *all* of your certificates, run
   "certbot renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

Автоматическое обновление сертификата

Важно настроить автопродление сертификата. Сертификаты LE требуется продлевать каждые 90 дней. Мы просто настроим ежедневную задачу CRON, которая будет это делать. Для этого создайте файл /etc/cron.daily/le-renew со следующим содержимым:

#/bin/bash
certbot renew

Пометьте его как исполняемый и проверьте, что он работает:

sudo chmod 755 /etc/cron.daily/le-renew
sudo /etc/cron.daily/le-renew

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

Мы будем использовать надежный, хорошо зарекомендовавший себя сервер PROFTPD для реализации защищенного FTP.

Debian, Ubuntu

sudo apt install -y proftpd

CentOS 7

sudo yum install -y proftpd proftpd-utils
systemctl enable proftpd

После установки ProFTPd сразу готов обслуживать доступ по небезопасному протоколу FTP. Для активации FTPS требуется совершить ряд дополнительных настроек, которые приведены ниже. Вы должны заменить %WEBSITE% на имя домена, указанного при генерации сертификата Let’s Encrypt.

<IfModule mod_tls.c>
TLSEngine                               on
TLSLog                                  /var/log/proftpd/tls.log
TLSProtocol                             SSLv23
TLSRequired                             yes

TLSRSACertificateFile    /etc/letsencrypt/live/%WEBSITE%-0001/cert.pem
TLSRSACertificateKeyFile /etc/letsencrypt/live/%WEBSITE%-0001/privkey.pem
TLSCACertificateFile     /etc/letsencrypt/live/%WEBSITE%-0001/chain.pem
</IfModule>

Debian, Ubuntu. Данный код можно добавить в /etc/proftpd/tls.conf.

CentOS 7. В CentOS 7 создайте файл /etc/proftpd/disabled_mod/tls.conf с вышеприведенным содержимым и активируйте модуль:

ln -s /etc/proftpd/disabled_mod/tls.conf  /etc/proftpd/enabled_mod/
systemctl restart proftpd

Теперь вы можете проверить работу FTPS, соединившись с сервером, например, с помощью LFTP:

touch file

lftp -e 'put file' ftp://administrator@proftp.cs2.netpoint-dc.com
Пароль: 
lftp administrator@proftp.cs2.netpoint-dc.com:~> ls                                              
-rw-r--r--   1 administrator administrator        0 Apr  6 22:59 file
lftp administrator@proftp.cs2.netpoint-dc.com:~> 

В процессе соединения LFTP должен сообщить об установке защищенного соединения. Поскольку мы принудительно требуем установки защищенного соединения с помощью директивы TLSRequired yes, то клиенты без поддержки TLS не смогут работать с сервером. Если вы хотите разрешить им выполнять загрузку в небезопасном режиме, установите TLSRequired в значение no.

На этом базовая настройка сервера FTP, обеспечивающего безопасные сессии пользователей по протоколу FTPS завершена.