Buforuj hasło, jeśli klucze SSH są zabronione

46

Mam serwer, do którego muszę często uzyskiwać dostęp przez ssh, ponieważ na nim obliczam. Teraz centrum komputerowe wyraźnie zabrania kluczy SSH, ponieważ są „niepewne”. Uważają, że wpisanie mojego hasła na klawiaturze za każdym razem, możliwe przed innymi ludźmi, jest znacznie bezpieczniejszym sposobem logowania.

Teraz; Nie mogę zmienić ich zdania (próbowałem).

Czy istnieje sposób na przynajmniej tymczasowe przechowywanie haseł SSH, tak jak GIT może przechowywać hasła w pamięci podręcznej przez określony czas?

użytkownik2667180
źródło
55
the computing center explicitly forbids SSH-keys because they are "insecure"- moja opinia w tej sprawie? Znajdź nowego hosta serwera, ponieważ twój jest oczywiście nieudolny.
Matt Clark
18
@Matt: „centrum komputerowe” brzmi bardziej jak akademicki system gridowy, który, jak sądzę, nie ma tak dużej konkurencji
grawity
27
Oni są źli. Prawdopodobnie zapomnieli wyłączyć klucze ssh po wygaśnięciu kont, więc zdecydowali, że problem stanowią klucze ssh.
Joshua
10
grawitacja ma rację. to narodowy superkomputer, więc utknąłem z nim. za ile jest warta, maszyna jest ładna. Joshua prawdopodobnie też ma rację, ale cóż, to prawo nie nadaje się do niczego
user2667180
7
@TheHansinator Jeśli jest zainstalowany keylogger, już jesteś zagrożony do tego stopnia, że ​​nie ma już znaczenia, czy chronisz połączenia ssh. Istnieją jednak inne zalety publickeyuwierzytelniania. Jeśli wyłączysz passworduwierzytelnianie na serwerze, uniemożliwisz wszystkim tym atakującym odgadnięcie haseł. A jeśli atakujący podejmie próbę ataku mitm na klienta, który wcześniej nie przechowywał klucza publicznego serwera, jesteś znacznie lepiej chroniony publickeyniż przy użyciu passworduwierzytelniania.
kasperd

Odpowiedzi:

63

Ponowne użycie połączenia

SSHv2 pozwala temu samemu uwierzytelnionemu połączeniu na ustanowienie wielu „kanałów” - powłoki interaktywnej, polecenia wsadowego, SFTP, wraz z dodatkowymi, takimi jak przekazywanie agentów lub przekazywanie TCP. Twój serwer prawdopodobnie domyślnie obsługuje multipleksowanie połączeń. (Jeśli Twoi administratorzy narzekają, nigdzie nie buforuje Twojego hasła - buforuje całe połączenie).

Z OpenSSH masz ControlMasteri ControlPathopcje (-M i -S), aby skorzystać z tego:

  1. Uruchom „główne” połączenie SSH za pomocą -M. (Ponieważ nie masz jeszcze ścieżki ControlPath w konfiguracji, musisz ją określić w wierszu polecenia, używając -S. Musi długo działać , więc dodam -fNopcje, aby przejść do tła; w przeciwnym razie są one opcjonalne).

    $ ssh [email protected] -fNMS ~/.ssh/bar.socket
    [email protected]'s password:
    

    Wróciłeś do lokalnej powłoki.

  2. Rozpocznij nowe połączenie przez master:

    $ ssh [email protected] -S ~/.ssh/bar.socket
    

    Jesteś w.

  3. Aby było to przydatne dla Git / rsync / SFTP, musisz skonfigurować ControlPathw swojej konfiguracji, ponieważ nie będziesz w stanie określić -Scały czas:

    Host *
        ControlPath ~/.ssh/S.%r@%h:%p
    

Możesz to zautomatyzować - najnowsze wersje OpenSSH mają również tę, ControlPersistktóra automatycznie ustanawia połączenie główne w tle, jeśli jeszcze go nie ma. Pozwala to pominąć krok 1 i po prostu użyć ssh, jak zwykle.

  1. Konfiguracja w ~/.ssh/config:

    Host *
        ControlPath ~/.ssh/S.%r@%h:%p
        ControlMaster auto
        ControlPersist 15m
    
  2. Pierwsze połączenie wymaga podania hasła:

    $ ssh [email protected]
    [email protected]'s password:
    [foo@bar:~]$ exit
    
  3. Drugi nie:

    $ ssh [email protected]
    [foo@bar:~]$ yay
    

Aby kontrolować multiplekser (zatrzymaj go lub skonfiguruj przekazywanie TCP), użyj -Oopcji.

Podobną metodę obsługują najnowsze wersje PuTTY .

grawitacja
źródło
1
dziękuję bardzo za tę miłą odpowiedź. google nie było przydatne w tym problemie, ponieważ zawsze zmieniało się w klucze ssh i nie znałem odpowiednich słów kluczowych. bardzo mi pomogło!
user2667180,
1
Powinno to być oczywiste, ale jeśli używasz tej konfiguracji, musisz koniecznie upewnić się, że Twoje konto jest zabezpieczone i że folder .ssh jest poprawnie zamknięty, ponieważ każdy, kto ma dostęp do plików kanałów na tym komputerze, może piggyback z twojego połączenie i uzyskaj dostęp do serwera tak jak Ty.
Shellster
3
@shellster: Masz na myśli „każdy z tym samym UID”, tak jak ma to już miejsce w przypadku ssh-agent. Nawet jeśli celowo otworzysz uprawnienia do pliku gniazda (domyślnie są to 0600), inni użytkownicy po prostu wyciągną z tego „niedopasowanie multipleksowania UID”.
grawity
3
@shellster Ktoś z rootem może zainstalować keylogger i ukraść hasło do zdalnego systemu, lub wykonać dowolną liczbę nikczemnych rzeczy. Jeśli martwimy się o lokalny root, nie jest to mniej bezpieczne niż zapisanie klucza prywatnego SSH.
amalloy
1
Nie uważam lokalnego roota za zagrożenie, ponieważ jeśli kiedykolwiek stanie się zagrożeniem, toast toast bez względu na wszystko. (Podobnie jak rząd klasy szpiegostwo.) Szczerze miejscowy korzeń może po prostu zastąpić klienta ssh i ssh-agent z co chcą. Czy przechowywać wszystkie hasła i klucze prywatne w /root/.secret? Pewnie.
grawitacja
19

Posługiwać się sshpass

sshpass ( github , strona man ) to narzędzie, które automatycznie podaje hasło do ssh. Bezpiecznym sposobem korzystania z niego jest:

% echo 'correct horse battery staple' > ~/.ssh/compute_password
% chmod go-rw ~/.ssh/compute_password

% sshpass -f ~/.ssh/compute_password ssh foo@host

Spowoduje to odczytanie hasła ~/.ssh/compute_password, podobnie jak pliku klucza prywatnego bez hasła. Możesz umieścić sshpasspolecenie w małym skrypcie powłoki lub w aliasie powłoki, aby uniknąć wpisywania pełnego polecenia. Niestety nie znalazłem sposobu, aby to zrobić ~/.ssh/config.

(Możliwe jest również określenie hasła bezpośrednio w wierszu polecenia sshpass, ale należy tego unikać, ponieważ wycieka ono hasło każdemu, kto może to zrobić ps)

Porównanie z innymi metodami

Takie podejście jest oczywiście mniej bezpieczne niż prawidłowe skonfigurowanie uwierzytelniania za pomocą klucza publicznego, ale prawdopodobnie już o tym wiesz.

Jest również mniej bezpieczny niż odpowiedź @ grawity na temat ponownego użycia połączenia, ale ma tę zaletę, że wcale nie musi wprowadzać hasła interaktywnie.

Można rozważyć odpowiedź @ grawity jako alternatywę dla uwierzytelniania klucza publicznego za pomocą hasła i buforowania klucza prywatnego (tj ssh-agent.). Wtedy moja odpowiedź byłaby alternatywą dla uwierzytelniania klucza publicznego bez hasła w pliku klucza prywatnego.

marcelm
źródło
3
Jeśli zasady centrum komputerowego zostały napisane w oparciu o „ale pary kluczy są przechowywane na dysku, na którym ktoś mógłby je ukraść!”, Wygląda na to, że ta polityka raczej się odwróci.
grawity
6
@grawity Cóż, złe zasady prowadzą do jeszcze gorszych obejść ¯ \ _ (ツ) _ / ¯
marcelm
1
Jeśli wygenerujesz hasło jako wystarczająco długi strumień losowych znaków (na przykład head -c 16 /dev/urandom | base64dla 128 bitów) i nie użyjesz go w innych systemach, to pod względem bezpieczeństwa jest podobny do klucza. Tak trudna do brutalnej siły i tak prosta w użyciu z pliku, jeśli nie jest zaszyfrowana. Dotyczy to również złego faceta, jeśli dostaną plik. Jedyną różnicą jest to, że hasło jest wysyłane do serwera w niezmienionej postaci, podczas gdy klucze mają lepszą matematykę, aby udowodnić, że posiadasz poprawny klucz prywatny bez ujawnienia go, a pod względem użyteczności trudniej jest zaszyfrować plik zawierający hasło (nie standardowe narzędzia).
ilkkachu
1

Użyj menedżera haseł.

Niektóre menedżery haseł (np. KeePassXC) mają funkcję „automatycznego wpisywania”. Przechowujesz hasło w menedżerze haseł, odblokowujesz bazę danych po uruchomieniu menedżera i za każdym razem, gdy sshmonitujesz o hasło, naciskasz kombinację klawiszy, która powoduje, że menedżer haseł zapisuje twoje długie hasło do konsoli.

Nie musisz kopiować, zapamiętaj cokolwiek (oprócz hasła do odblokowania bazy danych) i możesz mieć silne hasło bez mashowania tych 30 znaków przy każdej próbie logowania.

Możesz wybrać swój ulubiony z tej listy: https://en.wikipedia.org/wiki/List_of_password_managers

mucha styropianowa
źródło
3
Nie jestem pewien, czy funkcja automatycznego wpisywania działa dobrze z programami terminalowymi. Wykrywanie będzie szukało konkretnego tytułu okna, a samo autotypowanie najlepiej nie ma fantazyjnych funkcji „zapobiegających keyloggingowi”, które KeePass2 miał ...
grawity
1
@grawity gnome-terminalzmienia tytuł na ssh somehostkiedy ssh prosi mnie o hasło, dzięki czemu możesz bez problemu dopasować okno tytułu do tego. Nie wiem nic o funkcjach „anti-keylogging” - codziennie używam KeePassXC w terminalu, a najgorsze, z czym miałem do czynienia, to wybranie odpowiedniego konta z listy.
styropian mucha
2
@grawity W każdym przypadku należy włączyć funkcje blokowania klawiatury dla poszczególnych wpisów (właśnie z tego powodu, że wiele programów nie obsługuje wklejania).
Bob
0

Inną alternatywą jest użycie klienta ssh z GUI. W systemie Windows oczywistym wyborem byłby PuTTY . Istnieje również wersja PuTTY na Linuksa, zwłaszcza większość dystrybucji opartych na Debianie, takich jak Ubuntu, zwykle zawierają PuTTY w swoich repozytoriach.

Kolejnym naprawdę dobrym klientem jest Termius . Obsługuje nie tylko Windows i Linux, ale także OSX, iOS i Android. Chociaż została zaprojektowana przede wszystkim na telefony, wersja komputerowa jest całkiem dobra.

Jeśli się nie mylę, czcigodny Hyperterminal w systemie Windows również ma / miał wbudowanego klienta ssh, ale nie używałem systemu Windows od bardzo dawna, więc nie jestem do końca pewien.

Wszyscy klienci GUI mają możliwość zapisywania ustawień połączenia, które obejmują nazwę użytkownika i hasło.

Slebetman
źródło
2
„Oparty na GUI” nie oznacza automatycznie, że pozwoli na przechowywanie twojego hasła, czego wyraźnie odmawia PuTTY . Wersja HyperTerminal dołączona do systemu Windows była przeznaczona tylko dla Telnet i skupiała się bardziej na łączach szeregowych. Być może myślisz o CKermit dla Windows, który ma obsługę SSH, ale jego obsługa szyfrów jest tak przestarzała, że ​​nie będzie łatwo łączyć się z wieloma obecnymi serwerami.
grawity