Чем SFTP отличается от обычного FTP и vsftpd
SFTP (SSH File Transfer Protocol) — это передача файлов поверх обычного SSH-соединения на порту 22. Отдельный сервер для него не нужен: если SSH уже работает — см. статью про первое подключение к VDS по SSH — SFTP уже доступен. Весь трафик, включая логин и пароль, шифруется автоматически.
vsftpd — это отдельный сервер классического FTP, который по умолчанию передаёт данные и пароли в открытом виде. Чтобы получить шифрование, vsftpd настраивают явно на FTPS (FTP поверх TLS) — это другой протокол, со своими портами и особенностями пассивного режима. Без жёсткой привязки к старым FTP-клиентам для новых проектов проще и безопаснее сразу использовать SFTP.
SFTP через SSH: пользователь без shell-доступа
Для передачи файлов не обязательно давать пользователю полноценный доступ к командной строке. Создайте отдельного пользователя с оболочкой, ограниченной только SFTP:
useradd -m -s /usr/sbin/nologin sftpuser
passwd sftpuser
Оболочка nologin запрещает вход по SSH в обычном смысле, но не мешает SFTP-подсистеме, потому что она обрабатывается отдельно от командной оболочки на уровне конфигурации sshd.
Ограничение пользователя своей папкой (chroot)
Чтобы пользователь не мог выйти за пределы своей директории и увидеть остальную файловую систему, настройте chroot в /etc/ssh/sshd_config:
Match User sftpuser
ChrootDirectory /home/sftpuser
ForceCommand internal-sftp
AllowTcpForwarding no
X11Forwarding no
Для работы chroot директория /home/sftpuser и все родительские папки до неё обязаны принадлежать root и не иметь права записи для группы и остальных:
chown root:root /home/sftpuser
chmod 755 /home/sftpuser
mkdir /home/sftpuser/upload
chown sftpuser:sftpuser /home/sftpuser/upload
После правки конфигурации проверьте синтаксис и перезапустите SSH:
sshd -t
systemctl restart sshd
Подробнее про безопасную настройку самого sshd — в статье про SSH Hardening.
Установка и настройка vsftpd с TLS
Если классический FTP всё же требуется — скажем, для legacy-клиента — устанавливайте vsftpd и сразу включайте шифрование:
apt install vsftpd -y
В файле /etc/vsftpd.conf включите TLS и запретите анонимный доступ:
anonymous_enable=NO
ssl_enable=YES
rsa_cert_file=/etc/ssl/certs/vsftpd.pem
rsa_private_key_file=/etc/ssl/private/vsftpd.key
force_local_data_ssl=YES
force_local_logins_ssl=YES
Без последних двух параметров сервер разрешит подключение и без шифрования, что сводит на нет весь смысл сертификата.
Firewall и пассивный режим FTP
FTP использует два соединения: управляющее на порту 21 и отдельное для передачи данных. В пассивном режиме порт для данных выбирается из диапазона, который нужно явно открыть в файрволе. Задайте диапазон в конфиге:
pasv_min_port=40000
pasv_max_port=40100
И откройте порты 21 и 40000-40100 — как настроить правила файрвола на VDS, описано в статье про настройку UFW. Для SFTP отдельных портов открывать не нужно — используется тот же порт 22, что и для SSH.
Что выбрать: SFTP или vsftpd
Итоговый чек-лист:
- Для нового проекта без привязки к старым FTP-клиентам используйте SFTP — меньше портов, встроенное шифрование, один сервис вместо двух.
- Для SFTP-пользователей всегда настраивайте chroot, чтобы ограничить доступ их собственной папкой.
- Если требуется именно vsftpd — обязательно включайте
ssl_enableи запрещайте анонимный вход. - Для vsftpd откройте порт 21 и диапазон пассивных портов в файрволе, для SFTP хватает порта 22.
- Периодически проверяйте список пользователей с SFTP/FTP-доступом и удаляйте неактуальных.