Jak skonfigurować SSH, aby nie musiałem wpisywać hasła?

153

Jak skonfigurować SSH, aby nie musiałem wpisywać hasła podczas łączenia się z hostem?

Richard Hoskins
źródło
Można się spierać, czy używanie takich kluczy nie wymaga hasła. Aby uniknąć sytuacji, w której każdy, kto zdobędzie Twój klucz prywatny, może go rzeczywiście nadużyć, możesz zabezpieczyć go hasłem. Oczywiście można pozostawić to hasło puste, ale w wielu przypadkach nie byłoby to zalecane.
Arjan
W najnowszym Cygwin z najnowszym SSH otrzymałem ponownie monit, ponieważ musiałem wprowadzić zmiany w mojej, ~/.ssh/configktóra jest teraz wymagana PubkeyAcceptedKeyTypes ssh-rsa*,ssh-dss*
HDave

Odpowiedzi:

164

Wygeneruj klucz SSH (jeśli go nie masz)

Jeśli zdarzy ci się używać GNOME, aplikacja konika morskiego („Hasła i klucze szyfrowania”) może to zrobić za Ciebie: Plik -> Nowy -> Bezpieczny klucz powłoki .

Jeśli wolisz terminal, uruchom, aby wygenerować parę kluczy. Prawidłowe typy kluczy to:ssh-keygen -t <type>

  • rsa: domyślny
  • dsa: mniej więcej odpowiednik, z wyjątkiem ograniczonych do 1024 bitowych kluczy
  • ecdsa: to samo bezpieczeństwo z mniejszymi kluczami, ale stosunkowo nowe i nieco rzadkie w oprogramowaniu SSH.
  • ed25519: Wysokie bezpieczeństwo (bardziej odporne na ataki z kanału bocznego i słabe generatory liczb losowych). Bardzo szybkie generowanie sygnatur. Bardzo nowy. Dostępne tylko w OpenSSH> = 6,5 .

Program poprosi o podanie hasła i lokalizacji, w której chcesz zapisać nowy klucz. Zalecane jest użycie sugerowanej ścieżki domyślnej, ponieważ wszystkie inne narzędzia będą tam jej szukać.

Prześlij klucz publiczny na zdalny serwer

Ponownie konik morski często może to zrobić za Ciebie - w Moich kluczach osobistych kliknij prawym przyciskiem myszy klucz SSH i wybierz Konfiguruj klucz dla bezpiecznej powłoki .

Lub ssh-copy-id -i ~/.ssh/id_rsa.pub remote-user@remote-hostw terminalu.

Lub całkowicie ręcznie krok po kroku:

  1. Utwórz katalog (jeśli jeszcze nie istnieje) o nazwie .sshw katalogu osobistym użytkownika zdalnego na hoście zdalnym.
  2. W tym katalogu utwórz plik o nazwie authorized_keys(jeśli jeszcze nie istnieje).
  3. W przypadku, gdy pilot umaskjest bardziej liberalny niż zwykle sprawiają, że plik nie grupowego zapisu: chmod go-w ~/.ssh ~/.ssh/authorized_keys.
  4. Wreszcie, w jakiś sposób skopiuj (dodaj) zawartość lokalnego klucza publicznego ( ~/.ssh/id_rsa.pub) do zdalnego ~/.ssh/authorized_keyspliku.

Załaduj klucz do agenta ssh

Jeśli załadujesz swój klucz prywatny do agenta ssh , będzie on przechowywać odszyfrowany klucz w pamięci. Chcemy, aby uniknęło to ponownego wprowadzania hasła za każdym razem, gdy korzystamy z powłoki na serwerze.

Najpierw należy uruchomić agenta lub ścieżkę uruchomionego gniazda komunikacyjnego załadować do zmiennej. Uruchomienie ssh-agent na terminalu wygeneruje polecenia do przypisywania i ustawiania zmiennych agenta. Te polecenia można zapisać w pliku do użycia w innym terminalu. Alternatywnie można uruchomić te polecenia i zapomnieć o ponownym użyciu tego samego agenta w innym terminalu. np eval $(ssh-agent). :

Załadowanie klucza to prosta kwestia wykonania ssh-addi nadania mu hasła.

Jeśli korzystasz z GNOME, gnome-keyring-daemon zwykle zapewnia tę samą funkcjonalność agenta SSH, co ssh-agent, więc nie musisz nic uruchamiać. GNOME również automatycznie załaduje i odblokuje klucz podczas logowania.

Powłoka na zdalnym serwerze bez hasła

Jeśli wszystko zostało wykonane poprawnie, użycie nie wyświetli monitu o podanie hasła. Jeśli coś jest nie tak z agentem, a nie z kluczem, zostaniesz poproszony o wpisanie hasła do klucza, a nie hasła do konta użytkownika.ssh user@server

Wszystko, co korzysta z ssh do komunikacji, będzie działało bez wprowadzania hasła do konta użytkownika, gdy odpowiedni agent zostanie załadowany do agenta. Wykorzystują to programy takie jak scp , sftp i rsync .


Uwagi:

  • Potrzebujesz tylko klucza SSHv2, ponieważ SSHv1 jest bardzo niepewny i teraz nieużywany.
  • Potrzebujesz także tylko jednego rodzaju klucza - wystarczy RSA lub DSA. (ed25519 i ECDSA są najnowsze i dlatego nie są obsługiwane wszędzie).
  • Wszystkie te kroki są takie same dla kluczy RSA i DSA. Jeśli używasz DSA, użyj id_dsazamiast id_rsa, a ECDSA będzie mieć id_ecdsa.
  • Używane serwery OpenSSH starsze niż 3.0 authorized_keys2- ale jest naprawdę mało prawdopodobne, że znajdziesz coś starszego niż 5.0 w użyciu.
  • Te instrukcje dotyczą tylko OpenSSH w wersji 3.0 i nowszych. lsh, ssh.comi inne (uniksowe i nie) serwery SSH nie są uwzględnione w tym samouczku.

Przykłady:

  • Kopiowanie klucza publicznego na zdalny host:

    ssh-copy-id -i ~ / .ssh / id_rsa.pub myaccount @ remotehost # this
    
    cat ~ / .ssh / id_rsa.pub | ssh myaccount @ remotehost \
          'mkdir -p ~ / .ssh; cat >> ~ / .ssh / Author_keys '# or this
    
  • Zapisywanie zmiennych agenta do ponownego użycia (rozbudowany przykład)
    ssh-agent> ~ / .ssh / cross-terminal-agent
    . ~ / .ssh / cross-terminal-agent
    
grawitacja
źródło
7
ah, musisz powiedzieć „ssh-add {path-to-private-key-file}”, a następnie poprosi o podanie hasła. Uściśl to w swoim poście. Powinieneś także dodać „Czwarty, uruchom ssh”. Część problemu z dokumentacją z tymi rzeczami polega na tym, że przeskakuje przez pozornie oczywiste kroki, które NIE są oczywiste dla kogoś nowego w procesie, który nie ma pojęcia, co się dzieje i jak te programy działają razem.
Jason S
1
Jason: ssh-add -l ma sprawdzić, czy agent jest uruchomiony. ssh-add bez argumentów doda klucz z domyślnej lokalizacji (czyli ~ / .ssh / id_rsa). W każdym razie zaktualizowane.
grawity
4
istnieje polecenie, ssh-copy-idktóre kopiuje klucz publiczny do hosta docelowego i automatycznie ustawia uprawnienia.
hasen
1
Świetna odpowiedź! Trochę brakuje mu uprawnień do plików kluczowych plików - właśnie miałem z tym problem. Plik klucza prywatnego powinien być dostępny tylko dla mnie, a plik klucza publicznego powinien być przeze mnie zapisywalny.
ripper234 28.10.10
1
Jedna wkładka: ssh-keygen -f ~/.ssh/id_rsa -N "";ssh-copy-id -i ~/.ssh/id_rsa username@server-ip-or-address(wystarczy wymienić username@server-ip-or-address).
totymedli
22

Nie określiłeś, na którym Uniksie używasz, z jakim Uniksem się łączysz, z jakiej powłoki korzystasz, z jakiego wariantu SSH korzystasz itp. Więc niektóre z nich mogą wymagać niewielkiej korekty; jest to oparte na stosunkowo niedawnych wersjach OpenSSH, które są używane w wielu wariantach unix.

To wszystko z lokalnego systemu komputerowego.

ssh-keygen

Pamiętaj, aby użyć domyślnej nazwy klucza. I sugerują, że zrobić ustawić hasło na tym kluczem, w przeciwnym razie jest to problem bezpieczeństwa. „-t rsa” nie byłoby złym pomysłem, ale prawdopodobnie nie jest potrzebne.

ssh-copy-id username@server

Zostaniesz zapytany o hasło, którego użyjesz do zalogowania się, i skonfiguruje dla ciebie elementy autoryzowane_kluczy. (nie trzeba tego robić ręcznie)

Wtedy to:

`ssh-agent`

a może to:

exec ssh-agent sh

lub:

exec ssh-agent bash

Spowoduje to uruchomienie agenta SSH, który może przechowywać Twój klucz. W wielu współczesnych wariantach Uniksa, jeśli jesteś zalogowany graficznie, to już miało miejsce. Pierwszy wariant (z backtickami) umieszcza agenta ssh w tle i konfiguruje zmienne środowiskowe, aby z nim rozmawiać. W dwóch drugich agent uruchomi dla ciebie powłokę, więc gdy wyjdziesz z powłoki, agent wyjdzie.

Wiele współczesnych wariantów Uniksa będzie już miało dla ciebie agenta, szczególnie jeśli zalogowałeś się graficznie. Możesz spróbować „ ps aux | grep ssh-agent” lub „ ps -ef | grep ssh-agent”; jeśli coś już działa, użyj tego.

Wreszcie:

ssh-add

Poprosi o hasło; daj mu ten, który dałeś ssh-keygen. Są też sposoby, aby poprosić graficznie. I możesz umieścić ssh-agent i ssh-add rzeczy w swoich skryptach logowania (konfiguracja różni się w zależności od używanej powłoki), aby zautomatyzować to, ale niektóre warianty Unix (na przykład obecny Ubuntu Linux) robią większość z nich automatycznie, więc wszystko, co naprawdę musisz zrobić, to utworzyć klucz i użyć ssh-copy-id, aby ustawić go na zdalnym hoście.

Teraz „ ssh username@server” powinno działać bez pytania o uwierzytelnienie. Za kulisami używa klucza, który trzyma ssh-agent, i prosi agenta o wykonanie magicznych sztuczek podpisywania.

freiheit
źródło
11

Można to zrobić również w PuTTY na Windowsie.

Po skonfigurowaniu pary kluczy publiczny / prywatny (jak pokazują inne odpowiedzi tutaj) uruchom PuttyGen. Tam załaduj istniejący klucz prywatny, który już skonfigurowałeś, a następnie zapisz go jako klucz prywatny PuTTY (ppk).

Następnie w PuTTY, po prostu kliknij zapisaną sesję, do której chcesz się automatycznie zalogować i kliknij Załaduj. Stąd przejdź do Połączenia -> Dane w lewym okienku i w polu „Automatycznie loguj nazwę użytkownika” wpisz nazwę użytkownika dla tego zdalnego serwera:

Wpis nazwy użytkownika PuTTY

Następnie przejdź do Connection -> SSH -> Auth i wyszukaj ppk zrobione w PuttyGen:

Wprowadzanie klucza prywatnego PuTTY

Następnie wróć do strony sesji i zapisz wcześniej załadowaną sesję.

Mateusz
źródło
Pierwszy link do zdjęcia, „wpis nazwy użytkownika PuTTY”, wydaje się być uszkodzony.
Peter Mortensen,
2
PuTTY zawiera własną wersję ssh-agent; nazywa się Pageant. Działa w zasobniku systemowym i trzyma klucz za Ciebie. Nie musisz nigdy uruchamiać ssh-agenta, po prostu zaznacz „Zezwól na przekazywanie agentów” w opcjach PuTTY w sekcji Auth, a połączenie Pageant zostanie przekierowane na zdalny koniec, aby udostępnić ci twojego kluczowego agenta.
Kevin Panko,
3

Z bardzo podobnego pytania dotyczącego ServerFault polecam użycie ssh-copy-id , który wykonuje wszystkie kroki związane z konfigurowaniem kluczy uwierzytelniających:

ssh-copy-id to skrypt, który używa ssh do logowania do zdalnego komputera (prawdopodobnie przy użyciu hasła logowania, więc uwierzytelnianie hasła powinno być włączone, chyba że sprytnie wykorzystałeś wiele tożsamości)

Zmienia również uprawnienia zdalnego domu, ~ / .ssh i ~ / .ssh / uprawnione_klucze do usuwania możliwości zapisu grupowego (co w innym przypadku uniemożliwiłoby zalogowanie się, jeśli zdalny sshd ma ustawione StrictModes w swojej konfiguracji).

Jeśli podano opcję -i, wówczas używany jest plik tożsamości (domyślnie ~ / .ssh / tożsamość.pub), niezależnie od tego, czy w ssh-agent są jakieś klucze.

Wszystko, co musisz zrobić, to po prostu:

ssh-copy-id user@host

Wpisz hasło raz i możesz zacząć!

Chris Bunch
źródło
3

Oprócz wszystkiego, co już powiedziano, jak ustawić klucze ssh, polecam Keychain jako frontend konsoli ssh-agent, który pozwala obsłużyć tylko jeden proces systemowy zamiast logowania.

Wiem, że istnieją już narzędzia GNOME i KDE, które robią to samo, ale jeśli jesteś ćpunem konsolowym, jest to świetne (i może być używane w większości systemów uniksowych).

Aby go użyć, po prostu dodaj do swojego ~/.bashrc(podobnie jak w przypadku innych powłok):

if type keychain >/dev/null 2>/dev/null; then
  keychain --nogui -q <all your SSH/PGP keys>
  [ -f ~/.keychain/${HOSTNAME}-sh ] && . ~/.keychain/${HOSTNAME}-sh
  [ -f ~/.keychain/${HOSTNAME}-sh-gpg ] && . ~/.keychain/${HOSTNAME}-sh-gpg
fi
Fran
źródło
2

http://linuxproblem.org/art_9.html

Twój cel

Chcesz używać Linuksa i OpenSSH do automatyzacji swoich zadań. Dlatego potrzebujesz automatycznego logowania z hosta A / użytkownika a do hosta B / użytkownika b. Nie chcesz wprowadzać żadnych haseł, ponieważ chcesz wywoływać ssh z poziomu skryptu powłoki.

TheTXI
źródło
1
Ta opinia nie była moja, ale nie miałbym nic przeciwko usuwaniu odpowiedzi przez ludzi, gdyby zauważyli, że ktoś jeszcze kilka chwil wcześniej opublikował prawie podobną odpowiedź.
Arjan
2
Arjan: W większości się z tobą zgadzam, ale kiedy posty są oddzielone tylko o kilka sekund, niekoniecznie uważam, że sprawiedliwe jest karanie osoby na 2. miejscu. Nie twierdzę, że musisz nagradzać ich poprzez głosowanie w górę, ale głosowanie w dół sprawia wrażenie, że odpowiedź jest zła, a nie na czas
TheTXI
2

Napisałem ten bardzo krótki samouczek po NAPRAWDĘ NAPRAWDĘ sfrustrowanym NAPRAWDĘ NAPRAWDĘ długimi samouczkami, bo to naprawdę takie proste :)

test -f ~/.ssh/id_rsa.pub || ssh-keygen -t rsa #press enter twice if given prompts, then "ssh-add"

scp ~/.ssh/id_rsa.pub destID@destMachine:/tmp/ #type password

ssh destID@destMachine #type password

cat /tmp/id_rsa.pub >> ~/.ssh/authorized_keys

rm /tmp/id_rsa.pub
samthebest
źródło
2

Putty ma -pwopcję, która pozwala utworzyć skrót na pulpicie w następujący sposób:

"C:\Program Files\PuTTY\putty.exe" -ssh [email protected] -pw your_password
Enes Genç
źródło
1
  1. Na łączącym hoście uruchom ssh-keygen. (Jeśli powie Ci, że musisz określić typ, zrób to ssh-keygen -t rsa). Gdy poprosi o lokalizację pliku, wybierz domyślną wartość. Gdy pojawi się prośba o hasło, naciśnij Enter, aby nie podać hasła.
  2. cat ~/.ssh/id_rsa.pub(lub jakakolwiek była domyślna lokalizacja pliku ssh-keygen, chociaż trzeba by mieć naprawdę starą sshinstalację, aby była inna); skopiuj dane wyjściowe do schowka.
  3. Zaloguj się normalnie do hosta docelowego jako konto, z którym chcesz się połączyć. Edytuj plik ~/.ssh/authorized_keys(jeśli ~/.sshnie istnieje, slogingdzieś; jest to prosty i łatwy sposób na utworzenie go z odpowiednimi uprawnieniami). Wklej swój schowek (zawierający id_rsa.pubinny host) do tego pliku.
chaos
źródło
3
-1 za sugerowanie, aby nie dodawać hasła. Bez hasła każdy, kto czyta plik, może teraz udawać legalnego użytkownika.
bortzmeyer
2
Po pierwsze poprosił, aby nie musiał wpisywać swojego hasła; Naprawdę nie sądziłem, że wpisanie hasła zamiast hasła byłoby poprawą. Po drugie, mylisz się; dlatego istnieje klucz publiczny i klucz prywatny, dzięki czemu klucz publiczny może być na świecie.
chaos
Hasło to jest wpisywane podczas generowania klucza, a nie za każdym razem, gdy się łączysz. Poprawny?
Richard Hoskins,
Nie. Klucze wygenerowane za pomocą hasła wymagają wprowadzenia hasła za każdym razem, gdy klucz jest używany.
chaos
2
Źle. W ssh-agent (patrz zaakceptowana odpowiedź) hasło wpisujesz tylko raz na sesję.
bortzmeyer
0

Jeśli chcesz to wszystko zrobić w terminalu w systemie Linux:

Na hoście

cd ~ / .ssh /

ssh-keygen -t {rsa | dsa} -b {1024 | 2048 | 4096} -C "tekst komentarza, jeśli chcesz" -f id_ArbitraryName

Pozycje w {} to opcje, użyj rsa lub dsa i wybierz rozmiar bitu (większy jest bardziej bezpieczny)

Następnie musisz dodać uprawnienia do plików autoryzowanych_kluczy i autoryzowanych_kluczy2.

cat id_ArbitraryName.pub >> klucze_autoryzowane

cat id_AribtraryName.pub >> klucze_autoryzowane2

Następnie pobierz plik id_AribtraryName do pola, z którego chcesz ssh. Jeśli skrzynka połączeniowa jest oparta na systemie Unix, może być konieczny plik konfiguracyjny (w putty, ktoś powyżej to ukrył).

Na skrzynce połączeniowej

W twoim pliku konfiguracyjnym - vim ~ / .ssh / config

Host example.host.com # lub nazwa komputera

Nazwa użytkownika

IdentityFile ~ / .ssh / id_ArbitraryName

Plik konfiguracyjny wymaga uprawnień 600. Folder SSh wymaga 700.

Mam nadzieję, że to pomoże, jeśli napotkasz problem konfiguracji, który jest często pomijany.

nerdwaller
źródło