# Как работает SSH: заглядываем внутрь протокола

Источник: https://www.youtube.com/watch?v=ORcvSkgdA58
Канал: Computerphile
Опубликовано: 31.01.2019

---

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

## 🛡️ Зачем нужен SSH?
[[JUMP:0:00]]

До середины 1990-х годов для удаленного доступа к машинам использовались протоколы Telnet, rlogin и rsh. Они были эффективны для работы внутри закрытых университетских или корпоративных сетей, где доступ к инфраструктуре имели только доверенные лица, например системные администраторы.

Однако по мере роста интернета эти протоколы стали небезопасными. Все передаваемые данные — включая пароли и команды — транслировались в открытом виде (in the clear). Любой пользователь, имеющий доступ к сети, через которую проходил трафик, мог воспользоваться «сниффером» пакетов и перехватить всю конфиденциальную информацию.

В 1995 году финский разработчик Тату Илонен (Tatu Ylönen) был обеспокоен этой уязвимостью и разработал протокол SSH. Его основная цель заключалась в шифровании данных, чтобы злоумышленник, даже перехватив поток, мог видеть лишь объем и частоту передаваемых пакетов, но не их содержимое.

## 📦 Внутренняя архитектура: структура пакетов
[[JUMP:1:44]]

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

Данные внутри SSH разбиваются на пакеты, имеющие строгую структуру. Каждый пакет включает:

* **Длина пакета (4 байта):** Указывает размер пакета.
* **Длина заполнения (padding length):** Указывает количество «мусорных» данных, добавленных для маскировки.
* **Полезная нагрузка (payload):** Сами данные, которые нужно передать.
* **Заполнение (padding):** Случайные байты, которые усложняют анализ трафика, скрывая характер передаваемой информации.
* **Код аутентификации сообщения (MAC):** Гарантирует целостность данных — что они не были изменены при передаче.

Перед шифрованием полезную нагрузку можно сжать с помощью стандартных алгоритмов, таких как zlib. Алгоритмы шифрования и MAC выбираются сервером и клиентом в начале соединения на основе их взаимной поддержки.



[Image of network packet structure]


## 🔐 Шифрование и аутентификация
[[JUMP:3:55]]

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

* Длина заполнения.
* Полезная нагрузка.
* Само заполнение.

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

После успешного установления TCP-соединения и обмена версиями протокола происходит проверка совместимости и механизмов шифрования. Далее следует этап аутентификации пользователя (например, ввод пароля). Только после того как аутентификация подтверждена, система создает канал для интерактивной работы.

## 🌐 Мультиплексирование и туннелирование
[[JUMP:5:02]]

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

Ключевые возможности, которые предоставляет такая архитектура:

* **Перенаправление TCP (порт-форвардинг):** Можно подключиться к удаленной службе за брандмауэром, «прокинув» её через SSH.
* **Графический интерфейс:** Протоколы X Window System, работающие через порт 6000, могут быть завернуты в SSH для защищенной передачи графических команд.
* **Переиспользование соединений:** SSH можно настроить так, чтобы TCP-соединение оставалось активным даже после закрытия сессии. При повторном подключении к тому же серверу протокол просто откроет новый канал внутри существующего, что экономит ресурсы.

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