Jak skonfigurować logowanie SSH bez hasła?

252

Chcę mieć możliwość zalogowania się do pilota przez ssh bez konieczności ciągłego wprowadzania hasła.

  • Jak to skonfigurować?
  • Czy do wykonania sesji bez hasła wymagane jest inne polecenie?
Oxwivi
źródło
Czy używasz openssh? (jeśli tak, to łatwe;))
Rinzwind
@Rinzwind, Dlaczego miałbym zawracać sobie głowę otrzymaniem zastrzeżonej wersji, gdy OpenSSH jest już wstępnie zainstalowany?
Oxwivi
15
Staram się nie robić napaści;)
Rinzwind
1
@Kevin, proszę się wyjaśnić. Mówimy o wysyłaniu wiadomości bez hasła, co jest ogólnie dobrą praktyką . Masz na myśli ssh-ing w root root? To pytanie nie obejmuje tego.
Oxwivi
@Oxwivi: Przepraszam, powinien to być komentarz do odpowiedzi Ravindry, która dotyczy logowania do roota.
Kevin

Odpowiedzi:

266

Odpowiedź

Wykonaj następujące polecenia:

ssh-keygen

Następnie musisz skopiować nowy klucz na serwer :

ssh-copy-id user@host
## or if your server uses custom port no:
ssh-copy-id "user@host -p 1234"

Po skopiowaniu klucza ssh do komputera jak zwykle:

ssh user@host

Możesz teraz zalogować się bez wprowadzania hasła z komputera, na którym wykonałeś polecenia.

Przykład

not-marco@rinzwind-desktop:~$ ssh-keygen 
Generating public/private rsa key pair.
Enter file in which to save the key (/home/not-marco/.ssh/id_rsa): 
Created directory '/home/not-marco/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/not-marco/.ssh/id_rsa.
Your public key has been saved in /home/not-marco/.ssh/id_rsa.pub.
The key fingerprint is:
b1:25:04:21:1a:38:73:38:3c:e9:e4:5b:81:e9:ac:0f not-marco@rinzwind-desktop
The key's randomart image is:
+--[ RSA 2048]----+
|.o= . oo.        |
|*B.+ . .         |
|*=o .   o .      |
| = .     =       |
|. o     S        |
|E.               |
| o               |
|  .              |
|                 |
+-----------------+

not-marco@rinzwind-desktop:~$ ssh-copy-id not-marco@server
not-marco@server's password: 
Now try logging into the machine, with "ssh 'not-marco@server'", and check in:

  ~/.ssh/authorized_keys

to make sure we haven't added extra keys that you weren't expecting.

Wyjaśnienie

Zakłada się, że można już pomyślnie połączyć się z serwerem za pośrednictwem SSH.

Musisz wygenerować klucz SSH, który pozwoli ci zidentyfikować siebie jako osobę bez używania hasła. Możesz zdecydować się na ochronę kluczy hasłem, jeśli chcesz, ale można to pozostawić puste, umożliwiając dostęp SSH bez hasła.

  1. Najpierw utwórz klucz SSH, uruchamiając ssh-keygengo, aby utworzyć plik id_rsai id_rsa.pub. pubPlik jest to, co dzieje się na serwerach, klucz prywatny ( id_rsa) jest to, co pozostaje z wami i to w jaki sposób identyfikować siebie.
  2. Następnie skopiuj klucz publiczny na serwer, ssh-copy-id user@serverzastępując użytkownika zdalnym użytkownikiem, a serwerem nazwą DNS komputera lub adresem IP. Zostaniesz poproszony o podanie hasła SSH, wprowadź je, a jeśli wszystko się powiedzie, będziesz mógł uzyskać dostęp do urządzenia ssh user@serverbez potrzeby podawania hasła.

Bibliografia

Rinzwind
źródło
11
@Oxwivi ta odpowiedź jest bardziej poprawnym sposobem - ale wydaje się dłuższa. Wszystko, co musisz zrobić, to wpisać się ssh-keygenzgodnie z instrukcjami wyświetlanymi na ekranie, a następnie wpisać ssh-copy-id user@serverzastępując użytkownika zdalnym użytkownikiem, a serwer zdalnym komputerem
Marco Ceppi
3
Miałem ten błąd „Agent przyznał, że nie podpisał się przy użyciu klucza”. za każdym razem, gdy próbujesz się zalogować po wykonaniu tej procedury. Rozwiązaniem było uruchomienie „> ssh-add” na komputerze lokalnym, a teraz mogę zalogować się na komputerze zdalnym zgodnie z oczekiwaniami.
jmbouffard
1
Warto wspomnieć, że jeśli trzeba użyć niestandardowego portu dla @server, trzeba to zrobić z: ssh-copy-id "[email protected] -p 1234".
s3m3n
@Rinzwind: Czy to oznacza, że ​​nigdy nie mogę uwierzytelnić się z nieznanego klienta / komputera na moim serwerze, jeśli wyłączę uwierzytelnianie passwd i zezwolę tylko na uwierzytelnianie za pomocą klucza. Czy jest jakiś sposób, aby zezwolić na logowanie z nieznanego komputera przy użyciu klucza prywatnego wygenerowanego dla znanego / skonfigurowanego klienta do komunikacji z serwerem? Mam na myśli, czy ten klucz prywatny jest przenośny i może być używany do uwierzytelniania się na serwerze z innych maszyn, w razie nagłych potrzeb?
Rajat Gupta
4
Ale serwer wciąż prosi o hasło ,,,
Lerner Zhang
34

Wpisz następujące polecenia:

  1. ssh-keygen

    Naciskaj Enterklawisz, aż pojawi się monit

  2. ssh-copy-id -i root@ip_address

    (Raz poprosi o hasło do systemu hosta)

  3. ssh root@ip_address

Teraz powinieneś być w stanie zalogować się bez hasła.

Ravindra
źródło
25

Zwykle robię to w następujący sposób:

ssh-keygen -t rsa

(Gdy pojawi się monit o hasło, pozostaw je puste)

Następnie: cat ~/.ssh/id_rsa.pub | ssh username@hostname 'cat >> .ssh/authorized_keys'

(Wymaga to, aby folder .ssh znajdował się w katalogu domowym na docelowej nazwie hosta, w którym znajduje się plik autoryzowanych_kluczy)

Oczywiście zastąp nazwę użytkownika żądaną nazwą użytkownika, a nazwę hosta żądaną nazwą hosta lub adresem IP

Następnie po prostu SSH do tego pola, tak jak jesteś przyzwyczajony.

Kyentei
źródło
Co o touchi chmodpolecenia w odpowiedzi Rinzwind za?
Oxwivi
7
Musisz przeskoczyć do .ssh/authorized_keyspliku na 0600, inaczej to nie zadziała
Marco Ceppi
To naprawdę pomogło, ponieważ nie mogłem zmusić ssh-copy-id do pracy z rootem na moim serwerze. musi być zrootowany w sytuacji, gdy backuppc (lub inny demon) musi ssh na innym komputerze.
Adam
18

Zwykle używam sshpassdo tego, instaluję go sudo apt-get install sshpassi używam w ten sposób

sshpass -p 'password' ssh your_username@your_server
Bruno Pereira
źródło
6
Dlaczego nie używać kluczy SSH?
enzotib,
1
To nie jest sytuacja „dlaczego nie”, nadal działa idealnie bez dodawania kluczy, to tylko inna metoda, którą powiedziałbym.
Bruno Pereira,
Dzięki za informację o sshpass, nigdy wcześniej o niej nie słyszałem.
Panther
7
Klucze SSH to „poprawna” odpowiedź na pytanie, ale sshpassjest to bardzo przydatny hack w przypadkach, gdy nie można zmienić metody uwierzytelniania na zdalnym serwerze!
Jacob Krall
9
Jest to bardzo niebezpieczne, będziesz przechowywać w bash_history lub cokolwiek prostego hasła do hostów, z którymi się łączysz ..
kappa
10

Wyłącz uwierzytelnianie hasła

Ponieważ wiele osób korzystających z serwerów SSH używa słabych haseł, wielu atakujących online szuka serwera SSH, a następnie losowo zaczyna zgadywać hasła. Atakujący może wypróbować tysiące haseł w ciągu godziny i odgadnąć nawet najsilniejsze hasło, mając wystarczająco dużo czasu. Zalecanym rozwiązaniem jest użycie kluczy SSH zamiast haseł. Aby być tak trudnym do odgadnięcia jak zwykły klucz SSH, hasło musi zawierać 634 losowych liter i cyfr. Jeśli zawsze będziesz w stanie zalogować się do komputera za pomocą klucza SSH, należy całkowicie wyłączyć uwierzytelnianie za pomocą hasła.

Jeśli wyłączysz uwierzytelnianie za pomocą hasła, będzie można połączyć się tylko z komputerów, które zostały specjalnie zatwierdzone. To znacznie poprawia twoje bezpieczeństwo, ale uniemożliwia ci połączenie się z własnym komputerem z komputera znajomego bez wcześniejszego zatwierdzenia komputera lub z własnego laptopa, gdy przypadkowo usuniesz klucz.

Zaleca się wyłączenie uwierzytelniania hasła, chyba że masz konkretny powód, aby tego nie robić.

Aby wyłączyć uwierzytelnianie za pomocą hasła, poszukaj następującego wiersza w pliku sshd_config:

#PasswordAuthentication yes

zamień go na linię wyglądającą tak:

PasswordAuthentication no

Po zapisaniu pliku i zrestartowaniu serwera SSH nie powinieneś być nawet pytany o hasło podczas logowania.

https://help.ubuntu.com/community/SSH/OpenSSH/Configuring#disable-password-authentication

Thufir
źródło
2
To najbardziej podstawowa poprawna odpowiedź, ale dobra dla bezpieczeństwa! Również wyłączenie logowania roota jest kolejnym dobrym
FreeSoftwareServers
Wpływa PasswordAuthentication nona wszystkich użytkowników? Jeśli nie, jak mogę go wyłączyć dla zwykłych użytkowników, ale pozostawić go bez zmian dla roota podczas testowania? Naprawdę nie chcę tego udaremniać i całkowicie się zamykać.
Adam
Pozostaw sesję ssh otwartą, aby móc ją z powrotem zmienić. Chcesz wyłączyć hasła ORAZ rootować. Tak, możesz to polubić. Nie;)
Thufir,
Podczas ssh mam błąd Permission denied (publickey).z PasswordAuthentication no. Co mam zrobić Czy mogę zmienić PasswordAuthentication nona innym hoście?
ParisaN
9

To rozwiązanie jest przeznaczone specjalnie dla użytkowników korzystających z systemu Windows do ssh na swoich zdalnych komputerach, w tym obrazach w chmurze w AWS Cloud i GCE Cloud

Zrzeczenie się

Ostatnio użyłem tego rozwiązania do zdalnego logowania nowych wdrożonych obrazów VM na GCE.


Narzędzia użyte:

  1. puttygen pobierz puttygen
  2. winscp pobierz winscp

Kroki do wykonania:

  1. Wygeneruj parę kluczy publiczny / prywatny za pomocą puttygen.
  2. Prześlij klucz publiczny na swój serwer w chmurze lub w zdalnej lokalizacji.

Jak to zrobić:

1. Wygeneruj klucz / parę lub użyj istniejącego klucza prywatnego

Jeśli posiadasz klucz prywatny:

Otwórz puttygen, naciśnij przycisk ładowania i wybierz *.pemplik klucza prywatnego ( ).


Jeśli nie posiadasz klucza prywatnego:

  • Otwarte puttygen,
  • Wybierz żądany typ klucza SSH2 DSA (możesz użyć RSA lub DSA) w sekcji Parametry . Ważne jest, aby pozostawić puste pole hasła.
  • Naciśnij generatei postępuj zgodnie z instrukcjami, aby wygenerować parę kluczy (publiczny / prywatny).

Przykładowa generacja klucza pic

(ze źródła 1, link podany poniżej)

2. Utwórz nowy plik „klucze autoryzowane” (z notepad)

Skopiuj dane klucza publicznego z sekcji „Klucz publiczny do wklejenia do pliku kluczy autoryzowanych OpenSSH” generatora kluczy PuTTY i wklej dane klucza do authorized_keyspliku.


Upewnij się, że w tym pliku jest tylko jeden wiersz tekstu.


3. Prześlij klucz na serwer Linux

  • Otwórz WinSCP,
  • Wybierz protokół pliku SFTP i zaloguj się przy użyciu poświadczeń ssh.
  • Po sukcesie zobaczysz strukturę katalogu domowego na zdalnym komputerze.

Prześlij plik autoryzowanych kluczy do katalogu domowego na zdalnym komputerze.


4. Ustaw odpowiednie uprawnienia

Utwórz .sshkatalog (jeśli nie istnieje)


Skopiuj authorized_keysplik do .sshkatalogu.
(spowoduje to zastąpienie istniejącego authorized_keyspliku, zwróć uwagę na to).

Jeśli plik istnieje, po prostu dodaj zawartość tego pliku do istniejącego pliku.


Uruchom polecenia, aby ustawić uprawnienia:

sudo chmod 700 .ssh && chmod 600 .ssh/authorized_keys

Teraz będziesz mógł przejść sshdo zdalnego komputera bez podawania poświadczeń za każdym razem.

Dalsza lektura:

devprashant
źródło
4

Jeśli utworzysz parę kluczy publicznych / cenowych i zalogujesz się przy użyciu naszego nowo utworzonego klucza publicznego, nie będziesz musiał wpisywać swojego hasła. W zależności od konfiguracji twojego breloka i / lub agenta ssh może być konieczne zabezpieczenie twojego klucza hasłem.

Oto jedno z wielu krótkich poradników dla Ciebie. Kluczowe znaczenie dla bezpieczeństwa tej metody ma to, aby wygenerowany klucz prywatny pozostał prywatny! Nigdy nie należy udostępniać go nikomu ani zezwalać na dostęp do niego w jakikolwiek sposób.

To polecenie generuje dość silny klucz w ~/.ssh/:

ssh-keygen -b 4096

W ~/.ssh/znajdziesz swój klucz publiczny jako id_rsa.pub. Jego zawartość należy dołączyć do authorized_keyspliku serwera , przenosząc za pośrednictwem przenośnego nośnika (pendrive) lub krótko włączając uwierzytelnianie hasła na serwerze, a następnie używając go, ssh-copy-id ~/.ssh/id_rsa.pub username@servera następnie ponownie wyłączając.

Jeśli zdecydujesz się zabezpieczyć swój klucz za pomocą hasła (w pierwszym kroku), możesz użyć ssh-agentlub klucza Ubuntu, aby zabezpieczyć ten farysek lokalnie, więc nie musisz go cały czas wpisywać.

dezorientować
źródło
3

Aby wprowadzić pewne zmiany:

  • Mac domyślnie nie ma ssh-copy-id, sam musisz go zainstalować:

    curl https://raw.github.com/beautifulcode/ssh-copy-id-for-OSX/master/ssh-copy-id.sh -o /usr/local/bin/ssh-copy-id
    chmod +x /usr/local/bin/ssh-copy-id
    

znajdź więcej tutaj: https://github.com/beautifulcode/ssh-copy-id-for-OSX

  • jeśli dokonałeś przekierowania portów, polecenie powinno wyglądać tak:

    ssh-copy-id "[email protected] -p 2222"
    

zauważ, że cytaty są konieczne.

samluthebrave
źródło
3

Zdalne logowanie / kopiowanie bez podawania hasła

Odpowiednio aplikacje sshoraz scpzdalne logowanie i zdalne kopiowanie umożliwiają komunikację ze zdalnym hostem bez podawania hasła. Wymaga to przestrzegania procedury uwierzytelniania, takiej jak opisana poniżej. Przez klienta rozumiemy maszynę, na której siedzisz, a przez serwer rozumiemy maszynę, na którą chcesz się zalogować bez podawania hasła. Kroki procedury uwierzytelniania to:

  1. Uruchom ssh-keygen, aby wygenerować klucze prywatne i publiczne, chyba że jest to już zrobione na twoim komputerze. Są one przechowywane w plikach w $HOME/.ssh.
  2. Dołącz zawartość pliku klucza publicznego do pliku $HOME/.ssh/authorized_keyslub $HOME/.ssh/authorized_keys2na serwerze.

Istnieją trzy różne typy protokołów uwierzytelniania. Określ typ podczas uruchamiania ssh-keygen:

  1. Protokół SSH wersja 1, RSA1: jest to domyślny wybór i skutkuje tożsamością plików (klucz prywatny, należy chmod 0700upewnić się, że ten plik nie jest czytelny dla innych) i tożsamością.pub (klucz publiczny).
  2. Protokół SSH wersja 1, RSA : jest uzyskiwany przez uruchomienie ssh-keygen -t rsai powoduje utworzenie plików id_rsa(klucz prywatny) i id_rsa.pub(klucz publiczny)
  3. Protokół SSH wersja 1, DSA : jest uzyskiwany przez uruchomienie ssh-keygen -t dsai powoduje utworzenie plików id_dsa(klucz prywatny) i id_dsa.pub(klucz publiczny)

Podczas uruchamiania ssh-keygen możesz polegać na domyślnych odpowiedziach (co oznacza, że ​​nie podajesz hasła). To sprawia, że ​​cała konfiguracja jest prosta, ale także niepewna.

Możesz określić typ kluczy, które będą używane przez opcję ssh ; ssh -1wymusza użycie kluczy RSA1 (wersja protokołu 1), natomiast ssh -2zmusza ssh do wypróbowania tylko kluczy RSA lub DSA (wersja protokołu 2). W poniższych przykładach generujemy i instalujemy klucze RSA1 i DSA na zdalnym hoście, abyś miał większą elastyczność. Możesz utworzyć plik konfiguracyjny w swoim .sshkatalogu za pomocą wiersza

Protocol 1,2

To powoduje, że ssh próbuje połączenia RSA1 (wersja protokołu 1) przed RSA / DSA (wersja protokołu 2).

Używanie kluczy RSA1

remote=user@remotehost   # fill in correct user and remotehost names
cd $HOME/.ssh
# create .ssh on remote host if it is non-existing:
ssh $remote 'if [ ! -d .ssh ]; then mkdir .ssh; fi' 
# copy RSA1 key: 
scp identity.pub ${remote}:.ssh
ssh $remote "cd .ssh; cat identity.pub >> authorized_keys"

Korzystanie z kluczy DSA

remote=user@remotehost   # fill in correct user and remotehost names
cd $HOME/.ssh
# create .ssh on remote host if it is non-existing:
ssh $remote 'if [ ! -d .ssh ]; then mkdir .ssh; fi' 
# copy DSA key: 
scp id_dsa.pub ${remote}:.ssh
ssh $remote "cd .ssh; cat id_dsa.pub >> authorized_keys2"

To wszystko, co musisz zrobić, jeśli nie użyłeś hasła podczas generowania kluczy. Możesz przetestować połączenie, uruchamiając ssh $ remote i sprawdzić, czy możesz się zalogować bez podania hasła (być może będziesz musiał użyć -1lub -2jako opcji ssh ). Procedurę można oczywiście powtórzyć dla dowolnej maszyny, na której chcesz się zalogować.

Jeśli użyłeś hasła, będziesz musiał uruchomić program, ssh-agentaby uruchomić specjalną powłokę, a następnie ssh-addzarejestrować kombinację klucz / hasłosshd . Więcej informacji można znaleźć na stronach podręcznika użytkownika tych programów.

Skrypt do automatyzacji połączeń wolnych od hasła: ssh-no-password.sh

#!/bin/sh

# create ssh connections without giving a password

if [ $# -lt 1 ]; then
  echo Usage: $0 username@remotehost
  exit
fi
remote="$1"  # 1st command-line argument is the user@remotehost address
this=$HOST   # name of client host

# first check if we need to run ssh-keygen for generating
# $HOME/.ssh with public and private keys:
if [ ! -d $HOME/.ssh ]; then
  echo "just type RETURN for each question:" # no passphrase - unsecure!!
  # generate RSA1, RSA and DSA keys:
  echo; echo; echo
  ssh-keygen
  echo; echo; echo
  ssh-keygen -t rsa
  echo; echo; echo
  ssh-keygen -t dsa
else
  # we have $HOME/.ssh, but check that we have all types of
  # keys (RSA1, RSA, DSA):
  if [ ! -f $HOME/.ssh/identity ]; then
     # generate RSA1 keys:
     echo "just type RETURN for each question:" # no passphrase - unsecure!!
     ssh-keygen
  fi
  if [ ! -f $HOME/.ssh/id_rsa ]; then
     # generate RSA keys:
     echo "just type RETURN for each question:" # no passphrase - unsecure!!
     ssh-keygen -t rsa
  fi
  if [ ! -f $HOME/.ssh/id_rsa ]; then
     # generate DSA keys:
     echo "just type RETURN for each question:" # no passphrase - unsecure!!
     ssh-keygen -t dsa
  fi
fi


cd $HOME/.ssh

if [ ! -f config ]; then
  # make ssh try ssh -1 (RSA1 keys) first and then ssh -2 (DSA keys)
  echo "Protocol 1,2" > config
fi

# copy public keys (all three types) to the destination host:

echo; echo; echo
# create .ssh on remote host if it's not there:
ssh $remote 'if [ ! -d .ssh ]; then mkdir .ssh; fi' 
# copy RSA1 key: 
scp identity.pub ${remote}:.ssh/${this}_rsa1.pub
# copy RSA key:
#scp id_rsa.pub ${remote}:.ssh/${this}_rsa.pub
# copy DSA key:
scp id_dsa.pub ${remote}:.ssh/${this}_dsa.pub
# make authorized_keys(2) files on remote host:

echo; echo; echo
# this one copies all three keys:
#ssh $remote "cd .ssh; touch authorized_keys authorized_keys2; cat ${this}_rsa1.pub >> authorized_keys; cat ${this}_rsa.pub >> authorized_keys2; cat ${this}_dsa.pub >> authorized_keys2;"
# this one copies RSA1 and DSA keys:
ssh $remote "cd .ssh; touch authorized_keys authorized_keys2; cat ${this}_rsa1.pub >> authorized_keys; cat ${this}_dsa.pub >> authorized_keys2;"

echo; echo; echo
echo "try an ssh $remote"

skopiowane z: http://folk.uio.no/hpl/scripting/doc/ssh-no-password.html

αғsнιη
źródło
1

Chciałbym dodać odpowiedź dla tych, którzy mogą znaleźć hasło, nawet jeśli przeczytali wszystkie odpowiedzi tutaj, ponieważ ustawiłeś IdentitiesOnly tylko na tak. Odpowiedź tutaj może zaoszczędzić dużo czasu na zarządzanie wieloma kluczami, które są kluczami do git lub serwera.

Po wygenerowaniu klucza i skopiowaniu go na serwer:

ssh-keygen  # change the file to /home/yourname/.ssh/something
ssh-copy-id -i ~/.ssh/something.pub [email protected]

Odkryłem, że to nie działa.

Potem poszedłem sprawdzić ~/.ssh/configplik na kliencie, zobaczyłem to na dole:

Host *
IdentitiesOnly yes

Następnie dodaję to powyżej:

Host somename
HostName 192.168.20.160
User lerner
IdentityFile ~/.ssh/something

Mogę się zalogować, wchodząc ssh somename.

Następnie możesz dodać wiele kluczy ssh, używając swoich ulubionych nazw, i wystarczy dodać ustawienia, takie jak powyższe cztery linie, do pliku konfiguracyjnego.

Host to nazwa, którą chcesz wprowadzić podczas późniejszego łączenia się z serwerem; nazwa_hosta to adres IP serwera; Użytkownik to nazwa użytkownika, którą logujesz na serwerze; a plik tożsamości to plik, w którym przechowujesz wygenerowany klucz.

Lerner Zhang
źródło