SFTP (SSH File Transfer Protocol) — протокол безопасной передачи файлов, работающий поверх SSH. Несмотря на схожесть с FTP в названии, SFTP — отдельный протокол, не связанный с FTP технически. Все данные, включая имена файлов, содержимое и команды, передаются в зашифрованном SSH-туннеле. Стандартный порт — 22 (тот же, что у SSH).
Как работает SFTP
SFTP — подсистема SSH, запускаемая сервером при подключении клиента: ssh user@server -s sftp. Клиент отправляет бинарные команды (SSH_FXP_OPEN, SSH_FXP_READ, SSH_FXP_WRITE), сервер отвечает через тот же шифрованный канал. Не нужен отдельный порт для данных — это упрощает прохождение через файрвол по сравнению с FTP active/passive mode.
SFTP vs FTP vs FTPS vs SCP
| Параметр | SFTP | FTP | FTPS | SCP |
|---|---|---|---|---|
| Шифрование | SSH | Нет | TLS | SSH |
| Порт данных | Один (22) | 20+21 или random | 21+random | 22 |
| Файловые операции | Полные (mv, rm, mkdir) | Полные | Полные | Только копирование |
| Прокси/NAT | Просто | Сложно | Сложно | Просто |
Настройка SFTP на сервере
SFTP включён по умолчанию в OpenSSH. Для ограниченного SFTP-доступа (только файлы, без shell) в /etc/ssh/sshd_config:
Match User ftpuser
ForceCommand internal-sftp
PasswordAuthentication yes
ChrootDirectory /var/www/sites/%u
AllowTcpForwarding no
X11Forwarding no
ChrootDirectory ограничивает пользователя указанной директорией — он не видит остальную файловую систему. Важно: директория chroot должна принадлежать root (не пользователю).
История
SFTP разработан командой SSH Communications Security как часть SSH-2 протокола в 1997–1999 годах. Стандартизирован IETF как SSH File Transfer Protocol (draft-ietf-secsh-filexfer). Версии: SFTP v3 (наиболее распространённая) — OpenSSH, версии 4–6 расширяют возможности. OpenSSH — наиболее распространённая реализация, предустановлена на большинстве Linux-дистрибутивов.
Клиенты SFTP
Графические: FileZilla (кросс-платформенный, бесплатный), WinSCP (Windows), Cyberduck (macOS/Windows). CLI: sftp user@server (встроен в OpenSSH), RSYNC через SSH (rsync -avz -e ssh). Программные библиотеки: paramiko (Python), JSCH (Java), libssh2 (C). На хостинге SFTP-доступ предоставляется почти везде — в отличие от SSH, который на shared-хостинге часто отсутствует.
История SFTP
SFTP разработан как расширение протокола SSH 2.0 в конце 1990-х годов. Первоначально описан в Internet Draft IETF (draft-ietf-secsh-filexfer) в 1998–2006 годах; официальный RFC так и не был опубликован, но SFTP версии 3 (OpenSSH) стал де-факто стандартом. OpenSSH включает SFTP-сервер (sftp-server) начиная с версии 2.5.0 (2001). До SFTP безопасная передача файлов требовала SCP (Secure Copy, 1995) или FTP поверх SSH-туннеля.
SFTP vs SCP vs FTP vs FTPS
| Протокол | Шифрование | Возобновление | Управление файлами | Порт |
|---|---|---|---|---|
| SFTP | SSH (полное) | Да | Полное (mkdir, rm, chmod) | 22 |
| SCP | SSH (полное) | Нет | Только копирование | 22 |
| FTP | Нет | Да (RETR REST) | Полное | 21 |
| FTPS | TLS/SSL | Да | Полное | 21/990 |
На что обращать внимание
SFTP работает на стандартном порту 22 SSH. Для чруt-изоляции SFTP-пользователей (ограничение домашней директорией без доступа к системе) настройте в /etc/ssh/sshd_config:
Match Group sftponly
ChrootDirectory /var/www/%u
ForceCommand internal-sftp
X11Forwarding no
AllowTcpForwarding no
Это позволяет веб-разработчикам загружать файлы через SFTP без доступа к командной строке сервера. SFTP-клиенты: FileZilla, WinSCP, Cyberduck. Программные клиенты: paramiko (Python), JSch (Java), Net::SFTP (Perl).