- Posts: 9
- Thank you received: 0
Установка и настройка ProFTPD на Ubuntu: Изолированный FTPS (FTP over TLS)
- johnyx
- Topic Author
- Offline
- Administrator
-
Less
More
1 month 1 week ago - 1 month 3 days ago #9
by johnyx
Установка и настройка ProFTPD на Ubuntu: Изолированный FTPS (FTP over TLS) was created by 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):
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 + твой заданный пароль.
Last edit: 1 month 3 days ago by johnyx.
Please Log in or Create an account to join the conversation.
Time to create page: 0.156 seconds