Что такое и для чего нужен протокол SSH: агент и сессия, организация и установка соединения
В панель

Что такое и для чего нужен протокол SSH

Андрей Салита Андрей Салита Архитектор ИБ 21 июля 2023

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

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

Раньше для удаленного доступа использовались такие протоколы Telnet, Rlogin, Rsh. Со временем они потеряли актуальность, так как стали проигрывать в безопасности передачи данных. 

Современная альтернатива — Secure Shell, SSH. Это протокол прикладного уровня для безопасного обмена информацией между двумя устройствами. При передаче по SSH информация шифруется, что делает протокол более предпочтительным для работы в незащищенных сетях, обеспечивает высокий уровень защиты. К частыми сценариями его использования можно отнести работу с удаленными машинами и передачу файлов на устройства.

Принцип работы SSH

Работа SSH-протокола базируется на нескольких этапах:

  • открытие транспортного канала аутентификации,
  • аутентификация,
  • подключение.

Рассмотрим каждый пункт подробнее. 

Открытие транспортного канала

Первым шагом идет установка TCP-соединения. TCP использует сегменты для определения готовности узла-получателя к приему данных. 

Когда отправитель хочет установить соединение, TCP отправляет сегмент SYN протоколу на принимающем хосте. Принимающий TCP возвращает сегмент ACK, чтобы подтвердить успешное получение SYN. Отправляющий TCP отправляет еще один ACK, затем — переходит к отправке данных. Этот обмен управляющей информацией называется трехсторонним рукопожатием.

Открытие соединения TCP
Открытие TCP-соединения.

Аутентификация

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

  • ssh -Q kex — используется, если нужно посмотреть алгоритмы обмена ключей со стороны клиента и выбрать нужный метод;
  • ssh -Q cipher — используется для настройки списков алгоритмов шифрования на сервере;
  • ssh -Q key-cert — используется, чтобы получить информацию о типах ключей для авторизации со стороны клиента.

Для обеспечения безопасности в протоколе SSH применяются ключи. Ключи делятся на два вида: 

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

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

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

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

  1. Сервер высылает свой публичный асимметричный ключ;
  2. Клиент случайным образом выбирает сеансовый ключ;
  3. Клиент шифрует сеансовый ключ с помощью публичного, который получен от сервера, и передает его на сервер;
  4. С помощью приватного асимметричного ключа сервер расшифровывает сеансовый, который получен от пользователя;
  5. Далее при обмене данными используется сеансовый ключ до момента его обновления, когда алгоритм повторяется заново.

Организация соединения SSH

Верификация, Fingerprint

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

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

Однако на практике подменить публичный ключ сервера не представляется возможным, потому что каждый из ключей обладает своей уникальной контрольной суммой (отпечатком или «фингерпринтом»). Когда пользователь впервые подключается к SSH-серверу, он видит сообщение, содержащее данную комбинацию:

Вывод отпечатка - клиент
Вывод отпечатка при первом установлении соединении на стороне клиента.

Если вы — администратор сервера, то в любой момент можете посмотреть данное значение. Ключи хранятся в каталоге по пути /etc/ssh/ — увидеть fingerprint можно с помощью следующей команды:

ssh-keygen -l -f ssh_host_ed25519_key
Вывод отпечатка - сервер
Вывод отпечатка на стороне сервера.

Если отпечаток меняется — значит, сервер изменил ключ. Это может произойти при переустановке ssh или под действием атаки.

Установка соединения и аутентификация

В случае, когда пользователь успешно подключился к серверу, все равно лучше проверить его права доступа. Для этого предусмотрены два типа аутентификации — с помощью пароля и сертификата (по ключам).

Использование пароля при работе с протоколом SSH

Комбинация имени пользователя и пароля является наиболее популярным методом аутентификации на сервере SSH и по умолчанию находится во включенном состоянии.

Аутентификация по имени пользователя и паролю также является наиболее знакомым методом, поскольку он широко используется повсеместно. После ввода команды ssh система запросит пароль:

ssh name@ip_address 
Аутентификация с паролем
Аутентификация с помощью пароля.

Применение ключа без пароля

Если человек не хочет использовать пароли, он может создать специальные пары ключей. Ключи SSH — это комбинация открытых и закрытых ключей, используемых во время процесса аутентификации. Подробнее можно прочитать здесь и здесь.

Загрузка публичного ключа на сервер

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

Форвардинг или проброс ключей

Если нужно подключиться с управляемой машины на еще одно устройство, может быть использована технология проброса ключей. Ее используют, когда нужно избежать ситуации с хранением ключей на удаленной машине. Проброс ключей можно выполнить с помощью простой команды ssh с флагом -A:

ssh -A name@address

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

Host
ForwardAgent yes

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

  • Устройство 1: ssh root@ip_serv1
  • Сервер 1: ssh root@ip_serv2

SSH-agent

При работе с SSH пользователь может столкнуться с ситуацией, когда нужно ввести пароль несколько раз — например, при работе с несколькими хостами. Для упрощения этой операции существует специальное средство — SHH-агент. 

Большинство пользователей использует решение на базе OpenSSH, однако на рынке существуют и альтернативные варианты — например, Yubikeys и Sekey. SSH-агент отвечает за хранение паролей в памяти и предоставление услуг аутентификации для клиентов. Если агент предварительно загружен в систему, SSH-сессия не будет спрашивать пароль. Действие агента продолжается до тех пор, пока не будет завершена работа сервера. 

Схема работы агента SSH
Схема работы SSH-агента.

Решения для подключения по протоколу SSH

В интернете можно найти много различных программ, которые позволяют устанавливать SSH-соединения. Из них можно выделить следующие варианты:

  • CMD, командная строка или терминал — это самый простой и уже встроенный в систему способ подключения к серверу. Для подключения через CMD достаточно набрать ssh <имя_пользователя>@<адрес_сервера>. Иногда нужно указать порт — можно сделать с помощью -p.
Терминал
SSH-соединение через терминал.
  • Putty — это кроссплатформенное приложение для подключения к удаленным машинам. Среди его преимуществ — поддержка большинства протоколов, а также активная поддержка комьюнити.
PuTTY
Интерфейс программы PuTTY.
  • MobaXterm — это эмулятор терминала и многофункциональное приложение удаленного рабочего стола для Windows. В данном приложении возможно открыть множество терминалов в виде вкладок и разместить их на одном экране. При помощи него возможно подключаться по RDP, также подключаться к Linux-машинам с графической оболочкой (VNC), создавать макросы и многое другое.
MobaXterm
Интерфейс программы MobaXterm.
  • SecureCRT — это кроссплатформенное приложение для подключения к удаленным устройствам с возможностью задействования множества протоколов — например, SSH1, SSH2, Telnet, Telnet по SSL, Rlogin, Serial, TAPI. Также SecureCRT поддерживает написание макросов и сценариев, расширенные SSH-функции, включая public key assistant, X.509, поддержку смарт-карт и GSSAPI, X11 forwarding, туннелирование других протоколов.
SecureCRT
Интерфейс программы SecureCRT.

Сценарии использования протокола SSH

Функционал технологии SHH довольно обширен. Рассмотрим часто используемые сценарии.

Передача файлов и каталогов

Протокол SSH может использоваться для передачи данных на удаленные серверы. Этот механизм работает в связке с демоном sshd, утилитой scp и протоколом RCP. Для передачи файлов следует использовать следующую команду:

scp <имя_файла> name@address: ~/<путь к каталогу>

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

scp -r name@address: ~/<имя и путь копируемого файла/каталога> ~/<местоположение>

Альтернативой для безопасной передачи файлов в рамках сессии является специальный протокол SFTP, который мы рассмотрим далее.

SFTP

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

Цель SFTP — безопасная передача информации с локальной системы на конечный компьютер (сервер) и наоборот. Протокол основывается на технологиях протокола FTP, однако осуществляет передачу данных по SSH. При этом SFTP использует только один канал для передачи файлов и шифрует данные прямо в процессе. 

Чтобы подключиться к серверу по SFTP, достаточно ввести следующую команду:

sftp -oPort=<номер_порта> name@address

После подключения можно передать файл с помощью команды get (скачивает файл с сервера) и put (передает файл на сервер):

get <путь к файлу> <путь к каталогу>
put <путь к файлу> <путь к каталогу>

Команды get и put используют следующие параметры:

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

SSH-туннели

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

Заключение

ПО для работы с SSH поставляется с большинством дистрибутивов Linux, MacOS и и другими Unix-системами. Для Microsoft Windows также есть SSH-клиенты. И хоть этот протокол и может показаться старомодным для пользователей, которые привыкли работать через веб-панели, возможности SSH по прежнему очень велики.

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