Протокол SSH
SSH (Secure Shell) — это сетевой протокол прикладного уровня, предназначенный для удалённого управления операционными системами и туннелирования TCP-соединений. Обеспечивает шифрование, аутентификацию и целостность передаваемых данных, что делает его безопасной альтернативой незащищённым протоколам (Telnet, rlogin, FTP).
История
Протокол SSH был разработан в 1995 году финским исследователем Тату Юлёненом (Tatu Ylönen) из Хельсинкского технологического университета. Первая версия (SSH-1) была создана после того, как в сети университета была зафиксирована атака с перехватом паролей (сниффинг). Юлёнен выпустил реализацию протокола как свободное программное обеспечение, что привело к его быстрому распространению.
К концу 1995 года SSH-1 обслуживал около 20 000 пользователей в 50 странах. В 1996 году вышла версия SSH-2, которая устранила ряд уязвимостей первой версии и ввела более надёжную архитектуру безопасности. SSH-2 была стандартизирована Рабочей группой IETF (Internet Engineering Task Force) в 2006 году в серии документов RFC (RFC 4250–4256).
В 1998 году Тату Юлёнен основал компанию SSH Communications Security, которая начала коммерческое лицензирование протокола. В 1999 году разработчик OpenBSD Бьорн Грёнвалль создал OpenSSH — открытую реализацию протокола, которая стала стандартом де-факто в большинстве Unix-подобных систем и в настоящее время входит в состав Linux, macOS, FreeBSD и других ОС.
Архитектура и принцип работы
SSH использует архитектуру «клиент-сервер». Клиентское приложение (ssh-клиент) инициирует соединение с серверным демоном (sshd), работающим на удалённой машине. Соединение устанавливается по TCP-порту 22 (стандартный номер порта, зарегистрированный IANA).
Протокол состоит из трёх основных уровней:
Транспортный уровень
Обеспечивает начальное шифрование, аутентификацию сервера и защиту целостности данных. При установлении соединения клиент и сервер согласовывают:
- алгоритм шифрования (например, AES, ChaCha20);
- алгоритм хеширования (HMAC-SHA2);
- алгоритм обмена ключами (Diffie-Hellman, ECDH).
После обмена ключами устанавливается симметричное шифрование. Сервер аутентифицируется с помощью ключа хоста (host key), который клиент проверяет по базе известных ключей (файл known_hosts).
Уровень аутентификации
После установления защищённого канала клиент проходит аутентификацию. Основные методы:
- Парольная аутентификация — передача пароля в зашифрованном виде.
- Аутентификация по открытому ключу — клиент доказывает владение закрытым ключом, соответствующим открытому ключу, заранее сохранённому на сервере (наиболее распространённый метод).
- GSS-API (Kerberos) — аутентификация через единую систему (например, Active Directory).
- Аутентификация через сертификаты — использование сертификатов X.509.
Соединительный уровень
После аутентификации создаётся несколько логических каналов (channels) внутри одного шифрованного соединения. Каналы используются для:
- интерактивной сессии (удалённый терминал);
- выполнения отдельных команд;
- туннелирования TCP-портов;
- передачи X11 (графический интерфейс).
Ключевые возможности
Удалённое управление
SSH позволяет выполнять команды на удалённой системе в защищённом режиме. Пользователь получает доступ к командной оболочке (shell) удалённой машины, что эквивалентно работе за локальным терминалом.
Туннелирование (проброс портов)
SSH поддерживает три типа туннелирования:
- Локальный проброс — порт на локальной машине перенаправляется через SSH на удалённый сервер.
- Удалённый проброс — порт на удалённой машине перенаправляется на локальный хост.
- Динамический проброс — создание SOCKS-прокси для маршрутизации трафика через SSH-соединение.
Передача файлов
На базе SSH работают два основных протокола передачи файлов:
- SFTP (SSH File Transfer Protocol) — расширение протокола, работающее поверх SSH-канала.
- SCP (Secure Copy Protocol) — утилита для копирования файлов между хостами.
Агент пересылки аутентификации (SSH Agent Forwarding)
Позволяет использовать локальные закрытые ключи для аутентификации на удалённых серверах без их физической передачи на сервер, что снижает риск компрометации ключей.
Реализации
OpenSSH
Наиболее распространённая реализация, разрабатываемая проектом OpenBSD. Входит в состав большинства дистрибутивов Linux, macOS (начиная с версии 10.2), FreeBSD и многих других Unix-подобных систем. Поддерживается на Windows через подсистему WSL или встроенный клиент (начиная с Windows 10).
Коммерческие реализации
- SSH Tectia (SSH Communications Security) — коммерческая реализация с расширенными функциями управления, сертификации и интеграции с корпоративными системами.
- VanDyke SecureCRT — коммерческий SSH-клиент для Windows, macOS и Linux.
- PuTTY — свободный SSH-клиент для Windows, также доступен для Unix-подобных систем.
Библиотеки
- libssh — библиотека для разработки приложений, использующих SSH.
- libssh2 — более лёгкая библиотека, ориентированная на встраиваемые системы.
- Paramiko — реализация SSH на Python.
Безопасность
Известные уязвимости
- SSH-1 — содержит фундаментальные уязвимости (например, атака вставки данных в поток, уязвимость в алгоритме обмена ключами). Не рекомендуется к использованию.
- CVE-2024-6387 (regreSSHion) — уязвимость в OpenSSH (версии 8.5p1–9.7p1), позволяющая удалённое выполнение кода без аутентификации при определённых условиях (асинхронная безопасность сигналов). Исправлена в версии 9.8p1.
- CVE-2023-38408 — уязвимость в OpenSSH, связанная с обработкой расширений SSH-агента.
- Атаки на слабые ключи — использование коротких или предсказуемых ключей RSA/DSA (менее 2048 бит) делает возможным их факторизацию.
Рекомендации по безопасной настройке
- Отключение аутентификации по паролю (только ключи).
- Использование ключей длиной не менее 3072 бит (RSA) или 256 бит (Ed25519).
- Запрет прямого входа от root (параметр
PermitRootLogin no). - Использование двухфакторной аутентификации (например, TOTP + ключ).
- Ограничение доступа по IP-адресам (параметр
AllowUsers). - Регулярное обновление SSH-сервера.
Применение
SSH является основным инструментом для:
- администрирования серверов (Linux, FreeBSD, macOS);
- управления сетевым оборудованием (маршрутизаторы, коммутаторы);
- безопасной передачи файлов в автоматизированных процессах (CI/CD, бэкапы);
- создания VPN-подобных туннелей для доступа к внутренним ресурсам;
- разработки программного обеспечения (удалённая отладка, деплой);
- работы с системами контроля версий (Git через SSH).
Альтернативы
- Telnet — устаревший незащищённый протокол, передающий данные в открытом виде.
- Rlogin — протокол для удалённого управления в Unix-системах, не поддерживает шифрование.
- Mosh (Mobile Shell) — протокол, основанный на SSH, но оптимизированный для нестабильных соединений (мобильные сети).
- RDP (Remote Desktop Protocol) — протокол для удалённого доступа к графическому интерфейсу Windows.
- VNC (Virtual Network Computing) — протокол для удалённого доступа к графическому рабочему столу.
Источники
- 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
- OpenSSH Project — официальная документация (openssh.com)
- SSH Communications Security — техническая документация (ssh.com)
- Ylönen, T. (1996). SSH — Secure Login Connections over the Internet. Proceedings of the 6th USENIX Security Symposium
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →