# SFTP и vsftpd: безопасная передача файлов на VDS

> SFTP и vsftpd на VDS: как передавать файлы по шифрованному каналу, настроить chroot для SFTP-пользователя и включить TLS в vsftpd.conf.

## Чем SFTP отличается от обычного FTP и vsftpd

SFTP (SSH File Transfer Protocol) — это передача файлов поверх обычного SSH-соединения на порту 22. Отдельный сервер для него не нужен: если SSH уже работает — см. статью про [первое подключение к VDS по SSH](https://www.zevshost.net/ru/kb/podklyuchenie-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](https://www.zevshost.net/ru/kb/ssh-hardening-sshd-config/).

## Установка и настройка 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](https://www.zevshost.net/ru/kb/ufw-firewall-vps/). Для SFTP отдельных портов открывать не нужно — используется тот же порт 22, что и для SSH.

## Что выбрать: SFTP или vsftpd

Итоговый чек-лист:

- Для нового проекта без привязки к старым FTP-клиентам используйте SFTP — меньше портов, встроенное шифрование, один сервис вместо двух.
- Для SFTP-пользователей всегда настраивайте chroot, чтобы ограничить доступ их собственной папкой.
- Если требуется именно vsftpd — обязательно включайте `ssl_enable` и запрещайте анонимный вход.
- Для vsftpd откройте порт 21 и диапазон пассивных портов в файрволе, для SFTP хватает порта 22.
- Периодически проверяйте список пользователей с SFTP/FTP-доступом и удаляйте неактуальных.

---

Источник: https://www.zevshost.net/ru/kb/sftp-vsftpd-nastroika/
