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

SSH

SSH (Secure Shell, «безопасная оболочка») — это сетевой протокол прикладного уровня, предназначенный для удалённого управления операционными системами и туннелирования TCP-соединений. Обеспечивает шифрование передаваемых данных, аутентификацию клиента и сервера, а также целостность соединения. SSH является стандартом де-факто для безопасного администрирования Unix-подобных систем (Linux, macOS, BSD) и широко применяется в корпоративных сетях, облачных платформах и встраиваемых устройствах.

История

Предпосылки создания

До середины 1990-х годов для удалённого доступа к командной оболочке Unix использовались протоколы Telnet, rlogin и rsh. Все они передавали данные, включая пароли, в открытом виде, что делало их уязвимыми для перехвата трафика (сниффинга) и атак типа «человек посередине» (MITM). С ростом популярности интернета и увеличением числа удалённых атак возникла острая необходимость в шифрованном аналоге.

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

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

SSH-2 и стандартизация

В 1996 году Юлёнен основал компанию SSH Communications Security и начал разработку второй версии протокола — SSH-2, которая была призвана устранить криптографические недостатки первой версии (уязвимость к атакам на основе известного шифротекста, слабая проверка целостности). В 1997 году IETF (Internet Engineering Task Force) сформировала рабочую группу Secsh для стандартизации протокола. В 2006 году SSH-2 был опубликован как серия RFC (RFC 4250–4256). С тех пор SSH-1 считается устаревшим и практически не используется.

OpenSSH

В 1999 году разработчики проекта OpenBSD создали свободную реализацию OpenSSH (OpenBSD Secure Shell) на основе последней версии SSH-1 с патчами, а затем — полностью независимую реализацию SSH-2. OpenSSH стала стандартной клиент-серверной программой в большинстве дистрибутивов Linux, macOS, FreeBSD и других Unix-подобных ОС. В 2000-х годах OpenSSH была портирована на Windows (через Cygwin, а затем — в составе Windows 10 и Windows Server 2019 как встроенный компонент).

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

Модель «клиент-сервер»

SSH работает по модели «клиент-сервер». На управляемом устройстве запускается серверная часть (sshd), которая прослушивает TCP-порт 22 по умолчанию. Клиент (ssh) инициирует соединение, после чего происходит согласование параметров шифрования и аутентификация.

Этапы установки соединения

  1. Согласование версий протокола. Клиент и сервер обмениваются идентификаторами версий (например, SSH-2.0-OpenSSH_9.0).
  2. Ключевой обмен (Key Exchange). Стороны договариваются об алгоритмах шифрования, хеширования и сжатия. Используется протокол Диффи — Хеллмана (DH) или его эллиптическая версия (ECDH) для генерации общего сеансового ключа.
  3. Аутентификация сервера. Сервер доказывает свою подлинность с помощью открытого ключа хоста (host key). Клиент проверяет, что этот ключ совпадает с известным (обычно хранится в файле ~/.ssh/known_hosts). При первом подключении клиент выводит предупреждение и предлагает сохранить ключ.
  4. Аутентификация клиента. Сервер проверяет подлинность клиента одним из методов: по паролю, по открытому ключу, через GSSAPI (Kerberos) или с использованием сертификатов.
  5. Установка защищённого канала. После успешной аутентификации все данные между клиентом и сервером передаются в зашифрованном виде.

Порт и протоколы

По умолчанию SSH использует TCP-порт 22, зарегистрированный в IANA. Протокол SSH-2 поддерживает несколько типов каналов:

Методы аутентификации

Аутентификация по паролю

Классический метод, при котором пароль передаётся в зашифрованном виде. Уязвим к атакам перебора (brute force), поэтому на современных серверах часто отключается в пользу ключей.

Аутентификация по открытому ключу

Наиболее распространённый и безопасный метод. Клиент генерирует пару ключей: приватный (секретный) и публичный (открытый). Публичный ключ копируется на сервер в файл ~/.ssh/authorized_keys. При подключении сервер проверяет, что клиент владеет соответствующим приватным ключом (с помощью цифровой подписи). Поддерживаемые алгоритмы: RSA, DSA, ECDSA, Ed25519.

Аутентификация через сертификаты

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

GSSAPI (Kerberos)

Используется в корпоративных средах с единой системой аутентификации (например, Active Directory). Позволяет входить на сервер без ввода пароля, используя билеты Kerberos.

Туннелирование и перенаправление портов

Локальное перенаправление

Клиент перенаправляет TCP-соединение с локального порта на удалённый сервер через SSH-туннель. Пример: ssh -L 8080:example.com:80 user@server — трафик, идущий на локальный порт 8080, шифруется и направляется через сервер к example.com:80.

Удалённое перенаправление

Сервер перенаправляет соединение с удалённого порта на локальный клиент. Используется для доступа к ресурсам за NAT.

Динамическое перенаправление (SOCKS-прокси)

Клиент создаёт SOCKS5-прокси на локальном порту. Все приложения, настроенные на использование этого прокси, отправляют трафик через SSH-туннель. Команда: ssh -D 1080 user@server.

Реализации

OpenSSH

Основная и наиболее распространённая реализация. Входит в состав OpenBSD, Linux, macOS, FreeBSD, NetBSD, Solaris. Для Windows доступна в виде порта (OpenSSH for Windows, начиная с Windows 10 1809). Поддерживает все основные функции SSH-2, SFTP, SCP, туннелирование, а также протокол SSH-1 (отключён по умолчанию).

Dropbear

Лёгкая реализация SSH для встраиваемых систем и устройств с ограниченными ресурсами (OpenWrt, DD-WRT). Не поддерживает SFTP (только SCP), имеет урезанный набор алгоритмов.

PuTTY

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

libssh и libssh2

Библиотеки для разработчиков, предоставляющие API для интеграции SSH в приложения. libssh используется в KDE, GNOME, libssh2 — в curl, Git, OpenSSH (для SFTP).

Применение

Администрирование серверов

Основное использование: удалённый вход на серверы Linux/Unix для выполнения команд, настройки, мониторинга, обновления. SSH является стандартным инструментом для DevOps-инженеров и системных администраторов.

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

Туннелирование и прокси

SSH используется для обхода межсетевых экранов, доступа к ресурсам в закрытых сетях, шифрования трафика приложений (например, почтовых клиентов, баз данных).

Автоматизация и DevOps

SSH-ключи используются в системах непрерывной интеграции (CI/CD) для развёртывания кода на серверы. Ansible, Puppet, Chef, SaltStack используют SSH для управления конфигурацией.

Git и другие VCS

Протокол Git поверх SSH является стандартным способом аутентифицированного доступа к удалённым репозиториям (например, на GitHub, GitLab, Bitbucket).

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

Уязвимости

Рекомендации по усилению

Критика и альтернативы

Критика

Альтернативы

Интересные факты

Источники

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

На главную BFOmetr →