← Linux: безопасность
11 мин · средне · Урок 2 из 5

SSH: config, агент, bastion

~/.ssh/config с алиасами хостов, ProxyJump через bastion и почему agent forwarding опасен.

Проблема длинных команд

Когда серверов становится больше пары, команды распухают:

ssh -i ~/.ssh/deploy_key -p 2222 deploy@10.0.5.14

Запоминать IP, порт, пользователя и путь к ключу для каждого хоста невозможно. Файл ~/.ssh/config переносит всё это в именованные блоки, и дальше ты ходишь по короткому алиасу.

~/.ssh/config: алиасы хостов

# ~/.ssh/config
Host web
    HostName 10.0.5.14
    User deploy
    Port 2222
    IdentityFile ~/.ssh/deploy_key

Host db
    HostName 10.0.5.20
    User postgres
    IdentityFile ~/.ssh/deploy_key

Теперь ssh web разворачивается в полную команду из блока. Параметры те же, что у флагов ssh: HostName — реальный адрес, User — под кем заходить, Port — порт, IdentityFile — какой ключ использовать.

Можно задавать значения по шаблону. Блок Host * применяется ко всем:

Host *
    ServerAliveInterval 60
    AddKeysToAgent yes

ServerAliveInterval 60 шлёт пакет каждую минуту, чтобы соединение не рвалось по простою. AddKeysToAgent yes сам кладёт ключ в агент при первом использовании.

Bastion и ProxyJump

В нормальной сети прод-серверы не торчат в интернет напрямую. Снаружи виден только один хост-привратник — bastion (он же jump host). На сам сервер ты заходишь через него.

Раньше для этого писали длинные конструкции с ProxyCommand. Сейчас есть ProxyJump:

Host bastion
    HostName 203.0.113.10
    User jump

Host app
    HostName 10.0.5.30
    User deploy
    ProxyJump bastion

Команда ssh app сначала поднимет соединение до bastion, а уже через него — до внутреннего 10.0.5.30. С командной строки то же самое делает флаг -J:

ssh -J jump@203.0.113.10 deploy@10.0.5.30

Трафик до конечного сервера остаётся зашифрованным end-to-end: bastion видит, что соединение идёт, но не его содержимое.

Почему agent forwarding опасен

Есть соблазн включить agent forwarding (ForwardAgent yes или флаг -A), чтобы с промежуточного сервера ходить дальше своим ключом. Проблема в том, что forwarding открывает сокет твоего агента на этом сервере. Root на промежуточном хосте (или тот, кто его взломал) может через этот сокет подписать что угодно твоим ключом, пока ты подключён.

Безопаснее ProxyJump: он не выставляет агент на bastion, а просто прокидывает зашифрованный туннель насквозь. Если форвардинг всё-таки нужен, ограничивай его конкретным хостом, а не Host *.

Что важно запомнить

~/.ssh/config хранит параметры подключения в именованных блоках Host; дальше ходишь по короткому алиасу.

ProxyJump (или -J) пускает на внутренний сервер через bastion, не открывая агент на промежуточном хосте.

Agent forwarding (-A) выставляет твой ключ на чужой машине. Включай его точечно и только при необходимости, не для всех хостов сразу.

В следующих треках SSH встречается постоянно: git, Ansible, деплой — все держатся на этих ключах и алиасах.

Прошли материал до конца? Отметьте урок пройденным.