Протокол SFTP и безопасная передача данных с удаленного сервера

Протокол SFTP и безопасная передача данных с удаленного сервера

Тирекс Тирекс Самый зубастый автор 17 августа 2023

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

Изображение записи

История появления SFTP

Что такое FTP

Перед тем как перейти непосредственно к теме текста, нам нужно затронуть тему FTP. File Transport Protocol, протокол передачи данных, — один из самых старых прикладных протоколов. Его назначение понятно из названия — это протокол для передачи файлов по сети. Сейчас чистый FTP используют нечасто, так как у него есть существенный недостаток — отсутствие каких-либо технологий безопасности. 

Проблемы FTP с безопасной передачей данных

FTP-протокол действительно очень старая технология. Он был разработан еще в далеком 1971-м году и изначально предназначался для передачи данных между объектами военного назначения. Так как изначально протокол планировали применять в узких кругах, вопрос о внедрении какой-либо безопасности не стоял так остро, как в наши дни.

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

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

FTPS как расширение протокола FTP

Решением проблемы стало сплочение двух протоколов — FTP и SSL — в 1996 году. Новый протокол получил название FTPS (File Transfer Protocol + SSL). Еще позднее, с появлением более надежного протокола TLS, FTP стали использовать вкупе и с ним. В итоге FTPS является расширенной версией обычного FTP с добавлением шифрованных сессий от SSL/TLS.

Но в этом тексте мы рассмотрим более подробно не FTPS, а еще более новую версию протокола — SFTP . 

Далее в статье мы будет называть клиентом узел сети, который запрашивает и получает данные, а сервером — узел сети, который отправляет данные. Хотя узлы всегда могут поменяться местами, для большей наглядности мы будем говорить, что TRexclient — всегда только клиент, а SelectelServ — всегда только сервер. В дальнейшем вы поймете, кто такие TRexclient и SelectelServ.

Что такое SFTP

SFTP расшифровывается как Secure File Transfer Protocol. Также букву S можно понимать как SSH, так как SFTP работает с использованием именно этого протокола.

Порядок работы SFTP следующий:

  1. Клиент отправляет запрос на передачу данных на сервер по порту 22. Этот порт используется для безопасного соединения SSH между узлами сети. 
  2. Сервер принимает запрос и шифрует необходимые запрашиваемые данные с помощью SSH.
  3. Сервер отправляет данные клиенту.
  4. Клиент принимает данные и, используя аутентификацию SSH, расшифровывает их для дальнейшего использования.

Преимущества использования SFTP

Самое очевидное преимущество SFTP перед предшественниками — это, конечно же, безопасность и конфиденциальность. Нельзя сказать, что данные, передаваемые с использованием протокола SFTP, невозможно украсть, но сделать это очень сложно.

Среди других преимуществ SFTP можно выделить:

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

Использование SSH (Secure Shell)

SSH внутри протокола SFTP обеспечивает следующие функции:

Аутентификация клиента и сервера. SSH производит аутентификацию на основе пары ключей — открытого и закрытого. Это позволяет точно определить, что клиент, запрашивающий подключение к серверу, является легитимным.

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

Передача данных через единственный порт. Обычный FTP может передавать данные через множество портов. SFTP же, в свою очередь, поддерживает передачу лишь по одному порту. По умолчанию это порт 22, но вы можете изменить его на любой доступный. Ограничение количества портов необходимо для того, чтобы снизить вероятность атаки MITM (человек посередине) путем снижения точек, возможных для прослушивания.

Все это позволяет добиться минимизации шансов взлома сессии злоумышленниками.

Подробнее про SSH, открытые и закрытые SSH-ключи, способы их создания и использования вы можете прочитать в статье «Авторизация на базе ключей SSH».

Сравнение с FTPS

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

Сравнение с FTPS будет более логичным. 

FTPS (использует SSL/TLS) является более простым в использовании, но в то же время менее надежным для защиты свои данные. В свою очередь SFTP (использует SSH) более надежен, но его настройка занимает больше времени.

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

Кроме этого, у FTPS существует еще один недостаток. Мы помним, что SFTP использует лишь один порт для передачи всего трафика между узлами. В то время как FTPS задействует как минимум два: один для инициализации связи между узлами и управления, второй — для передачи данных. 

При каждом последующем запросе данных FTPS будет открывать новый порт для передачи. Это приводит к блокировкам брандмауэра, так как он не может определить цель только что открытого порта (из-за использования SSL/TLS). Брандмауэр блокирует порт для передачи данных. Конечно, можно вручную открывать каждый порт в настройках брандмауэра или делать это сразу для некоторого диапазона, но не думаем, что вам хотелось бы заниматься этим каждый раз при обращении к серверу.

Настройка SFTP на хостинге

Подключение к серверу через SFTP

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

Если вы выполнили все действия согласно инструкции, вы без проблем подключитесь к удаленному узлу по SSH:


    ssh hostname@ip_remote_host

Если вы используете не стандартный 22 порт для SSH, добавьте параметр -p:


    ssh -p port_number hostname@ip_remote_host

После успешного подключения по SSH завершите сессию и проверьте возможность подключения уже по протоколу SFTP. Для этого введите:


    sftp hostname@ip_remote_host

Если вы используете не стандартный 22 порт для SSH, добавьте параметр -P:


    sftp -P port_number hostname@ip_remote_host

Вызов и использование справки SFTP

Подключившись к удаленному узлу по протоколу SFTP, введите команду help или ? для вызова справки:


    sftp> help

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

Порт, используемый SFTP, и его изменение

Стандартным для установления соединения по протоколам SFTP и SSH является порт 22, но это можно изменить. Для примера возьмем порт 6500.

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


    UFW (по умолчанию в Ubuntu):
sudo ufw allow 6500/tcp

FirewallD (по умолчанию в CentOS):
sudo firewall-cmd --permanent --zone=public --add-port=6500/tcpsudo
firewall-cmd --reload

SELinux (используется в CentOS в дополнение к FirewallD):
sudo semanage port -a -t ssh_port_t -p tcp 6500

Iptables:
sudo iptables -A INPUT -p tcp --dport 6500 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT

Далее необходимо изменить порт в схеме конфигурации SSH. Для этого откройте на редактирование файл sshd_config на удаленном узле, который выступает в роли сервера:


    sudo nano /etc/ssh/sshd_config

Внутри файла найдите строку:


    #Port 22

Так она выглядит в изначальном виде. Если строка уже изменялась, она может выглядеть как:


    Port number_port

Вам необходимо изменить эту строку на Port 6500, где 6500 — номер нового порта.

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

Теперь необходимо перезагрузить службу SSH:


    Ubuntu:
sudo systemctl restart ssh

CentOS:
sudo systemctl restart sshd

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


    sftp -P port_number hostname@ip_remote_host

Создаем пользователя с доступом по SFTP-протоколу

Создать простого пользователя — задача не трудная, но как создать такого пользователя, который будет иметь доступ только по протоколу SFTP?

Создаем пользователя 

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


    sudo adduser selectelsftpclient

После ввода команды вам нужно указать пароль для нового пользователя — это обязательное действие. Все остальные предложения операционной системы о вводе дополнительной информации можно пропустить.

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

Создаем каталог

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

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

Создадим новый каталог /var/sftp/userfolder:


    sudo mkdir -p /var/sftp/userfolder

Каталогу /var/sftp следует назначить владельцем пользователя root. /var/sftp является целевым каталогом, мы предоставим к нему доступ по умолчанию для selectelsftpclient. Иначе говоря, selectelsftpclient будет подключаться по SFTP на сервер, и его корневым каталогом будет каталог sftp. Он не будет владельцем /var/sftp, но будет иметь к нему доступ на чтение и выполнение. Такой вариант ограничения прав разрешен OpenSSH.


    sudo chown root:root /var/sftp

Права доступа необходимо распределить следующим образом:

  • root — полные права,
  • остальные пользователи — чтение и выполнение.

    sudo chmod 755 /var/sftp

Теперь следует изменить владельца папки, которой пользователь selectelsftpclient будет распоряжаться:


    sudo chown selectelsftpclient:selectelsftpclient /var/sftp/userfolder

Настройка доступа

Осталось лишь запретить новому пользователю доступ к терминалу, оставив возможность передачи файлов. Находясь на сервере, введите следующую команду для перехода в файл конфигурации SSH:


    sudo nano /etc/ssh/sshd_config

В самый конец файла добавьте строки:


    Match User selectelsftpclient
ForceCommand internal-sftp
PasswordAuthentication yes
ChrootDirectory /var/sftp
PermitTunnel no
AllowAgentForwarding no
AllowTcpForwarding no
X11Forwarding no

Описание команд:


    Match User selectelsftpclient — SSH-сервер будет применять следующие команды только к пользователю selectelsftpclient.
	ForceCommand internal-sftp — запуск SFTP-сервера сразу после входа в систему, одновременно с этим запрещается доступ к оболочке.
	PasswordAuthentication yes — разрешение аутентификации по паролю для selectelsftpclient.
	ChrootDirectory /var/sftp/ — пользователь selectelsftpclient получает доступ только к каталогу /var/sftp/. Остальные каталоги для него заблокированы.
	PermitTunnel no, AllowAgentForwarding no, AllowTcpForwarding no и X11Forwarding no — отключение переадресации портов, туннелирования и переадресации X11 для selectelsftpclient.

Сохраните изменения, внесенные в файл /etc/ssh/sshd_config, а затем сделайте перезапуск службы sshd:


    Ubuntu:
sudo systemctl restart ssh

CentOS:
sudo systemctl restart sshd

Проверка

Теперь  проверим корректность настроек. Для начала стоит узнать, получилось ли у нас ограничить доступ по чистому SSH на сервер:


    ssh selectelsftpclient@ip_address

Если вы изменяли порт по умолчанию, не забудьте добавить в команду параметр -p

Если вы получили подобное сообщение, значит, настройка выполнена верно:


    This service allows sftp connections only.
Connection to your_server_ip closed.

Теперь следует проверить, может ли selectelsftpclient подключиться к серверу по протоколу SFTP:


    sftp  selectelsftpclient@ip_address

При использовании нестандартного порта используйте параметр -P.

Теперь у пользователя selectelsftpclient есть доступ на сервер в качестве SFTP-пользователя с ограничением доступа к оболочке. Если вам необходимо создать сразу несколько таких пользователей, вы можете поместить их в одну группу и редактировать права доступа сразу для всех, а не каждому пользователю в отдельности.

Команды для навигация в иерархии файлов с помощью SFTP

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

  • pwd — узнать текущее месторасположение.
  • ls — просмотреть файлы и каталоги из текущего каталога. С помощью флага -l можно увидеть полную информацию о файлах, хранящихся в данном каталоге — например, права доступа, владельца, дату и время создания, права доступа. Флаг -la выведет информацию о системных файлах и директориях, в том числе скрытых.
  • cd — перейти в другой каталог.

Помимо привычных команд навигации, в терминале сессии SFTP существуют такие команды, как:

  • lpwd — узнать текущее месторасположение на локальной машине,
  • lls — просмотреть файлы и каталог из текущего каталога на локальной машине,
  • lcd — перейти в другой каталог на локальной машине.

Как вы уже поняли, приставка “l” позволяет выполнять команды, обращаясь к системе не на текущем устройстве, а на локальной машине, с который вы произвели подключение. Она работает не со всеми командами, полный список можно уточнить в help.

Нюансы

  • Если необходимая вам команда не может быть выполнена с использованием приставки l, воспользуйтесь командой “!”. Она позволяет обратиться и запустить на исполнение любую команду на локальной машине. 
  • Можно использовать “!” совместно с командой — например !rm file_name, тогда она будет выполнена на локальной машине, не выходя из удаленной.
  • Если просто написать “!”, вас перенесет в терминал локальной машины. Там вы сможете выполнять необходимые манипуляции с файлами и каталогами, оставаясь подключенным к удаленной машине. Для выхода из этого режима введите exit.

Изменение владельца файла

Владелец файла в SFTP меняется командой chown:


    sftp> chown ID_user file_name

где:

  • ID_user — это UID пользователя. Узнать его можно с помощью команды less /etc/passwd, введя ее на удаленном сервере. Напрямую SFTP данную команду не поддерживает. Идентификатор пользователя является третьим значением, написанным через двоеточие.
  • file_name — путь к интересующему файлу.

Аналогично можно сменить владельца группы файлов командой:


    sftp> chgrp ID_group file_name

где идентификатор группы можно получить командой less /etc/group.

Передача файлов с помощью SFTP

В локальную систему

Предположим, на SFTP-сервере есть файл под названием for_TRex.txt и располагается он в каталоге /userfolder. Чтобы скопировать файл с сервера на локальную машину, необходимо использовать команду get:


    sftp> get remote_path [local_path]

где:

  • remote_path — обязательное поле, обозначающее месторасположение файла на сервере,
  • local_path — необязательное поле, обозначающее желаемое месторасположение файла на локальной машине. 

Если оставить local_path без заполнения, файл будет скопирован с таким же именем в каталог, активный в текущей сессии на локальной машине. Например, на локальной машине вы находитесь в каталоге /root/files, подключаетесь к SFTP-серверу и вводите команду get /userfolder/test.txt. В таком случае test.txt будет скопирован на локальную машину в каталог /root/files. При использовании данного параметра имейте ввиду, что при копировании вы можете изменить имя файла для локальной машины — например: get /userfolder/test.txt /root/files/myfile.txt

Дополнительно команда get поддерживает флаг -P, который вместе с файлом копирует все права на доступ к нему, а также флаг -r, который копирует каталог вместе со всем его содержимым.

Чтобы при передаче файлов в локальную систему обеспечить всем новым файлам одинаковые права доступа, вы можете использовать команду


    sftp> lumask umask

где umask — это значение маски, которое будет вычитаться из маски полных прав на файл или каталог. 

Например, если установлено значение umask = 022 и на локальную систему загружается каталог, то из 777 будет вычтено 22. Итоговые права доступа к каталогу будут 755, то есть drwxr-xr-x. Если же на локальную систему загружается файл, то 22 будет вычитаться из 666. Таким образом права доступа будут выставлены на 644, то есть -rwxr-xr-x.

В удаленную систему

Правила и тонкости копирования в удаленную систему из локальной точно такие же, как из удаленной в локальную. Обязательно указание пути источника копирования и не обязательно — указание пути назначения. Команда, которая отвечает за это действие, — put.


    sftp> put local_path [remote_path]

Клиенты, работающие по протоколу передачи данных SFTP

Консольный клиент

Консольный клиент SFTP — это то, с чем мы работали в статье. Открыв терминал на локальной машине и прописал sftp -P port username@ip_address, в той же консоли вы получите доступ на SFTP-сервер.

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

Графический клиент SFTP — это стороннее приложение, которое необходимо устанавливать в ОС дополнительно. Перечислим самые популярные из существующих на данный момент. 

FileZilla

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

FireFTP

Еще один кроссплатформенный клиент. Разработан как дополнение к браузеру Mozilla Firefox. Интуитивно понятная панель управления, схожая с FileZilla.

Chrome sFTP Client

Это дополнение к браузеру Google Chrome, поэтому может использоваться на всех ОС, на которых можно установить этот браузер.

Заключение

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

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