# 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/uk/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/uk/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/uk/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/uk/kb/sftp-vsftpd-nastroika/
