Протокол 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-соединения проходит три основные фазы:
- Транспортный уровень (Transport Layer). Устанавливается канал связи между клиентом и сервером. На этом этапе происходит:
- Согласование версий протокола (SSH-1 или SSH-2).
- Обмен ключами с использованием алгоритмов Диффи — Хеллмана (Diffie-Hellman) или ECDH (Elliptic Curve Diffie-Hellman). Результатом является общий сессионный ключ, который известен только клиенту и серверу.
- Аутентификация сервера. Сервер доказывает свою подлинность, подписывая данные своим закрытым ключом (хостовым ключом). Клиент проверяет подпись, используя публичный ключ сервера, который либо хранится локально, либо принимается впервые (с предупреждением о возможной атаке «человек посередине»).
- Установка шифрования. Все последующие данные шифруются с использованием согласованного алгоритма (например, AES-256, ChaCha20-Poly1305).
- Уровень аутентификации пользователя (User Authentication Layer). После установки защищённого канала клиент аутентифицирует пользователя. Поддерживаются три основных метода:
- Парольная аутентификация. Пароль передаётся по зашифрованному каналу.
- Аутентификация с помощью открытого ключа. Клиент доказывает владение закрытым ключом, который соответствует открытому ключу, заранее сохранённому на сервере (в файле
~/.ssh/authorized_keys). Этот метод считается наиболее безопасным. - Аутентификация на основе хоста (Host-based authentication). Используется в корпоративных средах, где доверенные хосты могут аутентифицировать пользователей без пароля.
- Соединительный уровень (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 (Протокол соединения).
Источники
- Ylönen, T. "SSH — Secure Login Connections over the Internet". Proceedings of the 6th USENIX Security Symposium, 1996.
- Barrett, D. J., Silverman, R. E., & Byrnes, R. G. SSH, The Secure Shell: The Definitive Guide. O'Reilly Media, 2005.
- RFC 4251: The Secure Shell (SSH) Protocol Architecture. IETF, 2006.
- OpenSSH Project. "OpenSSH Manual". openssh.com, 2023.
- CVE-2024-6387: OpenSSH Remote Code Execution Vulnerability. National Vulnerability Database, 2024.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →