Открыть сервис

Протокол Secure Shell

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

История

Разработка протокола SSH была начата в 1995 году финским исследователем Тату Юлёненом (Tatu Ylönen) из Технологического университета Хельсинки. Причиной послужила атака на парольную аутентификацию в университетской сети, в ходе которой злоумышленник с помощью сниффера (анализатора трафика) перехватил пароли от нескольких десятков серверов. В ответ на это Юлёнен создал первую версию протокола — SSH-1, которая была выпущена как бесплатное программное обеспечение.

В 1995 году была опубликована первая версия реализации (SSH-1.2.12), которая быстро распространилась среди Unix-систем. Однако в SSH-1 были обнаружены серьёзные уязвимости, связанные с целостностью данных и возможностью подмены пакетов (атака вставки данных). Это привело к разработке второй версии протокола — SSH-2.

Разработка SSH-2

В 1996 году Юлёнен основал компанию SSH Communications Security и начал разработку SSH-2. Новая версия была полностью переработана: она отказалась от устаревших криптографических алгоритмов, ввела строгую проверку целостности с помощью HMAC (Hash-based Message Authentication Code) и поддержку современных на тот момент алгоритмов шифрования (3DES, Blowfish, AES). SSH-2 был стандартизирован в 2006 году Рабочей группой по защищённому оболочке (Secure Shell Working Group) организации IETF (Internet Engineering Task Force) в виде серии документов RFC (Request for Comments): RFC 4250–4254.

Открытая реализация OpenSSH

В 1999 году разработчики проекта OpenBSD, стремясь создать свободную и безопасную альтернативу проприетарному SSH, выпустили первую версию OpenSSH. OpenSSH стал частью операционной системы OpenBSD, а затем был портирован на другие Unix-подобные системы (Linux, FreeBSD, macOS) и на Windows. К концу 2000-х годов OpenSSH стал де-факто стандартом реализации протокола SSH, вытеснив коммерческие версии.

Архитектура и принципы работы

Протокол SSH работает по модели «клиент-сервер». Клиентское приложение (SSH-клиент) инициирует соединение с серверным приложением (SSH-сервером), которое постоянно прослушивает определённый порт (по умолчанию — порт 22 TCP).

Фазы соединения

Установка SSH-соединения проходит три основные фазы:

  1. Транспортный уровень (Transport Layer). Устанавливается канал связи между клиентом и сервером. На этом этапе происходит:
  • Согласование версий протокола (SSH-1 или SSH-2).
  • Обмен ключами с использованием алгоритмов Диффи — Хеллмана (Diffie-Hellman) или ECDH (Elliptic Curve Diffie-Hellman). Результатом является общий сессионный ключ, который известен только клиенту и серверу.
  • Аутентификация сервера. Сервер доказывает свою подлинность, подписывая данные своим закрытым ключом (хостовым ключом). Клиент проверяет подпись, используя публичный ключ сервера, который либо хранится локально, либо принимается впервые (с предупреждением о возможной атаке «человек посередине»).
  • Установка шифрования. Все последующие данные шифруются с использованием согласованного алгоритма (например, AES-256, ChaCha20-Poly1305).
  1. Уровень аутентификации пользователя (User Authentication Layer). После установки защищённого канала клиент аутентифицирует пользователя. Поддерживаются три основных метода:
  • Парольная аутентификация. Пароль передаётся по зашифрованному каналу.
  • Аутентификация с помощью открытого ключа. Клиент доказывает владение закрытым ключом, который соответствует открытому ключу, заранее сохранённому на сервере (в файле ~/.ssh/authorized_keys). Этот метод считается наиболее безопасным.
  • Аутентификация на основе хоста (Host-based authentication). Используется в корпоративных средах, где доверенные хосты могут аутентифицировать пользователей без пароля.
  1. Соединительный уровень (Connection Layer). После успешной аутентификации создаётся мультиплексированное соединение, которое может поддерживать несколько логических каналов (сессий). Каждый канал обслуживает одно действие: интерактивную оболочку (shell), выполнение одной команды, передачу файла (SFTP, SCP) или туннелирование порта.

Основные возможности и применение

Удалённое управление (Shell)

Основное назначение SSH — предоставление интерактивного доступа к командной оболочке (shell) удалённой системы. Пользователь может выполнять команды, запускать скрипты и редактировать файлы так, как если бы он находился за физической консолью сервера.

Передача файлов

SSH предоставляет несколько протоколов для безопасной передачи файлов:

  • SCP (Secure Copy Protocol). Простейший протокол, основанный на SSH. Позволяет копировать файлы между локальной и удалённой системами. Синтаксис похож на команду cp.
  • SFTP (SSH File Transfer Protocol). Полноценный протокол передачи файлов, работающий поверх SSH. В отличие от SCP, SFTP поддерживает список файлов, удаление, переименование, возобновление прерванных передач и работу с правами доступа.
  • FTP over SSH (FTPS). Туннелирование традиционного FTP-соединения через SSH.

Туннелирование (Port Forwarding)

SSH позволяет создавать зашифрованные туннели для перенаправления трафика других протоколов (HTTP, VNC, базы данных). Существует три типа туннелирования:

  • Локальное туннелирование (Local Forwarding). Трафик с локального порта клиента перенаправляется через SSH-сервер на указанный удалённый хост и порт. Используется для доступа к внутренним ресурсам сети через публичный сервер.
  • Удалённое туннелирование (Remote Forwarding). Трафик с порта SSH-сервера перенаправляется на локальный компьютер клиента. Позволяет, например, предоставить доступ к локальному веб-серверу из интернета через внешний сервер.
  • Динамическое туннелирование (Dynamic Forwarding). Создаётся SOCKS-прокси на стороне клиента. Весь трафик, направленный на этот прокси, перенаправляется через SSH-сервер. Используется для обхода сетевых ограничений и обеспечения конфиденциальности.

Агент SSH (SSH Agent)

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

Реализации и клиенты

Наиболее распространённой реализацией протокола является OpenSSH, входящий в состав большинства дистрибутивов Linux, macOS и Windows (начиная с Windows 10 версии 1809). OpenSSH включает в себя сервер (sshd), клиент (ssh), утилиты для передачи файлов (scp, sftp) и генерации ключей (ssh-keygen).

Для Windows также существуют сторонние клиенты, такие как PuTTY (с утилитами Pageant и Plink) и графические оболочки (WinSCP, MobaXterm).

Безопасность

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

Основные угрозы и методы защиты

  • Подбор паролей (Brute-force). Автоматические атаки на SSH-серверы с целью подбора паролей. Защита: отключение парольной аутентификации в пользу ключей, использование нестандартного порта, установка средств блокировки IP-адресов (например, Fail2ban).
  • Компрометация закрытого ключа. Если злоумышленник получает доступ к закрытому ключу пользователя, он может подключаться к серверам, где установлен соответствующий открытый ключ. Защита: установка пароля на ключ (passphrase), использование аппаратных токенов (YubiKey) или TPM (Trusted Platform Module) для хранения ключей.
  • Атака «человек посередине» (MITM). При первом подключении к незнакомому серверу клиент может быть обманут подставным сервером. Защита: проверка отпечатка хостового ключа сервера по надёжному каналу (например, по телефону или из консоли управления).
  • Уязвимости в реализации. В истории протокола были обнаружены критические уязвимости, такие как CVE-2024-6387 (уязвимость race condition в OpenSSH, позволяющая выполнить код). Защита: своевременное обновление программного обеспечения.

Стандартизация

Протокол SSH-2 описан в следующих документах IETF (RFC):

  • RFC 4251 — The Secure Shell (SSH) Protocol Architecture (Архитектура протокола).
  • RFC 4252 — The Secure Shell (SSH) Authentication Protocol (Протокол аутентификации).
  • RFC 4253 — The Secure Shell (SSH) Transport Layer Protocol (Транспортный протокол).
  • RFC 4254 — The Secure Shell (SSH) Connection Protocol (Протокол соединения).

Источники

  1. Ylönen, T. "SSH — Secure Login Connections over the Internet". Proceedings of the 6th USENIX Security Symposium, 1996.
  2. Barrett, D. J., Silverman, R. E., & Byrnes, R. G. SSH, The Secure Shell: The Definitive Guide. O'Reilly Media, 2005.
  3. RFC 4251: The Secure Shell (SSH) Protocol Architecture. IETF, 2006.
  4. OpenSSH Project. "OpenSSH Manual". openssh.com, 2023.
  5. CVE-2024-6387: OpenSSH Remote Code Execution Vulnerability. National Vulnerability Database, 2024.

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →