Гид по технологиям

Настройка vsftpd на Ubuntu 20.04: FTP с TLS — пошаговое руководство

• 9 min read • DevOps • Обновлено 28 Nov 2025
Настройка vsftpd на Ubuntu 20.04 с TLS
Настройка vsftpd на Ubuntu 20.04 с TLS

  • Пошаговая инструкция по установке и настройке vsftpd на Ubuntu 20.04 с поддержкой SSL/TLS (FTPS). Подключение через TLS обеспечивает шифрование логина и передачи данных. В статье — настройка брандмауэра, chroot, пассивные порты, создание пользователя, тестирование и рекомендации по безопасности.

Введение

Иллюстрация передачи файлов по FTP

FTP (File Transfer Protocol) — старый и знакомый протокол для передачи файлов между клиентом и сервером. В исходном виде он небезопасен, но при использовании TLS (FTPS) соединение шифруется. В этой инструкции мы устанавливаем и настраиваем vsftpd (Very Secure FTP Daemon) на Ubuntu 20.04 и включаем TLS. Если возможно, предпочтительнее использовать SFTP/SCP, но FTPS остаётся совместимым решением для клиентов, требующих FTP.

Кому полезно это руководство

  • Системным администраторам, которым нужно развернуть FTP-сервер с шифрованием.
  • Разработчикам и DevOps-инженерам, поддерживающим устаревшие клиенты.
  • Тем, кто мигрирует с небезопасного FTP на зашифрованный FTPS.

Ключевые понятия (в одну строчку)

  • FTP — протокол передачи файлов (обычно без шифрования).
  • FTPS — FTP поверх TLS/SSL (шифрует канал управления и/или данные).
  • SFTP — SSH File Transfer Protocol (современная альтернатива, работает поверх SSH).
  • chroot — механизм ограничения пользователя в определённой директории.

Содержимое статьи

  • Предварительные требования
  • Установка vsftpd
  • Настройка брандмауэра (UFW)
  • Основная конфигурация vsftpd (доступ, загрузки, chroot, пассивный режим, контроль пользователей)
  • Создание и настройка пользователей FTP
  • Тестирование подключения (командная строка и FileZilla)
  • Подключение по TLS: создание сертификата и параметры безопасности
  • Отключение shell-доступа (ограничение до FTP)
  • Рекомендации по безопасности и проверочные сценарии
  • Альтернативы и когда их выбирать
  • Чек-листы, тесты приёма и рольовые задачи
  • Краткое резюме

Предварительные требования

  • Сервер с Ubuntu 20.04.
  • Непользователь root с sudo-привилегиями.
  • Доступ к командной строке и возможность изменять конфигурацию брандмауэра.

Важно: при работе с публичным сервером рекомендуется иметь домен или поддомен и действующий SSL-сертификат (например, от Let’s Encrypt) для доверенного подключения.

Шаг 1 — Установка vsftpd

Установим пакет vsftpd и создадим резервную копию конфигурации.

$ sudo apt update
$ sudo apt install vsftpd

Сделаем резервную копию оригинального файла конфигурации, чтобы можно было откатиться.

$ sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.orig

Совет: храните резервные копии конфигураций вместе с датой и кратким описанием изменений.

Шаг 2 — Настройка брандмауэра (UFW)

Проверим текущий статус UFW и откроем порты, необходимые для FTPS в пассивном режиме.

$ sudo ufw status

Откроем порты 20 (команды), 21 (данные/контрол), 990 (implicit FTPS, если нужен) и диапазон пассивных портов 35000–40000, который в дальнейшем будет указан в конфигурации vsftpd.

$ sudo ufw allow 20:21/tcp
$ sudo ufw allow 990/tcp
$ sudo ufw allow 35000:40000/tcp
$ sudo ufw status

Примечание: если ваш сервер находится за NAT (облачный провайдер), нужно также пробросить эти порты на уровне провайдера и указать внешний IP в конфигурации пассивного режима, либо использовать FTP с явным TLS и активный режим с пробросом портов.

Важное замечание

  • Использование широкого диапазона пассивных портов помогает избежать конфликтов, но требует открытия соответствующих портов в брандмауэре и/или облачном сетевом контроле.

Шаг 3 — Конфигурация vsftpd

Откроем файл конфигурации для редактирования.

$ sudo nano /etc/vsftpd.conf

Ниже — ключевые параметры и объяснения.

Доступ FTP

Запретим анонимный доступ и разрешим локальным пользователям входить.

anonymous_enable=NO
local_enable=YES

Включение загрузки файлов

Чтобы разрешить загрузку/изменение файлов, включите параметр:

write_enable=YES

Ограничение пользователей (chroot)

Ограничим локальных пользователей их домашними каталогами.

chroot_local_user=YES

Если chroot включён, директория назначения не должна быть записываемой для пользователя — это ограничение безопасности. Есть два пути решения:

  1. Создать внутри домашнего каталога отдельную директорию для выгрузки файлов и сделать корневой каталог (local_root) неизменяемым. Пример:
user_sub_token=$USER
local_root=/home/$USER/ftp

Для каждого пользователя создаются каталоги /home/USER/ftp и /home/USER/ftp/upload; корневой каталог владельцем является nobody:nogroup и не записываем.

  1. Альтернативно, если вы доверяете пользователю и понимаете риски, можно включить:
allow_writeable_chroot=YES

Этот параметр снимает ограничение, но снижает безопасность: используйте его только при необходимости и контроле доступа.

Пассивный FTP

Укажем диапазон портов, который открыт в UFW.

pasv_min_port=35000
pasv_max_port=40000

Если сервер находится за NAT, добавьте также параметр pasvaddress=<вашпубличный_ip_or_domain>.

Ограничение списка пользователей

Чтобы разрешить доступ только определённым пользователям — включите:

userlist_enable=YES
userlist_file=/etc/vsftpd.userlist
userlist_deny=NO

Добавляйте в /etc/vsftpd.userlist только тех пользователей, которым вы доверяете.

После внесения изменений перезапустите сервис:

$ sudo systemctl restart vsftpd

Шаг 4 — Настройка директории пользователя FTP

Ниже показано создание отдельного пользователя и конфигурация директории с учётом chroot.

Добавление пользователя

$ sudo adduser testuser

Установите сложный пароль.

Добавление пользователя в список разрешённых

$ echo "testuser" | sudo tee -a /etc/vsftpd.userlist

Создание FTP-деревa и каталогов для загрузки

$ sudo mkdir /home/testuser/ftp
$ sudo chown nobody:nogroup /home/testuser/ftp
$ sudo chmod a-w /home/testuser/ftp

$ sudo mkdir /home/testuser/ftp/upload
$ sudo chown testuser:testuser /home/testuser/ftp/upload

Проверка прав:

$ sudo ls -al /home/testuser/ftp

Создадим тестовый файл:

$ echo "vsftpd test file" | sudo tee /home/testuser/ftp/upload/test.txt

Шаг 5 — Тестирование FTP-доступа (CLI)

Примеры подключения и результаты проверки:

  • Анонимный вход должен быть запрещён — проверка возвращает “Permission denied”.
  • Вход под неразрешённым пользователем также отклоняется.
  • Вход под testuser должен быть успешным; можно выполнять get/put в каталоге upload.

Пример сессии (успешный вход):

$ ftp -p 136.244.105.99
Connected to 136.244.105.99.
220 (vsFTPd 3.0.3)
Name (136.244.105.99:default): testuser
331 Please specify the password.
Password: your_user's_password
230 Login successful.
ftp> cd upload
250 Directory successfully changed.
ftp> get test.txt
150 Opening BINARY mode data connection for test.txt (17 bytes).
226 Transfer complete.
ftp> put test.txt upload.txt
150 Ok to send data.
226 Transfer complete.
ftp> bye

Если соединение не устанавливается, проверьте:

  • Открыты ли нужные порты в UFW и облачном провайдере.
  • Настроен ли pasv_address при наличии NAT.
  • Логи vsftpd: /var/log/vsftpd.log или системный journalctl -u vsftpd.

Шаг 6 — Шифрование трафика (SSL/TLS)

Чтобы зашифровать логин и передачу данных, нужен сертификат. Рекомендуется использовать Let’s Encrypt для публичных доменов; в примере ниже — самоподписанный сертификат для тестовой среды.

Создадим PEM-файл, содержащий и ключ, и сертификат (2048 бит, 365 дней):

$ sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/vsftpd.pem -out /etc/ssl/private/vsftpd.pem

Далее в /etc/vsftpd.conf закомментируем старые пути и укажем новые:

# rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
# rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key

rsa_cert_file=/etc/ssl/private/vsftpd.pem
rsa_private_key_file=/etc/ssl/private/vsftpd.pem

ssl_enable=YES

Добавим усиление настроек TLS:

allow_anon_ssl=NO
force_local_data_ssl=YES
force_local_logins_ssl=YES
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO
require_ssl_reuse=NO
ssl_ciphers=HIGH

Комментарии по настройкам:

  • forcelocal*_ssl заставляет шифровать логин и данные локальных пользователей.
  • ssl_tlsv1=YES включает TLSv1.0; при возможности замените или дополните настройку поддержкой TLSv1.2/1.3 (в более новых версиях OpenSSL/совместимых сборках).
  • require_ssl_reuse=NO позволяет некоторым клиентам корректно работать; при наличии современных клиентов можно включать повторное использование сессий для улучшения безопасности.

Перезапустите сервис:

$ sudo systemctl restart vsftpd

После включения TLS подключаться через обычный ftp-клиент в командной строке уже не получится: нужен клиент с поддержкой explicit FTPS (FTPES) или FileZilla.

Шаг 7 — Тестирование TLS в FileZilla

В FileZilla откройте Диспетчер сайтов (Site Manager).

  • Нажмите “New Site” и задайте Host = IP или домен.
  • Оставьте Port пустым (по умолчанию 21) или укажите 21.
  • В поле Encryption выберите “Require explicit FTP over TLS”.
  • Введите Username/Password и Connect.

Создание нового сайта в FileZilla

Редактирование сайта — FileZilla

При подключении клиент покажет сертификат сервера. При самоподписанном сертификате можно отметить “Always trust this certificate” для удобства тестирования.

Диалог сертификата SSL FTP — FileZilla

После подтверждения соединение будет установлено и вы сможете обмениваться файлами.

Успешное подключение — FileZilla

Совет: при использовании Let’s Encrypt обновляйте сертификаты автоматически (certbot) и следите за правами доступа к /etc/letsencrypt.

Шаг 8 — Отключение shell-доступа для FTP-пользователя

По умолчанию пользователи имеют shell-доступ (ssh). Для ограничения можно создать shell, который выводит сообщение и завершает сессию.

$ echo -e '#!/bin/sh
echo "This account is limited to FTP access only."' | sudo tee -a  /bin/ftponly
$ sudo chmod a+x /bin/ftponly
$ echo "/bin/ftponly" | sudo tee -a /etc/shells
$ sudo usermod newftpuser -s /bin/ftponly

Используйте эту технику, если хотите лишить пользователя SSH-доступа, но оставить FTP.

Важное: для SFTP этого не достаточно — SFTP работает через SSH и потребует отдельной конфигурации.

Рекомендации по безопасности и hardening

  • По возможности используйте SFTP вместо FTPS для упрощения аутентификации и работы через SSH.
  • Для публичных серверов применяйте сертификаты от доверенных CA (Let’s Encrypt).
  • Ограничивайте список пользователей (userlist_enable) и используйте сильные пароли или ключи (если поддерживается).
  • Включите логирование и отслеживайте /var/log/vsftpd.log и systemd journal.
  • Минимизируйте доступ в домашние каталоги: chroot_local_user=YES и делайте корневой каталог неизменяемым.
  • Следите за версиями OpenSSL и vsftpd и оперативно применяйте обновления.
  • Если сервер за NAT, укажите pasv_address и откройте соответствующие порты.
  • Рассмотрите двухфакторную аутентификацию на уровне приложения или VPN для управления доступом.

AppArmor/SELinux

Ubuntu использует AppArmor. При проблемах доступа проверьте профиль vsftpd и системные журналы. При необходимости добавьте исключения или отключите профиль после анализа рисков.

Альтернативы и когда их выбирать

  • SFTP (через SSH) — предпочтителен для большинства сценариев: проще в настройке, безопаснее и не требует выделенного диапазона пассивных портов.
  • SCP — для одноразовых переносов файлов через SSH.
  • WebDAV поверх HTTPS — удобен для интеграции с некоторыми клиентами и браузерами.

Выбирайте SFTP если у вас уже есть SSH-доступ и требуется простое решение. FTPS нужен, если клиенты или интеграции ожидают именно FTP-протокол (например, старое ПО или специализированные устройства).

Чек-лист перед вводом в эксплуатацию (роль: системный администратор)

  • Установлен vsftpd и проверена работоспособность сервиса.
  • Открыты порты 20, 21, 990 (если нужен) и диапазон пассивных портов в UFW и облачном провайдере.
  • Настроен chroot_local_user или эквивалент.
  • Создан пользователь(и) и добавлены в /etc/vsftpd.userlist.
  • Создан сертификат (Let’s Encrypt или самоподписанный) и указаны rsa_cert_file/rsa_private_key_file.
  • Приняты параметры SSL (force_local_data_ssl, force_local_logins_ssl и т.д.).
  • Проверено подключение через FileZilla и/или другой FTPS-клиент.
  • Настроено логирование и мониторинг (журналы, оповещения).
  • Проведён тест восстановления/отката конфигурации.

Критерии приёмки

  • Анонимный вход запрещён (anonymous_enable=NO).
  • Разрешённый пользователь входит и может загрузить/скачать файлы в пределах своих прав.
  • Передача данных и логин происходят по TLS (проверено через FileZilla).
  • Пассивный диапазон портов открыт и отвечает на соединения.
  • Логи фиксируют попытки входа и передачу файлов.

Тестовые сценарии и приёмка

  1. Попытка анонимного входа — должна быть отклонена.
  2. Попытка входа пользователем, не внесённым в список, — отклонена.
  3. Вход testuser, получение test.txt — успешен.
  4. Загрузка файла в /upload — успешна; права сохраняются и файл принадлежит testuser.
  5. Подключение через FTPS в FileZilla с проверкой сертификата — успешное.
  6. Проброс портов и пассивный режим через NAT — проверен с внешнего хоста.

Ментальные модели и эвристики

  • «Разделяй и властвуй»: чётко отделяйте корневую (неписываемую) зону FTP от каталога загрузки.
  • «Минимальные права»: давайте пользователям минимально необходимые привилегии.
  • «Защищённый путь»: предпочитайте TLS для всех данных и логинов; при возможности — доверенные сертификаты.

Миграция и совместимость

  • При переходе с FTP на FTPS убедитесь, что клиенты поддерживают explicit FTPS (FTPES). Старые клиенты могут требовать implicit FTPS на порту 990.
  • Для перехода на SFTP потребуется настроить SSH и, возможно, изменить рабочие процессы клиентов.

Быстрый план восстановления (rollback)

  1. Если новая конфигурация привела к недоступности сервиса, восстановите резервную копию конфигурации:
$ sudo cp /etc/vsftpd.conf.orig /etc/vsftpd.conf
$ sudo systemctl restart vsftpd
  1. Проверка UFW: при ошибке доступа временно разрешите 20–21 и диапазон пассивных портов.
  2. Если сертификат некорректен, верните старый сертификат или используйте временный самоподписанный для восстановления работы.

Краткое резюме

  • vsftpd остаётся надёжным FTP-решением; FTPS (FTP по TLS) позволяет сохранить совместимость с FTP-клиентами и при этом обеспечить шифрование.
  • Важны: chroot, правильные права на каталоги, открытые пассивные порты и корректная конфигурация сертификатов.
  • Рассмотрите SFTP как более современную и простую альтернативу, если это возможно.

Если остались вопросы или нужна помощь с конкретной конфигурацией (например, pasv_address за NAT, автоматическое обновление Let’s Encrypt для FTPS или интеграция с системой управления пользователями), опишите окружение — я помогу с точными командами и примерами.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Несколько аккаунтов Skype: Multi Skype Launcher
Программное обеспечение

Несколько аккаунтов Skype: Multi Skype Launcher

Журнал для работы: повысить продуктивность
Productivity

Журнал для работы: повысить продуктивность

Персональные звуки уведомлений на Android
Android.

Персональные звуки уведомлений на Android

Скачивание шоу Hulu для офлайн‑просмотра
Стриминг

Скачивание шоу Hulu для офлайн‑просмотра

Microsoft Start: персонализированная новостная лента
Новости

Microsoft Start: персонализированная новостная лента

Как изменить имя в Epic Games быстро
Гайды

Как изменить имя в Epic Games быстро