Блог компании 3v-Hosting

Как использовать SFTP для безопасной передачи файлов на удалённый сервер

Администрирование

12 мин.


Работа любой IT-инфраструктуры связана с необходимостью передачи файлов между узлами, будь то передача с локальной машины на сервер и обратно, а также между окружениями или серверами. И почти всегда при передаче файлов по сети существует риск перехвата данных или их утечки, особенно в случае допущения ошибок в настройке. Причём речь может идти не только о каких-то чувствительных данных вроде бэкапов или конфигураций с секретами. Даже передача казалось бы обычных файлов, как например, загрузка сайта или выгрузка логов, может стать точкой входа для атаки на инфраструктуру, если ваш канал связи не был защищён. Добавьте сюда обыкновенный человеческий фактор и тогда риск перестает быть гипотетическим. Стоит кому либо выставить неправильные права, установить слабые пароли или оставить открытыми лишние порты и можете считать, что ваш сервер уже скомпрометирован.

Долгое время для задач передачи файлов использовался обычный FTP. Это простой и понятный инструмент, который поддерживается практически везде. Но с точки зрения безопасности это решение из другой, ушедшей эпохи. Дело в том, что FTP передаёт данные в открытом виде, то есть все ваши логины, пароли и содержимое файлов передаются как есть. Передачу файлов по FTP можно представить себе как отправку секретного письма но без конверта, когда любой, кто оказался "по пути", может прочитать всё, что вы написали.

SFTP (SSH File Transfer Protocol) решает эту проблему без лишнего усложнения инфраструктуры. Он не требует отдельного сервиса, не заставляет открывать дополнительные порты и не добавляет лишних точек отказа. Вместо этого он использует уже существующее SSH-соединение и встраивает в него передачу файлов и в результате весь ваш трафик шифруется по умолчанию.

Как вы уже наверное поняли, SFTP - это передача файлов поверх SSH (Secure Shell), протокола, специально разработанного для защищенных соединений.

 

 

 

 

Ключевые различия FTP, SFTP и FTPS

В настоящее время для передачи файлов наиболее часто используются три протокола: FTP, SFTP и FTPS. Но между этими протоколами существует архитектурная разница, существенно отличающая один от другого в разрезе безопасности информации.

Понятно, что все три решают одну и ту же задачу - передачу файлов по сети, но делают они это по-разному. Обычный FTP - это классический протокол передачи данных, который работает без шифрования. Он очень простой, но, к большому сожалению, весьма уязвимый. В FTPS попытались добавить уровень безопасность, оборачивая обычный FTP в защищенное SSL/TLS соединение, но при этом сохраняя его сложную модель с множеством соединений. В отличие от первых двух SFTP идёт другим путём. Он изначально строится поверх SSH и работает как единый защищённый канал.

Отсюда вытекают различия не только в безопасности, но и в настройке и в поведении, например какие порты используются, как проходит аутентификация, насколько сложно настроить firewall, а также как соединение ведёт себя в условиях реальных сетей.

Поэтому перед тем как выбирать протокол под конкретную задачу, важно понимать эту разницу не на уровне терминов, а на уровне принципов работы. Ниже мы попробовали привести сжатое сравнение этих трёх протоколов в вид простой сравнительной таблицы, которая помогает быстрее увидеть различия и понять, в рамках каких задач будет уместен тот или иной инструмент.

Протокол Шифрование Порты Аутентификация Сложность настройки Лучшие сценарии применения
FTP Нет 21 + динамические Логин/пароль Низкая Внутренние сети без требований к безопасности, временные тестовые стенды, legacy-системы
FTPS Есть (SSL/TLS) 21 + динамические Логин/пароль Средняя Интеграции с корпоративными системами (например, банки, старые ERP), где требуется TLS, но используется FTP-совместимость
SFTP Есть (SSH) 22 Ключи / пароль Низкая DevOps и production-инфраструктура, бэкапы, деплой, обмен файлами между серверами, работа через нестабильные сети и NAT

 

 

 

 

Как SFTP работает под капотом

Внутри всё достаточно просто, так как завязано на стандартный SSH. Клиент устанавливает защищённое соединение с сервером, проходит аутентификацию, а дальше запускается подсистема SFTP.

Команды вроде ls, put, get (подробнее ниже) - это не обычные shell-команды, которые выполняются в системе сервера. Это операции самого SFTP-протокола, которые передаются и обрабатываются внутри защищённого соединения.

Проще говоря, при работе через SFTP вы не получаете доступ к командной строке самого удаленного сервера. Вы работаете с файловой системой через набор заранее определённых действий, таких как посмотреть список файлов, загрузить, скачать или удалить.

Зато безопасность закрывает большинство возможных вопросов. Шифрование - симметричное, ключи - асимметричные, обмен проходит через проверенные алгоритмы, поэтому если сервер настроен нормально, то перехватить данные почти нереально.

Важно также понимать, что SFTP не является надстройка, в привычном смысле, а является отдельной подсистемой внутри стандартного SSH-сервера. В OpenSSH эта подсистема называется internal-sftp. И когда клиент подключается, то сервер может либо дать ему полноценный shell, либо сразу "запереть" его в рамках SFTP-среды без возможности выполнения команд. Эта особенность активно используется для ограничения доступа к серверу, например для клиентов или подрядчиков, которым нужен только доступ к файлам, но у которых не должно быть возможности выполнения команд на сервере.

С точки зрения сетевого взаимодействия всё тоже выглядит довольно аккуратно, так как в отличие от FTP и FTPS, где используется несколько соединений (control + data), SFTP работает через одно TCP-соединение. Это сильно упрощает жизнь при работе за NAT, через firewall или в облачных инфраструктурах.

Но конечно, как и везде, в SFTP тоже есть свои минусы. Таким минусом является буферизация при работе с файлами, когда SFTP разбивает передачу на пакеты и обрабатывает их последовательно. Это конечно делает его более надёжным, но иногда менее быстрым по сравнению с более прямолинейными инструментами вроде SCP. Зато при нестабильных соединениях SFTP ведёт себя намного более предсказуемо и реже обрывает передачу.

 

Какие алгоритмы шифрования используются

Как мы уже сказали выше - SFTP наследует всё от SSH. Поэтому в типичной конфигурации используются такие протоколы:

  • AES-256 - который де-факто сейчас является стандартом для шифрования;
  • ChaCha20 - этот протокол работает быстрее на системах с устаревшими и слабыми CPU;
  • ED25519 - современный алгоритм для ключей.

 

Дополнительно в процессе соединения используются ещё два протокола:

  • ECDH (Elliptic Curve Diffie-Hellman) - используется для безопасного обмена ключами;
  • HMAC (например, hmac-sha2-256) - используется для проверки целостности данных.

 

То есть мы видим, что это не просто какое-то шифрование, а это вполне зрелый стек, проверенный годами, множеством аудитов и реальными атаками. И в большинстве случаев он гораздо безопаснее, чем любая самописная защита поверх небезопасного протокола. Да и зачем изобретать велосипед второй раз.

 

 

 

 

Подготовка и настройка SFTP на сервере

Для того, чтобы начать работу с SFTP на Linux сервере, в большинстве случаев ничего дополнительно устанавливать не нужно, так как если на сервере уже есть SSH, значит SFTP тоже работает. По умолчанию включен доступ без каких-либо ограничений, но чтобы SFTP действительно стал безопасным и удобным, нам нужно его немного донастроить.

Наша задача состоит в создании отдельного пользователя для работы с файлами и выделении ему своей отделной директории, которой и будет ограничиваться его доступ, без возможности зайти в систему через shell.

Начнём с создания пользователя:

sudo adduser sftpuser

 

Дальше нам нужно подготовить директорию и тут всплывает одна из наиболее частых ошибок, когда этой директории прописываются неправильные права, из-за которых SFTP либо не запускается вовсе, либо работает небезопасно. Каталог, в который будет "заперт" пользователь, должен принадлежать root:

sudo mkdir -p /home/sftpuser/uploads
sudo chown root:root /home/sftpuser
sudo chmod 755 /home/sftpuser

 

А уже внутренняя папка, куда пользователь будет загружать файлы, назначается ему:

sudo chown sftpuser:sftpuser /home/sftpuser/uploads

 

После этого нам нужно настроить сам SSH. Открывайте файл /etc/ssh/sshd_config, и в конец добавляете такой блок:

Match User sftpuser
    ChrootDirectory /home/sftpuser
    ForceCommand internal-sftp
    X11Forwarding no
    AllowTcpForwarding no

 

С помощью этих инструкций пользователь ограничивается одной директорией, не получает доступ к командной строке и может использовать только SFTP.

После изменения конфигурации остаётся только перезапустить SSH-сервер:

sudo systemctl restart ssh

Теперь можно проверить подключение с удаленного компьютера:

sftp sftpuser@server_ip

 

Если всё настроено правильно, то пользователь окажется внутри своей директории и не сможет выйти за её пределы. При этом у него не будет доступа к shell, а будет доступ исключительно к файлам внутри этой директории.

На практике этого достаточно для большинства задач. Мы получили простой и безопасный файловый доступ без лишних надстроек и излишней сложности.

 

Аутентификация по ключам

После базовой настройки SFTP логичным и правильным будет сразу закрыть ещё один важный момент, а именно аутентификацию. Как вы увидели в прошлом примере, по умолчанию используется аутентификация по паролю, но это самое слабое место в цепочке, потому как даже сложные пароли весьма подвержены перебору, утечкам и банальному человеческому фактору.

Проблему можно решить используя вместо пароля пары ключей.

Для этого генерируем ключ на вашем рабочем месте, с которого вы будете подключаться к серверу:

ssh-keygen -t ed25519

По умолчанию ключи сохраняются в ~/.ssh/. Обычно достаточно просто нажать Enter на всех шагах, но при желании можно задать passphrase - дополнительную защиту для приватного ключа.

 

Дальше ключ нужно передать на удаленный сервер с помощью команды:

ssh-copy-id user@server_ip

 

Эта команда автоматически добавит публичный ключ в файл ~/.ssh/authorized_keys на сервере и выставит нужные права. После этого можно сразу проверить подключение, для которого пароль уже не потребуется.

 

Если ssh-copy-id недоступен, то же самое можно сделать вручную, просто скопировав содержимое файла ~/.ssh/id_ed25519.pub и добавив его в ~/.ssh/authorized_keys на сервере.

 

После того как вход по ключу заработает, парольную аутентификацию лучше отключить насовсем. Для этого в /etc/ssh/sshd_config поменяйте параметр:

PasswordAuthentication no

 

И затем перезапустите ещё раз SSH сервис:

sudo systemctl restart ssh

 

ВАЖНО! Перезагрузку SSH сервиса делайте только после проверки ключей, иначе вы можете потерять доступ к серверу.

Вот по сути и вся настройка. Теперь перейдём к командам самого SFTP.

 

 

 

Базовые команды для работы с SFTP

После того как вы подключились через SFTP к удаленному серверу вы попадаете в интерактивную среду для работы с файлами. Команды здесь простые, но важно понимать, что часть из них работает с удалённой системой, а часть - с вашей локальной системой. Ниже мы перечислим наиболее часто используемые команды и кратко опишем, что они делают.

  • ls - показывает список файлов и директорий на сервере. Можно использовать с флагами (например, ls -l) для более подробного вывода;
  • cd - меняет текущую директорию на сервере;
  • put - загружает файл с локальной машины на сервер (например, put file.txt);
  • get - скачивает файл с сервера на локальную машину;
  • put -r - загружает директорию целиком вместе с содержимым;
  • get -r - скачивает директорию с сервера рекурсивно;
  • lcd - меняет текущую директорию на локальной машине (local cd);
  • mkdir - создаёт новую директорию на сервере;
  • rm - удаляет файл на сервере;

 

Этого набора вполне достаточно для выполнения большинства задач, таких как, например, загрузка файлов сайта на сервер, передачи бэкапов, работы с логами и т.п. Остальные команды используются гораздо реже и обычно зависят от конкретного клиента. С полным перечнем команд вы можете ознакомиться в любом доступном мануале, например тут.

 

 

 

Графические клиенты

Очевидно, что далеко не всем удобно работать через терминал, особенно когда речь идёт о передаче большого количества различных файлов. В таких случаях гораздо проще использовать графический клиент, который по сути является тем же SFTP, только с привычным оконным интерфейсом проводника.

SFTP поддерживают почти все популярные клиенты, такие как FileZilla, WinSCP, Cyberduck и другие. С точки зрения пользователя подключение в таких клиентах выглядит так же, как и подключение к обычному FTP-серверу, но с той разницей, что нужно выбрать в выпадающем меню SFTP вместо FTP протокола. А дальше при настройке соединения указываются все те-же базовые параметры:

  • Host - IP-адрес или домен удаленного сервера;
  • Port - стандартный SSH порт 22 или тот, который вы указали в настройках SSH на удаленном сервере;
  • User - имя пользователя, логин;
  • Key file - путь к приватному ключу, если вы используете аутентификация по ключам.

 

После подключения открывается привычный интерфейс, поделенный на два окна, локальные файлы слева, сервер - справа. Файлы можно просто перетаскивать мышкой, копировать, удалять и переименовывать. То есть доступны все те-же возможности, что и в консоли, только без необходимости запоминать команды.

 

 

 

 

Ограничения и подводные камни

Конечно, SFTP - это удобный и безопасный инструмент, но к сожалению не универсальный. И в некоторых сценариях он может уступать другим решениям, что стоит учитывать заранее при планировании своих работ.

Во-первых, как мы уже упоминали в начале статьи, его слабым местом является скорость передачи данных, ведь SFTP работает аккуратно, с проверкой и буферизацией данных, из-за чего иногда уступает в производительности более прямолинейным инструментам вроде простого SCP. Эта разница обычно не критичная, но при передаче больших файлов может быть вполне заметной.

Во-вторых, отсутствие параллельности, так как на уровне протокола SFTP не поддерживает многопоточную передачу данных. Правда некоторые клиенты обходят это ограничение своими собственными средствами, но это уже их внутренняя реализация, а не возможности самого SFTP.

И, наконец, необходимость уделять особое внимание работе с правами доступа, так как неправильная настройка прав на директорию может привести к тому, что пользователь увидит больше, чем должен, а в случае получения доступа к этой директории злоумышленника - возможность повышения привилегий вплоть до root. Правда это не проблема SFTP как такового, а скорее вопрос внимательности при настройке и администрировании сервера.

В целом эти нюансы не делают SFTP плохим выбором - просто важно понимать его возможности и границы его применения.

Если попытаться упростить, то выбор между наиболее популярными инструментами может выглядеть так:

  • SFTP - универсальный вариант для безопасной передачи файлов. Удобен, понятен и подходит для большинства задач;
  • SCP - быстрее за счёт простоты, но менее гибкий, почему в последнее время постепенно уходит на второй план;
  • rsync - лучший выбор для инкрементальной синхронизации и бэкапов, так как передаёт только изменения, а не файлы целиком, что может существенно экономить трафик.

 

На практике, как обычно, всё зависит от конкретной задачи. Если вам нужно просто передать файлы с одного устройства на другое, то SFTP вполне закрывает этот вопрос. Но если вам важна скорость или оптимизация трафика, тогда есть смысл посмотреть в сторону альтернатив.

 

 

 

 

 

FAQ по SFTP

 

Чем SFTP отличается от FTP?

SFTP шифрует весь трафик - включая логины, команды и содержимое файлов. В отличие от него, FTP передаёт данные в открытом виде, из-за чего его использование в интернете считается небезопасным.

 

SFTP и FTPS - это одно и то же?

Нет, это разные протоколы. FTPS - это классический FTP с добавленным поверх него SSL/TLS шифрованием, а SFTP изначально построен поверх протокола SSH и работает как единый защищённый канал.

 

Какой порт использует SFTP?

По умолчанию используется порт 22 - тот же, что и для SSH. Это упрощает настройку, так как не требуется открывать дополнительные порты.

 

Можно ли использовать SFTP без SSH?

Нет, SFTP не существует отдельно от SSH. Это подсистема SSH, которая работает внутри защищённого соединения.

 

Насколько безопасен SFTP?

При использовании SSH-ключей и правильной настройке сервера SFTP считается очень надёжным. Он защищает не только данные, но и сам процесс передачи от перехвата.

 

Что выбрать: SFTP, SCP или rsync?

SFTP подходит для большинства задач, где нужна простота и безопасность. SCP быстрее, но менее гибкий, а rsync лучше использовать для синхронизации и передачи только изменённых данных.

 

Почему SFTP не даёт выполнить команды на сервере?

Потому что SFTP - это протокол для работы с файлами, а не удалённый доступ к системе в полном смысле. Он намеренно ограничен, чтобы повысить безопасность и снизить риск ошибок.

 

 

 

 

Выводы

Итак, мы выяснили, что SFTP является логичным продолжением того, что уже есть на любом Linux-сервере, а именно SSH протокола. Для его использования вам не нужна установка каких-то дополнительных сервисов, не нужно открывать лишние порты и в принципе, без какой-либо сложной настройки вы получаете качественный защищённый канал для передачи файлов.

Конечно, некоторую настройку произвести всё-же стоит. Так, например, создав отдельного пользователя для передачи файлов, ограничив права доступа к рабочей директории и установив её владельца (chroot), а также настроив аутентификацию по ключам - вы превращаете SFTP в надёжный и изолированный инструмент для работы с файлами.

При этом стоит понимать и его ограничения. Он не самый быстрый и не самый продвинутый с точки зрения синхронизации. Но в большинстве практических задач, таких как деплой приложений, снятие бэкапов и простой обмен файлами, он вполне закрывает все потребности.

И именно поэтому всё чаще используется данный инструмент, так как простота настройки, предсказуемость работы и безопасность - это то, что в реальной инфраструктуре ценится превыше всего.

3v-Hosting Team

Автор

3v-Hosting Team

Команда 3v-Hosting - это группа преданных своему делу инженеров и операторов, которые занимаются созданием и поддержкой основы наших сервисов. Каждый день мы погружаемся в мир виртуальных и выделенных серверов, занимаясь всем, от развертывания и мониторинга до устранения реальных проблем, возникающих в производственных средах. Большинство наших статей основано на практическом опыте, а не просто на теории. Мы делимся своими наблюдениями о проблемах, с которыми сталкиваемся: перебоях в производительности, ошибках в настройке, тонкостях сетевых решений и архитектурных выборах, влияющих на стабильность и надежность. Наша миссия проста - мы хотим делиться знаниями, которые позволят вам управлять своими проектами с меньшим количеством неожиданностей и гораздо большей предсказуемостью.

Установка Nginx на AlmaLinux 9
Установка Nginx на AlmaLinux 9

Установка и настройка Nginx на AlmaLinux 9: команды, запуск, firewall, конфиги, virtual host и частые ошибки. Пошаговая инструкция для быстрого старта и стабиль...

8 мин