SSH

Материал из llmdocs — справочник разработчика
SSH
Полное названиеSecure Shell
АвторТату Юлёнен
Появился1995
СтандартSSH-2, RFC 4251–4254 (2006)
Порт22/TCP
Основная реализацияOpenSSH (с 1999)
Другие реализацииDropbear, PuTTY, libssh
Заменилtelnet, rlogin, rsh, rcp
Сайт OpenSSHopenssh.com

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

История

В 1995 году Тату Юлёнен, исследователь Хельсинкского технологического университета, после атаки с перехватом паролей в университетской сети написал первую версию SSH как замену протоколам telnet, rlogin и rsh, которые передавали пароли открытым текстом. Протокол быстро распространился, а позднее был переработан в несовместимую версию SSH-2, стандартизированную IETF в 2006 году в RFC 4251–4254.[1]

В 1999 году разработчики OpenBSD на основе последней свободной версии исходного кода создали OpenSSH.[2] Сегодня это самая распространённая реализация: она входит в Linux, macOS, BSD и с 2018 года — в Windows.

Устройство протокола

SSH-2 состоит из трёх уровней:[1]

  1. Транспортный — согласование алгоритмов, обмен ключами (Диффи — Хеллман), шифрование и проверка целостности. Здесь же клиент проверяет ключ сервера.
  2. Аутентификация пользователя — по паролю, по открытому ключу, через сертификаты или внешние механизмы.
  3. Соединение — внутри одного зашифрованного канала мультиплексируются сессии: оболочка, команды, подсистема SFTP, проброшенные порты.

При первом подключении клиент показывает отпечаток ключа сервера и сохраняет его в ~/.ssh/known_hosts. Если ключ позже изменится, клиент предупредит о возможной атаке «человек посередине».

Ключи

Вход по ключу надёжнее пароля: закрытый ключ остаётся у пользователя, на сервер кладётся только открытый (см. Криптография с открытым ключом).

ssh-keygen -t ed25519 -C "laptop"        # создать пару ключей
ssh-copy-id user@server.example          # дописать открытый ключ в ~/.ssh/authorized_keys
ssh user@server.example                  # войти

Рекомендуемый тип ключа — Ed25519 (поддерживается в OpenSSH с 2014 года); RSA допустим при длине не менее 3072 бит. ssh-agent хранит расшифрованные ключи в памяти, чтобы не вводить парольную фразу при каждом подключении.

Конфигурация клиента

Файл ~/.ssh/config задаёт короткие имена и параметры подключения:[4]

Host prod
    HostName 203.0.113.10
    User deploy
    Port 2222
    IdentityFile ~/.ssh/prod_ed25519

Host internal
    HostName 10.0.0.5
    ProxyJump prod

После этого достаточно команды ssh prod, а ssh internal пройдёт к внутреннему узлу через prod как через промежуточный хост.

Проброс портов

Флаг Название Что делает
-L 8080:localhost:80 локальный порт 8080 на клиенте ведёт на порт 80 сервера
-R 9000:localhost:3000 удалённый порт 9000 на сервере ведёт на порт 3000 клиента
-D 1080 динамический SOCKS-прокси на клиенте, соединения выходят с сервера
-J host ProxyJump подключение через промежуточный узел

Локальный проброс часто используют, чтобы открыть веб-интерфейс или базу данных, доступные на сервере только через localhost.

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

  • scp file user@host:/path/ — простое копирование; начиная с OpenSSH 9.0 (2022) по умолчанию работает поверх протокола SFTP;[3]
  • sftp user@host — интерактивный файловый клиент;
  • rsync -avz -e ssh — синхронизация каталогов с передачей только изменений.

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

Базовые настройки /etc/ssh/sshd_config: запрет входа по паролю (PasswordAuthentication no), запрет прямого входа root (PermitRootLogin no или prohibit-password), ограничение списка пользователей. Перебор паролей отсекают ограничением частоты подключений или утилитой Fail2ban.

OpenSSH внедряет постквантовую криптографию: с версии 9.0 по умолчанию используется гибридный обмен ключами sntrup761x25519-sha512, а с версии 10.0 (2025) — mlkem768x25519-sha256.[3]

Заметные уязвимости последних лет — атака Terrapin на целостность рукопожатия (2023, устранена режимом «strict kex» в OpenSSH 9.6)[5] и regreSSHion (CVE-2024-6387) — удалённое выполнение кода в сервере OpenSSH на Linux с glibc, исправленное в версии 9.8.[6] Обе истории напоминают: SSH-сервер нужно своевременно обновлять.

См. также

Источники

  1. RFC 4251 — The Secure Shell (SSH) Protocol Architecture
  2. OpenSSH — History
  3. OpenSSH Release Notes
  4. ssh_config(5) — OpenBSD manual
  5. Terrapin Attack
  6. regreSSHion: RCE in OpenSSH's server (CVE-2024-6387) — Qualys