Jak poprosić o hasło klucza SSH raz i tylko w razie potrzeby?

15

(Przeczytałem wiele pytań na tej stronie, które wyglądają na powiązane i uważam, że jest to naprawdę nowe pytanie).

Mam wiele kluczy na wielu serwerach i wszystkie są chronione hasłami.

Lubię wprowadzać hasła tak samo jak lubię wprowadzać hasła - to prawdziwy drenaż produktywności.

  • Komendy ssh-agent + ssh-add mogą być używane w powłoce logowania, co oznacza, że ​​musisz wpisać hasło tylko raz podczas logowania

  • pęku kluczy można użyć do utrzymania ssh-agenta przy życiu poza wylogowaniem, więc na przykład możesz go mieć, więc musisz wprowadzić hasło tylko raz przy starcie, lub możesz utrzymywać go przy życiu przez około godzinę.

Problem, jaki mam, polega na tym, że oba te rozwiązania zwykle inicjowane są przy logowaniu do powłoki (np. .zshrc) Polegają na tym, że wprowadzam moje hasło po zalogowaniu, nawet jeśli nie będę go potrzebował odblokowany. (Nie jestem zadowolony z pęku kluczy utrzymującego agenta przy życiu przez czas nieokreślony).

Chciałbym być proszony o podanie hasła (dla agenta) tylko w razie potrzeby .

Więc mogę zalogować się na serwerze A, zrobić kilka rzeczy, a następnie ssh na serwerze B i w tym momencie poprosić o hasło. Zrób coś na serwerze B, wyloguj się. Wracając do A, zrób jeszcze kilka rzeczy, ssh ponownie do B i nie potrzebuję mojego hasła (jest w posiadaniu agenta).

Zauważam, że jest to możliwe na komputerach graficznych, takich jak Gnome - pojawia się wyskakujące okienko z prośbą o hasło, aby odblokować klucz prywatny, gdy tylko spróbujesz ssh. Właśnie o to mi chodzi, ale z konsoli.

artfulrobot
źródło
Dlaczego nie wygenerować kluczy ssh bez haseł? Jeśli i tak przejdziesz przez te wszystkie kłopoty?
devnull
1
Jeśli ktoś włamie się i są klucze bez hasła (lub aktywny agent ssh), może on również mieć dostęp do wielu innych serwerów. Klucze bez hasła mogą być również skradzione i użyte w innym miejscu.
artfulrobot
O ile mi wiadomo, nie ma możliwości robienia tego, co chcesz, bez poświęcania pewnego poziomu bezpieczeństwa, co brzmi, jakbyś nie chciał tego robić. Tam była szczegółowa odpowiedź Thomasa Nymana, która wchodzi w wiele możliwości, jeśli jeszcze jej nie przeczytałeś: unix.stackexchange.com/a/90869/82289 . W mojej firmie radzę sobie z tym za pomocą serwera pośredniego, który zarządza sesjami ssh z Tmux.
devnull
@DevNull wydaje się dziwne, że możesz to zrobić na pulpicie, ale nie na terminalu, prawda? Z pewnością wystarczy agentowi przeskoczyć do tty, jeśli nie dodano żadnych kluczy? To musi być sposób, w jaki działają gui?
artfulrobot
Możesz rzucić okiem na moją odpowiedź tutaj: unix.stackexchange.com/a/184160/89706 (Link do pytania: unix.stackexchange.com/questions/90853/... )
Johnny Wong

Odpowiedzi:

16

Nie dodawaj niczego do żadnego ze swoich skryptów startowych powłoki, jest to niepotrzebne włamanie.

Zamiast tego dodaj

AddKeysToAgent yes

do twojego .ssh / config

W ten sposób ssh-add jest uruchamiany automatycznie przy pierwszym uruchomieniu ssh w innym polu. Musisz tylko ponownie wprowadzić swój klucz, gdy wygaśnie z ssh-agent lub po ponownym uruchomieniu.

Toby
źródło
Chciałbym, żeby ludzie komentowali podczas głosowania. Jeśli to nie jest właściwe, ważne jest, aby wiedzieć, dlaczego to nie jest właściwe. Dzięki za opublikowanie, sam nie miałem czasu wypróbować Twojej sugestii.
artfulrobot
Też się zastanawiałem, może z powodu moich krzyżówek?
Toby
To działa dla mnie. Jest to jednak najnowszy dodatek do openssh (7.2). Jeśli komuś to pomoże, openssh 7.3 jest dostępny w Debian Sid.
artfulrobot
@artfulrobot: Dziwne, ponieważ miałem to samo zachowanie (automatyczne dodawanie ssh przy pierwszym wywołaniu ssh) działające przez lata, aż w końcu przestało istnieć jakiś czas temu. Szukając przyczyny, znalazłem AddKeysToAgent i założyłem, że powodem zatrzymania było to, że przez przypadek musiałem wyczyścić mój .ssh / config i AddKeysToAgent wraz z nim. Teraz zastanawiam się, dlaczego działało na długo przed wydaniem OpenSSH 7.2? Nie wyobrażam sobie tego :-)
Toby
@Toby właśnie tego potrzebuję. Niestety, ssh-agent nie wydaje się uruchamiać automatycznie w kubuntu, więc to kolejna rzecz, którą muszę rozwiązać.
Ogaday,
7

Zsh mapreexec hak, który wykonuje funkcję przed wykonaniem polecenia wprowadzonego w wierszu poleceń. Oto zaczep, który szuka sshw linii poleceń, a jeśli zostanie znaleziony, sprawdza obecność agenta ssh. Jeśli nie zostanie znaleziony, uruchamia pęku kluczy.

W ten sposób pęku kluczy uruchamia się tylko przed poleceniami ssh, a następnie tylko w razie potrzeby.

Umieść to w ~/.zshrc:

function check_ssh {
  [[ $3 =~ '\bssh\b' ]] || return
  [[ -n "$SSH_AGENT_PID" && -e "/proc/$SSH_AGENT_PID" ]] \
    && ssh-add -l >/dev/null && return
  eval `keychain --eval id_dsa --timeout 60`
}    
autoload -U add-zsh-hook
add-zsh-hook preexec check_ssh

To, co się tutaj dzieje, następuje po każdym wpisaniu polecenia, które check_sshjest wywoływane przed jego wykonaniem.

Pierwszy wiersz funkcji sprawdza rozwiniętą komendę pod kątem sshużycia wyrażenia regularnego Zsh. sshmuszą mieć granice słów po \bobu stronach. Jeśli to nie zostanie znalezione, funkcja powróci.

Następny wiersz sprawdza, czy w zmiennej środowiskowej istnieje proces agenta SSH i czy proces ten nadal istnieje w tabeli procesów, a następnie czy do agenta dodano co najmniej jeden klucz. Jeśli wszystko jest w porządku, agent ssh jest skonfigurowany i nie musimy nic robić, więc zwraca.

Wreszcie zaczynamy pęku kluczy, z agentem, który pozostanie przy życiu przez godzinę.

To wciąż pozostawia wątpliwości na temat wbudowanego ssh rzeczy, jak gitalbo rsyncczy scpjako że nie wywoła funkcję (można dodać je do regex).

artfulrobot
źródło
Nawet bez zshtego można stworzyć krótki skrypt z tym samym efektem i umieścić go PATHprzed rzeczywistym sshklientem. Może nawet działać z rsyncet al, jeśli czytają PATHzamiast uruchamiać /usr/bin/sshbezpośrednio.
ilkkachu
2

Dla Zsh napisałem zestaw narzędzi i opakowań, aby zrobić mniej więcej to, co chcesz: https://www.vinc17.net/unix/index.en.html#zsh-ssh-utils

Właściwie to robi się jeszcze bardziej, ponieważ ssh-agentbędą udostępniane przez wszystkie sesje logowania (pulpicie lub poprzez SSH i GNU ekranu jest obsługiwana zbyt jeśli zaczniesz powłok zgłoszeniowych od niego, np shell -zshw ~/.screenrcpliku) i będzie zamknąć dopiero po ostatnia sesja kończy się.

Uwaga: Używam tylko jednego hasła dla wszystkich moich kluczy. Nie jestem pewien zachowania dla różnych haseł; mogą wymagać pewnych zmian.

vinc17
źródło
Wow, to całkiem sporo kodu. Dobra robota i dziękuję za udostępnienie. Myślę, że potrzebuję czegoś prostszego - SSH jest dla mnie dość podstawowym narzędziem.
artfulrobot