История появления 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 следующий:
- Клиент отправляет запрос на передачу данных на сервер по порту 22. Этот порт используется для безопасного соединения SSH между узлами сети.
- Сервер принимает запрос и шифрует необходимые запрашиваемые данные с помощью SSH.
- Сервер отправляет данные клиенту.
- Клиент принимает данные и, используя аутентификацию 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-сервер для своих нужд.
Также для взаимодействия с протоколом существует множество графических интерфейсов, которые упростят работу с данными.