Wykrywanie przekazywania agenta SSH

19

Jak mogę dowiedzieć się, czy połączenie SSH zostało ustanowione z przekazaniem agenta, czy bez?

Próbuję wykonać następujące czynności:

ssh-add -D (delete all stored keys)
ssh --vvv something
ssh-add (adding key)
ssh --vvv something

i porównać wyniki, ale widzę tylko subtelne różnice.

shabunc
źródło
1
Dla porównania sprawdź ten miły artykuł: blog.joncairns.com/2013/12/understanding-ssh-agent-and-ssh-add . Wskazuje na ładne repozytorium GitHub ze ssh-find-agentskryptem do znajdowania i używania istniejących ssh-agentów, bardzo przydatne! Repozytorium zawiera kilka przykładów w README. Możesz być w stanie wykryć, czy ssh-agent jest włączony w ten sposób, wraz z przeglądaniem plików konfiguracyjnych SSH, zamiast patrzeć na dane wyjściowe SSH.
trusktr,

Odpowiedzi:

21

Gdy przekazywanie agenta ssh jest włączone na kliencie ( ForwardAgent yeswłączone ~/.ssh/config) i włączone również na serwerze zdalnym AllowAgentForwarding yes, podczas logowania do serwera zdalnego SSH_AUTH_SOCKpowinna istnieć zmienna środowiskowa . Następnie, jeśli zalogujesz się na innym serwerze (klucz publiczny musi znajdować się na tym trzecim serwerze), nie powinieneś otrzymywać monitu o podanie hasła.

W celu wyjaśnienia:

home$ ssh-add
Enter passphrase ...
Identity added ...
$ ssh  hostA
hostA$ env | grep SSH_AUTH_SOCK
SSH_AUTH_SOCK=/tmp/...
$ ssh hostB
hostB$
Torian
źródło
1
To ssh-addwłaśnie zrobiło dla mnie lewę. Pracowałem od miesięcy, nie wiedząc o tym. Następnie przestawiłem komputery stacjonarne z Unity na LXDE i przekazywanie kluczy agentów przestało działać.
Mark Hudson,
@ MarkHudson Z jakiegoś powodu podczas uruchamiania LXDE musisz uruchamiać się za ssh-addkażdym razem, gdy otwierasz nowe okno konsoli. Dodałem więc ten wiersz poleceń na końcu ~/.bash_profile, a teraz przekazywanie agenta uwierzytelniania działa za każdym razem w sposób przezroczysty!
Paul Bernal
@PaulBernal Naprawdę nie powinieneś tego robić, wyobrażam sobie, że nie ssh-agentskonfigurowałeś poprawnie. Zobacz mah.everybody.org/docs/ssh
Michael Mrozek
1
m2c: plik w "${SSH_AUTH_SOCK}"to gniazdo, które możesz przetestować za pomocąif [[ ! -S "${SSH_AUTH_SOCK}" ]]; then echo "warn: no forward agent detected ('${SSH_AUTH_SOCK}' is not a socket)"; fi
Boop
4

Sprawdzanie środowiska SSH_AUTH_SOCKjest dobre dla bezpośrednich połączeń ssh.

Jeśli używasz proxy ( proxy_command), możesz mieć połączenie wyglądające jak:

local-> hostA-> hostB-> hostC->hostD

Jeśli przekazywanie agentów jest aktywne na wszystkich tych hostach, SSH_AUTH_SOCKzostanie ustawione i „zawiera” klucz ssh z localwszystkich hostów.

Załóżmy teraz, że przekazywanie agentów jest wyłączone, hostBale włączone hostC. SSH_AUTH_SOCKzostanie włączony, hostDale w rzeczywistości będzie „pusty”. Oczywiście agent jest przekazywany, ale tylko od hostCdo hostD. Łańcuch jest zerwany.

Teraz, aby sprawdzić, czy rzeczywiście klucz jest dostępny hostD, możesz po prostu zadzwonić ssh-add. W każdym przypadku zakończy działanie z kodem 1, ale jeśli klucz jest niedostępny, wyświetli to stderr:

Nie można otworzyć połączenia z agentem uwierzytelniającym.

Możesz więc sprawdzić SSH_AUTH_SOCKplus i upewnić się, że ssh_addnie ma danych wyjściowych.

udondan
źródło