sadrix logoSadriX
Минцифры готовит обязательную регистрацию IMEI смартфонов, купленных за границей
Гайды

Как безопасно передавать файлы по SFTP вместо FTP: пошаговое руководство

Полный переход с FTP на SFTP: от установки сервера до скриптов и типичных ошибок

09 386 просмотров6 мин
0
Поделиться:TelegramVK

Почему 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. Такой подход защитит данные и упростит администрирование в долгосрочной перспективе.

Читайте также

Комментарии

Комментарии доступны только зарегистрированным пользователям. Войти

  • Пока нет комментариев. Будьте первым.