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, деплой — все держатся на этих ключах и алиасах.
Прошли материал до конца? Отметьте урок пройденным.
Прогресс сохранён в этом браузере
Почистишь историю или откроешь с телефона, и отметки пропадут. Оставь почту, они переедут в аккаунт. Пароль придумывать не нужно.
Готово. теперь в аккаунте: прогресс виден с любого устройства. Мой прогресс