Как безопасно передавать файлы по SFTP вместо FTP: пошаговое руководство
Полный переход с FTP на SFTP: от установки сервера до скриптов и типичных ошибок
Почему FTP пора заменить на SFTP
Протокол FTP был создан в 1970-х, когда о шифровании трафика почти не думали. Логин, пароль и содержимое файлов передаются в открытом виде — любой, кто находится в той же сети (Wi-Fi в кафе, провайдер, злоумышленник на маршрутизаторе), может перехватить учётные данные и данные. Даже FTPS (FTP over SSL) часто настраивают с самоподписанными сертификатами и оставляют открытыми дополнительные порты.
SFTP (SSH File Transfer Protocol) — это не «FTP с шифрованием», а отдельный протокол, работающий поверх SSH. Он шифрует весь канал, использует один порт (по умолчанию 22), умеет аутентификацию по ключам и легко автоматизируется. В этом гайде — как перейти с FTP на SFTP без боли: настроить сервер, клиент, ключи, права и скрипты.
Что понадобится
Сервер с Linux (Ubuntu/Debian/CentOS) и доступом по SSH.
Права sudo или root.
Клиентская машина: Linux, macOS или Windows (OpenSSH, WinSCP, FileZilla).
Базовое понимание командной строки.
Резервная копия данных, которые сейчас передаются по FTP.
Шаг 1. Проверьте, что SSH уже работает
SFTP почти всегда идёт в комплекте с SSH-сервером. Подключитесь к серверу по SSH:
ssh user@your-serverЕсли подключение прошло — SSH-сервер установлен. Проверьте статус:
sudo systemctl status sshЕсли SSH не установлен (например, на минимальном образе), поставьте:
sudo apt update && sudo apt install openssh-server
sudo systemctl enable --now sshДля CentOS/RHEL используйте sudo dnf install openssh-server.
Шаг 2. Убедитесь, что подсистема SFTP включена
Откройте конфиг SSH:
sudo nano /etc/ssh/sshd_configНайдите строку Subsystem sftp. Она должна выглядеть так:
Subsystem sftp /usr/lib/openssh/sftp-serverВ некоторых дистрибутивах путь может быть /usr/libexec/openssh/sftp-server. Если строка закомментирована — раскомментируйте. Сохраните файл и перезапустите SSH:
sudo systemctl restart sshТеперь SFTP доступен по тому же порту, что и SSH.
Шаг 3. Создайте отдельного пользователя для передачи файлов
Не стоит использовать root или личную учётную запись для файловых операций. Создайте отдельного пользователя:
sudo adduser fileuserЗадайте надёжный пароль. Если планируете только ключи, пароль можно оставить заблокированным, но для первого входа он пригодится.
Создайте каталог для файлов и назначьте владельца:
sudo mkdir -p /srv/sftp/fileuser/upload
sudo chown fileuser:fileuser /srv/sftp/fileuser/upload
sudo chmod 755 /srv/sftp/fileuserШаг 4. Ограничьте пользователя только SFTP (chroot)
Чтобы пользователь не мог ходить по всей файловой системе, включите chroot. В /etc/ssh/sshd_config добавьте в конец:
Match User fileuser
ChrootDirectory /srv/sftp/fileuser
ForceCommand internal-sftp
AllowTcpForwarding no
X11Forwarding no
PasswordAuthentication yesВажно: ChrootDirectory и все родительские каталоги должны принадлежать root и не быть доступны на запись группе и остальным. Иначе SSH откажется запускать сессию.
sudo chown root:root /srv/sftp /srv/sftp/fileuser
sudo chmod 755 /srv/sftp /srv/sftp/fileuserПерезапустите SSH и проверьте вход:
sftp fileuser@your-serverВы должны оказаться в корне chroot и видеть только каталог upload.
Шаг 5. Настройте аутентификацию по ключам
Пароли можно подбирать или перехватывать. Ключи надёжнее и удобнее для автоматизации. На клиенте сгенерируйте пару:
ssh-keygen -t ed25519 -C "fileuser@client"Нажмите Enter, чтобы сохранить в ~/.ssh/id_ed25519, и задайте парольную фразу (passphrase) для защиты ключа.
Скопируйте публичный ключ на сервер:
ssh-copy-id fileuser@your-serverЕсли ssh-copy-id недоступен, добавьте содержимое ~/.ssh/id_ed25519.pub вручную в /home/fileuser/.ssh/authorized_keys на сервере.
Проверьте вход без пароля:
sftp -i ~/.ssh/id_ed25519 fileuser@your-serverПосле успешной проверки можно отключить пароли для этого пользователя, заменив в блоке Match PasswordAuthentication yes на no.
Шаг 6. Подключайтесь из графических клиентов
Если вы привыкли к FTP-клиентам, переход почти незаметен:
FileZilla: создайте сайт, протокол выберите SFTP — SSH File Transfer Protocol, порт 22, укажите логин и ключ (Настройки → SFTP → добавить ключ).
WinSCP: новый сеанс, протокол SFTP, хост, порт 22, имя пользователя, затем выберите файл приватного ключа.
Cyberduck: подключение OpenSSH/SFTP, укажите сервер и ключ.
В графических клиентах удобно перетаскивать файлы, но для регулярных задач лучше использовать командную строку или скрипты.
Шаг 7. Передавайте файлы из командной строки
Интерактивный режим:
sftp fileuser@your-serverВнутри доступны команды ls, cd, put, get, mkdir, rm. Например:
put localfile.txt /upload/
get /upload/report.csv ./report.csvДля одиночной передачи без входа в интерактивный режим используйте scp (тоже поверх SSH):
scp localfile.txt fileuser@your-server:/upload/Но помните: scp не умеет возобновлять передачу и хуже подходит для больших файлов.
Шаг 8. Автоматизируйте передачу с помощью скриптов
Для регулярной выгрузки используйте sftp в пакетном режиме. Создайте файл upload.batch:
put /local/data/*.csv /upload/
byeЗапустите:
sftp -b upload.batch -i ~/.ssh/id_ed25519 fileuser@your-serverКлюч -b читает команды из файла и завершает сессию. Это удобно для cron:
0 3 * * * /usr/bin/sftp -b /home/user/upload.batch -i /home/user/.ssh/id_ed25519 fileuser@serverДля двусторонней синхронизации рассмотрите rsync через SSH:
rsync -avz -e "ssh -i ~/.ssh/id_ed25519" /local/data/ fileuser@your-server:/upload/rsync докачивает только изменения и умеет возобновлять передачу.
Шаг 9. Ограничьте доступ по IP и порту
Смените стандартный порт SSH, чтобы уменьшить шум от ботов. В /etc/ssh/sshd_config:
Port 2222Не забудьте открыть новый порт в фаерволе и обновить правила. Для UFW:
sudo ufw allow 2222/tcp
sudo ufw delete allow 22/tcpОграничьте доступ по IP через Match Address или фаервол. Например, разрешите только офисную подсеть:
Match User fileuser Address 203.0.113.0/24
ChrootDirectory /srv/sftp/fileuser
ForceCommand internal-sftpШаг 10. Включите логирование и мониторинг
SFTP-сессии логируются в /var/log/auth.log (Debian/Ubuntu) или /var/log/secure (RHEL). Проверьте, что события пишутся:
sudo tail -f /var/log/auth.log | grep sftpДля аудита действий пользователя можно поднять уровень логирования SSH (LogLevel VERBOSE), но это увеличит объём логов. Настройте ротацию через logrotate, чтобы диск не переполнился.
Шаг 11. Проверьте права и владельцев
Частая причина ошибок — неверные права. В chroot-окружении:
Корень chroot принадлежит root и не доступен на запись другим.
Каталог для загрузки принадлежит пользователю и доступен на запись.
Файлы не должны быть исполняемыми без необходимости.
Проверьте:
ls -ld /srv/sftp /srv/sftp/fileuser /srv/sftp/fileuser/uploadОжидаемый результат: корень — root:root 755, upload — fileuser:fileuser 755 или 775.
Шаг 12. Отключите старый FTP-сервер
Когда SFTP заработает и вы убедитесь, что все задачи перенесены, остановите и удалите FTP-сервер (vsftpd, proftpd, pure-ftpd):
sudo systemctl stop vsftpd
sudo systemctl disable vsftpd
sudo apt remove vsftpdЗакройте порт 21 в фаерволе. Удалите старые учётные записи FTP, если они больше не нужны. Это снижает поверхность атаки.
Типичные ошибки
1. Chroot не работает из-за прав. Если /srv/sftp/fileuser принадлежит пользователю или доступен на запись группе, SSH откажет в сессии. Корень chroot всегда должен быть root:root и 755. 2. Забыли `ForceCommand internal-sftp`. Без этой строки пользователь может получить полноценный shell, даже если вы хотели только файлы. 3. Использование root для SFTP. Это даёт злоумышленнику полный контроль при компрометации ключа. Всегда отдельный пользователь. 4. Пароль вместо ключа. Пароли уязвимы к перебору. Ключи с passphrase и отключённой парольной аутентификацией надёжнее. 5. Открытый порт 22 для всех. Ограничьте доступ по IP или смените порт, чтобы снизить количество автоматических атак. 6. Нет резервных копий. Перед миграцией убедитесь, что данные не потеряются, если что-то пойдёт не так. 7. Игнорирование логов. Без мониторинга вы не узнаете о неудачных попытках входа и подозрительной активности.
FAQ
Чем SFTP отличается от FTPS? FTPS — это FTP с шифрованием TLS, часто использует несколько портов и сложнее в настройке. SFTP — отдельный протокол поверх SSH, один порт, проще в автоматизации и администрировании.
Можно ли использовать SFTP на Windows-сервере? Да, есть OpenSSH для Windows, а также сторонние серверы. Но чаще SFTP поднимают на Linux.
Нужен ли отдельный порт для SFTP? Нет, SFTP работает через SSH-порт (по умолчанию 22). Если меняете порт SSH, SFTP автоматически переезжает на него.
Как передавать файлы без ввода пароля? Используйте ключи SSH. Сгенерируйте пару, добавьте публичный ключ в authorized_keys и подключайтесь с приватным ключом.
Что делать, если нужно несколько пользователей с разными каталогами? Создайте блок Match User для каждого или используйте группу Match Group sftpusers с общим chroot и подкаталогами.
Можно ли возобновить прерванную передачу? В sftp есть команда reget и reput для докачки. Для больших файлов удобнее rsync.
Итог
Переход с FTP на SFTP — это не просто смена протокола, а повышение безопасности всей инфраструктуры. Вы шифруете трафик, убираете передачу паролей в открытом виде, получаете гибкое управление доступом и автоматизацию. Начните с установки SSH-сервера, создайте отдельного пользователя, настройте chroot и ключи, проверьте передачу из клиента, а затем отключите старый FTP. Такой подход защитит данные и упростит администрирование в долгосрочной перспективе.
Читайте также
Комментарии
Комментарии доступны только зарегистрированным пользователям. Войти
- Пока нет комментариев. Будьте первым.



