Установка и настройка ProFTPD на Ubuntu: Изолированный FTPS (FTP over TLS)

Больше
1 мес. 1 нед. назад - 1 мес. 3 дн. назад #9 от johnyx
Установка и настройка ProFTPD на Ubuntu: Изолированный FTPS (FTP over TLS) на EC-сертификатах Let's EncryptВ данной статье разберем, как поднять быстрый и безопасный FTP-сервер ProFTPD на Ubuntu, запереть пользователей внутри конкретной директории на отдельном жестком диске, перевести авторизацию на изолированную базу виртуальных пользователей (без свечения системных учеток) и защитить трафик с помощью современных эллиптических ключей (ECDSA) Let's Encrypt.  Шаг 1. Подготовка директории и прав в системеДля хранения загрузок и файлов создаем изолированную папку на целевом диске и передаем права веб-серверу (www-data), чтобы файлы мгновенно и без ошибок 403 Forbidden читались через Nginx/Joomla. 
bash#
Создаем физическую папку для загрузок
sudo mkdir -p /var/www/yourdomain/downloads/
# Назначаем владельцем системного юзера и группу веб-сервера
sudo chown -R $USER:www-data /var/www/yourdomain/downloads/
# Выставляем безопасные права на папки и файлы
sudo find /var/www/yourdomain/downloads/ -type d -exec chmod 755 {} \;
sudo find /var/www/yourdomain/downloads/ -type f -exec chmod 644 {} \; 
Шаг 2. Подготовка SSL-сертификатов Let's Encrypt (EC / ECDSA)Современный Certbot по умолчанию генерирует эллиптические ключи, к которым у пользователя proftpd из соображений безопасности нет доступа в папке /etc/letsencrypt/live/. Копируем их в изолированную директорию FTP-сервера и настраиваем права для группы nogroup (дефолтная рабочая группа ProFTPD в Ubuntu). 
bash#
Создаем защищенную папку для ключей внутри конфигурации FTP
sudo mkdir -p /etc/proftpd/ssl

# Копируем оригинальные эллиптические файлы Let's Encrypt
sudo cp /etc/letsencrypt/live/yourdomain.ru/fullchain.pem /etc/proftpd/ssl/fullchain.pem
sudo cp /etc/letsencrypt/live/yourdomain.ru/privkey.pem /etc/proftpd/ssl/privkey.pem

# Передаем права root и группе nogroup на чтение
sudo chown -R root:nogroup /etc/proftpd/ssl/
sudo chmod /etc/proftpd/ssl/
sudo chmod /etc/proftpd/ssl/fullchain.pem /etc/proftpd/ssl/privkey.pem
 Чтобы сертификаты автоматически обновлялись внутри FTP при продлении Certbot, создаем нативный скрипт-хук: 
bash#
sudo nano /etc/letsencrypt/renewal-hooks/deploy/proftpd-renew.sh
 Вставляем код: bash /bin/bash
cp /etc/letsencrypt/live/yourdomain.ru/fullchain.pem /etc/proftpd/ssl/fullchain.pem
cp /etc/letsencrypt/live/yourdomain.ru/privkey.pem /etc/proftpd/ssl/privkey.pem
systemctl restart proftpd
Сделаем его исполняемым: sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/proftpd-renew.sh  
Шаг 3. Монолитный конфигурационный файл /etc/proftpd/proftpd.confПолностью очищаем дефолтный конфиг proftpd.conf и заливаем отмытый монолит. Здесь зафиксированы пассивные порты для проброса через NAT/Роутер, вырезана устаревшая директива MultilineRFC2228, включен блэкаут старых хостов, а авторизация переведена на изолированный файл ftpd.passwd. Подключаем DSO модули ядра
Include /etc/proftpd/modules.conf

# Выключаем IPv6, раз мы сидим на IPv4 (убирает таймауты при коннекте)
UseIPv6 off

<IfModule mod_ident.c>
IdentLookups off
</IfModule>

ServerName "FTP-Storage"
ServerType standalone
DeferWelcome off
DefaultServer on
ShowSymlinks on

TimeoutNoTransfer 600
TimeoutStalled 600
TimeoutIdle 1200

DisplayLogin welcome.msg
DisplayChdir .message true
ListOptions "-l"
DenyFilter \*.*/

# ЗАПИРАЕМ виртуальных пользователей строго внутри папки загрузок
DefaultRoot /var/www/yourdomain/downloads/
RequireValidShell off
Port 21

# ФИКСАЦИЯ ПАССИВНЫХ ПОРТОВ ДЛЯ ПРОБРОСА НА ФАЕРВОЛЕ И РОУТЕРЕ
PassivePorts 49152 49300
MasqueradeAddress yourdomain.ru

MaxInstances 30

User proftpd
Group nogroup
Umask 022 022
AllowOverwrite on

# Наша изолированная база виртуальных пользователей FTP
AuthUserFile /etc/proftpd/ftpd.passwd

TransferLog /var/log/proftpd/xferlog
SystemLog /var/log/proftpd/proftpd.log

<IfModule mod_quotatab.c>
QuotaEngine off
</IfModule>

<IfModule mod_ratio.c>
Ratios off
</IfModule>

<IfModule mod_delay.c>
DelayEngine on
</IfModule>

<IfModule mod_ctrls.c>
ControlsEngine off
</IfModule>

# =========================================================================
# БРОНЕБОЙНЫЙ FTPS НА ЭЛЛИПТИЧЕСКИХ КЛЮЧАХ (EC) С ПОЛНЫМ ДОСТУПОМ ГРУППЫ NOGROUP
# =========================================================================
<IfModule mod_tls.c>
TLSEngine on
TLSLog /var/log/proftpd/tls.log
TLSRequired on

# Нативный синтаксис под современные EC-ключи Certbot
TLSECCertificateFile /etc/proftpd/ssl/fullchain.pem
TLSECCertificateKeyFile /etc/proftpd/ssl/privkey.pem

# Требуется для стабильной работы повторных сессий в FileZilla
TLSOptions NoSessionReuseRequired
TLSProtocol TLSv1.2 TLSv1.3
</IfModule>
Шаг 4. Создание изолированного виртуального пользователяЧтобы не использовать реальные системные учетные записи Ubuntu, создаем автономного FTP-пользователя внутри файла ftpd.passwd. Мапим его на UID:GID 33 (www-data), чтобы права веб-сервера наследовались автоматически. 
bash
sudo ftpasswd --passwd --file=/etc/proftpd/ftpd.passwd --name=ftp_uploader --uid=33 --gid=33 --home=/var/www/yourdomain/downloads/ --shell=/bin/false
Команда попросит дважды ввести секретный пароль для создаваемого юзера.Защищаем файл базы паролей: bash sudo chmod /etc/proftpd/ftpd.passwd
sudo chown root:root /etc/proftpd/ftpd.passwd

Применяем конфигурацию и рестартуем службу: bash
sudo systemctl restart proftpd
 Шаг 5. Настройка Фаервола (iptables) и подключение в FileZillaОткрываем порт управления и наш кастомный пассивный диапазон в iptables: 
bash
sudo iptables -A INPUT -p tcp --dport -j ACCEPT
sudo iptables -A INPUT -p tcp --dport -j ACCEPT
sudo iptables-save | sudo tee /etc/iptables/rules.v4
Настройка в FileZilla (Ctrl + S):
  • Хост: yourdomain.ru (порт 21)  
  • Шифрование: Обязательно выбрать «Использовать явный FTP через TLS» (Require explicit FTP over TLS).
  • Тип входа: Нормальный.
  • Пользователь: ftp_uploader + твой заданный пароль.
При первом коннекте FileZilla покажет валидный эллиптический сертификат Let's Encrypt — принимаем его, ставим галочку доверия, и сервер мгновенно открывает изолированный корень папки загрузок в глухом зашифрованном TLS-канале.
Последнее редактирование: 1 мес. 3 дн. назад пользователем johnyx.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Время создания страницы: 0.228 секунд