# SSH

> Сетевой протокол для защищённого удалённого входа, выполнения команд, передачи файлов и туннелирования портов.

Источник: https://llmdocs.ru/wiki/ssh/ · обновлено 2026-11-09 · лицензия CC BY-SA 4.0

- **Полное название**: Secure Shell
- **Автор**: Тату Юлёнен
- **Появился**: 1995
- **Стандарт**: SSH-2, RFC 4251–4254 (2006)
- **Порт**: 22/TCP
- **Основная реализация**: OpenSSH (с 1999)
- **Другие реализации**: Dropbear, PuTTY, libssh
- **Заменил**: telnet, rlogin, rsh, rcp
- **Сайт OpenSSH**: [openssh.com](https://www.openssh.com/)
**SSH** (англ. *Secure Shell* — «безопасная оболочка») — сетевой протокол для защищённого удалённого управления компьютером. Он шифрует весь трафик, проверяет подлинность сервера и пользователя и, помимо интерактивного входа в командную оболочку, умеет выполнять отдельные команды, передавать файлы и пробрасывать сетевые порты. SSH — основной способ администрирования серверов на [Linux](https://llmdocs.ru/wiki/linux.md) и других Unix-подобных системах, а также транспорт для [Git](https://llmdocs.ru/wiki/git.md), [rsync](https://llmdocs.ru/wiki/rsync.md) и систем управления конфигурацией вроде [Ansible](https://llmdocs.ru/wiki/ansible.md).

## История

В 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`. Если ключ позже изменится, клиент предупредит о возможной атаке «человек посередине».

## Ключи

Вход по ключу надёжнее пароля: закрытый ключ остаётся у пользователя, на сервер кладётся только открытый (см. [Криптография с открытым ключом](https://llmdocs.ru/wiki/public-key-cryptography.md)).

```bash
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]

```text
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](https://llmdocs.ru/wiki/rsync.md) `-avz -e ssh` — синхронизация каталогов с передачей только изменений.

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

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

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-сервер нужно своевременно обновлять.

## См. также

- [Криптография с открытым ключом](https://llmdocs.ru/wiki/public-key-cryptography.md)
- [TLS](https://llmdocs.ru/wiki/tls.md)
- [Shell и Bash](https://llmdocs.ru/wiki/shell-bash.md)
- [Аутентификация и авторизация](https://llmdocs.ru/wiki/authn-authz.md)

## Источники

1. [RFC 4251 — The Secure Shell (SSH) Protocol Architecture](https://www.rfc-editor.org/rfc/rfc4251)
2. [OpenSSH — History](https://www.openssh.com/history.html)
3. [OpenSSH Release Notes](https://www.openssh.com/releasenotes.html)
4. [ssh_config(5) — OpenBSD manual](https://man.openbsd.org/ssh_config)
5. [Terrapin Attack](https://terrapin-attack.com/)
6. [regreSSHion: RCE in OpenSSH's server (CVE-2024-6387) — Qualys](https://www.qualys.com/2024/07/01/cve-2024-6387/regresshion.txt)
