Debian.pro/

Про Debian


Гуляем с сервера на сервер с одним ssh-ключом. SSH-agent forwarding.

Век живи, век учись, как говориться.
Частенько сталкиваюсь с такими ситуациями:
1) сижу по ssh на одном сервере, по scp понадобилось что-либо скачать с другого.
2) нужно сделать rsync с одного сервера на другой.
3) нужно выполнять команды на втором сервере из скрипта, запущенного на первом (из консоли, а не крона, само собой)
Естественно, что на оба сервера есть рутовый доступ по ключам.

В таких случаях долгое время я создавал дополнительные ssh ключи, чтобы с одного сервера можно было зайти на другой. Да, глупо, я знаю. Но ведь не все знают про ssh-agent forwarding.

Можно просто написать в ~/.ssh/config
Host
ForwardAgent yes

Эта опция позволяет ssh-клиенту «пробрасывать» ваш ключ на сервер, на который вы зашли по ключу. Таким образом вы (в одной консоли, само собой) пишете:
user@laptop:~$ ssh root@server1
root@server1:~# ssh root@server2
root@server2:~#

И оказываете на server2, зайдя на него по цепочке laptop->server1->server2, при этом на оба сервера вы зашли по вашему ssh-ключу, который лежит только на лаптопе.
Учтите, что сделать цепочку из трех серверов получится сделать только если на server1 включена опция ForwardAgent. То есть, ключ форвардится только один раз. Если на server1 отключена эта опция — то с него вы сможете перейти только на один сервер. В примере выше — на server2 мы зашли по ключу, но ключ на этот сервер не проброшен, поэтому если мы попытаемся зайти с него на server3 — то у нас спросят пароль. Если же опцию включить на server1 — то ключ пробросится на server2, и мы сможем по ключу пойти с него на server3. А при попытке зайти на server4 по цепочке… ну вы поняли =)


Комментарии (13):

  1. Serj :

    А ssh-add не нужно разве? Я уже не помню точно ибо давно настраивал, но вроде если не добавить ключ его проброс не выполнится.

  2. ssh-add вы делаете до того, как пойти с этим ключом на первый сервер, нне) ?
    На сервере-втором-десятом оно отработает уже само по себе.

    А вообще я пользуюсь гномовским ssh-agent — вполне себе достойная вещь. Она за меня всё делает.

  3. Serj :

    Да, я потом посмотрел свой ноут, ssh-add вообще к priv ключам относится в агенте.

  4. Удобно. Вот только скажите честно — не страшно, что поломают? Я бы лично ну как минимум полностью запретил везде логин под рутом. Даже если поломают хост с ключами, то хотя бы на других хостах рута не получат (придется пароль брутить).

  5. PermitRootLogin without-password
    Разрешает вход руту только по ключам.

    А ключ, само собой, запароленный. На ноуте. На зашифрованной ФС. С запароленным grub и системой.

  6. Ivan :

    Обнаружил такую неприятную вещь — ssh ключ без пароля не форвардится

  7. Да не, должны.
    Хотя я ими уже лет эдак 7 не пользовался так, чтобы мне форвардить их надо было..

  8. alex :

    >PermitRootLogin without-password
    >Разрешает вход руту только по ключам.
    >А ключ, само собой, запароленный. На ноуте. На зашифрованной ФС. С запароленным grub и системой.

    и все это для того чтобы 1 раз не вводить пароль по ssh )))
    P.S. конечно, это иррония

  9. Кому один раз, а у кого:
    inkvizitor68sl@isera:~$ wc -l .ssh/known_hosts
    8605 .ssh/known_hosts

  10. Max :

    «Учтите, что сделать цепочку из трех серверов получится сделать только если на server1 включена опция ForwardAgent. То есть, ключ форвардится только один раз. Если на server1 отключена эта опция — то с него вы сможете перейти только на один сервер. В примере выше — на server2 мы зашли по ключу» — Получается чтобы зайти на server2, ничего вообще не надо было включать ? Наверное имелось в виду ‘Учтите, что сделать цепочку из трех серверов получится сделать только если на laptop включена опция ForwardAgent.’

  11. inkvizitor68sl :

    Там всё верно написано, вчитайтесь.
    server1 (форвард выключен) -> server2 -> на server3 не пустит.
    На laptop forwarding должен быть включен, чтобы на server2 попасть.

  12. root :

    Для новых читателей, SSH port-forwarding это очень плохая идея, особенно с таким конфигом

    Host *
    ForwardAgent yes

    Если сервер взломали, то злоумышленник может использовать ваш агент и любые ключи в вашем агенте чтобы зайти на другие сервера указав SSH_AUTH_SOCK своего агента на ваш. Или может оставить бекдор который сделает действия автоматом.

    Примеры можно прочитать тут
    https://blog.wizardsoftheweb.pro/ssh-agent-forwarding-vulnerability-and-alternative/

  13. Да, справедливо.
    Но вообще это не очень популярный вектор для атаки — ключ украсть нельзя, да и сама уязвимость «существует» только когда ssh-сессия открыта.
    Плюс я недавно пытался и сам у себя не смог auth_sock украсть.

    Хотя если ходишь на чужие серверы — не стоит Host * использовать, действительно.

Написать комментарий