Come posso configurare l'accesso SSH senza password?


252

Voglio essere in grado di accedere a un telecomando tramite ssh senza dover inserire la password in ogni momento.

  • Come lo installo?
  • È necessario un comando diverso per eseguire una sessione senza password?

Stai usando openssh? (se è così è facile;))
Rinzwind

@Rinzwind, Perché dovrei preoccuparmi di ottenere la versione proprietaria quando OpenSSH è già preinstallato?
Oxwivi,

15
Cerco di non fare assunzioni;)
Rinzwind

1
@ Kevin, per favore chiariti. Stiamo parlando di ssh-ing senza password, che è generalmente una buona pratica . Intendi ssh-ing in una shell di root? Non è coperto da questa domanda.
Oxwivi,

@Oxwivi: Siamo spiacenti, questo avrebbe dovuto essere un commento sulla risposta di Ravindra, che ha come obiettivo l'accesso root.
Kevin,

Risposte:


266

Risposta

Eseguire questi comandi:

ssh-keygen

Quindi dovrai copiare la nuova chiave sul tuo server :

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

Dopo che la chiave è stata copiata, ssh nella macchina normalmente:

ssh user@host

Ora puoi accedere senza inserire una password dal particolare computer sul quale hai eseguito i comandi.

Esempio

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.

Spiegazione

Ciò presuppone che sia già possibile connettersi correttamente al server tramite SSH.

Dovrai generare un SSH Keypair che ti permetterà di identificarti come te stesso senza usare una password. Se lo desideri, puoi scegliere di proteggere le chiavi con un passcode, ma questo può essere lasciato in bianco consentendo l'accesso SSH totalmente senza password.

  1. Per prima cosa crea il tuo SSH Keypair eseguendo ssh-keygenquesto creerà un id_rsae id_rsa.pubfile. Il pubfile è ciò che va sui server, la chiave privata ( id_rsa) è ciò che resta con te ed è come ti identifichi.
  2. Quindi copia la chiave pubblica sul tuo server ssh-copy-id user@serversostituendo l'utente con il tuo utente remoto e il server con il nome DNS o l'indirizzo IP della macchina. Ti verrà richiesta la tua password SSH, inseriscila e se tutto viene completato correttamente sarai in grado di accedere alla macchina ssh user@serversenza bisogno di una password.

Riferimenti


11
@Oxwivi questa risposta è il modo più corretto per farlo - ma sembra più lungo. Tutto quello che devi fare è digitare ssh-keygenseguire le istruzioni sullo schermo, quindi digitare la ssh-copy-id user@serversostituzione dell'utente con l'utente remoto e il server con la macchina remota
Marco Ceppi

3
Ho riscontrato questo errore "L'agente ha ammesso di non aver firmato utilizzando la chiave." ogni volta che si tenta di accedere dopo aver seguito questa procedura. La soluzione era eseguire "> ssh-add" sul computer locale e ora posso accedere al computer remoto come previsto.
jmbouffard,

1
Vale la pena di ricordare che se è necessario utilizzare la porta personalizzata per @server, è necessario farlo con: ssh-copy-id "not-marco@127.0.0.1 -p 1234".
s3m3n

@Rinzwind: significa che non posso mai autenticarmi da un client / una macchina sconosciuti sul mio server se disabilito l'autenticazione passwd e consento solo l'autenticazione con chiave. Esiste un modo per consentire l'accesso da una macchina sconosciuta utilizzando la chiave privata che è stata generata per il client noto / configurato per comunicare con il server? Voglio dire, questa chiave privata è portatile e potrebbe essere utilizzata per autenticarmi sul server da altre macchine, in caso di necessità di emergenza ??
Rajat Gupta,

4
Ma il server sta ancora chiedendo la password ,,,
Lerner Zhang,

34

Digita i seguenti comandi:

  1. ssh-keygen

    Premere il Entertasto fino a quando non viene visualizzato il messaggio

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

    (Chiederà una volta la password del sistema host)

  3. ssh root@ip_address

Ora dovresti essere in grado di accedere senza alcuna password.


25

Il modo in cui lo faccio di solito è il seguente:

ssh-keygen -t rsa

(Quando viene richiesta una password, lasciarla vuota)

Poi: cat ~/.ssh/id_rsa.pub | ssh username@hostname 'cat >> .ssh/authorized_keys'

(Ciò richiede che la cartella .ssh sia nella directory home sul nome host di destinazione, con il file authorized_keys al suo interno)

Naturalmente, sostituisci il nome utente con il nome utente desiderato e il nome host con il nome host o l'indirizzo IP desiderati

Dopodiché, basta SSH per quella scatola proprio come sei abituato.


Che dire del comando touche chmodnella risposta di Rinzwind?
Oxwivi,

7
Dovrai modificare il .ssh/authorized_keysfile su 0600 o questo non funzionerà
Marco Ceppi

Questo mi ha davvero aiutato perché non sono riuscito a far funzionare ssh-copy-id per root sul mio server. deve essere root nella situazione in cui backuppc (o qualsiasi altro demone) deve ssh su un'altra macchina.
Adam,

18

Normalmente lo uso sshpassper quello, lo installo con sudo apt-get install sshpasse lo uso in questo modo

sshpass -p 'password' ssh your_username@your_server

6
Perché non usare i tasti ssh?
enzotib,

1
Non è una situazione "perché no", funziona ancora perfettamente senza aggiungere chiavi, è solo un altro metodo che direi.
Bruno Pereira,

Grazie per le informazioni su sshpass, mai sentito prima.
Pantera

7
Le chiavi SSH sono la risposta "corretta" alla domanda, ma sshpassè un trucco molto utile nei casi in cui non è possibile modificare il metodo di autenticazione sul server remoto!
Jacob Krall

9
Questo è molto pericoloso, ti manterrai in bash_history o qualunque sia la semplice password per gli host a cui ti stai collegando.
Kappa,

10

Disabilita autenticazione password

Poiché molte persone con server SSH usano password deboli, molti aggressori online cercheranno un server SSH, quindi inizieranno a indovinare le password a caso. Un utente malintenzionato può provare migliaia di password in un'ora e indovinare anche la password più sicura, con il tempo sufficiente. La soluzione consigliata è utilizzare le chiavi SSH anziché le password. Per essere difficile da indovinare come una normale chiave SSH, una password dovrebbe contenere 634 lettere e numeri casuali. Se sarai sempre in grado di accedere al tuo computer con una chiave SSH, dovresti disabilitare completamente l'autenticazione della password.

Se si disabilita l'autenticazione con password, sarà possibile connettersi solo da computer specificamente approvati. Ciò migliora enormemente la tua sicurezza, ma ti rende impossibile connetterti al tuo computer dal PC di un amico senza pre-approvare il PC o dal tuo laptop quando elimini accidentalmente la tua chiave.

Si consiglia di disabilitare l'autenticazione della password a meno che non si abbia un motivo specifico per non farlo.

Per disabilitare l'autenticazione con password, cerca la seguente riga nel tuo file sshd_config:

#PasswordAuthentication yes

sostituirlo con una linea simile a questa:

PasswordAuthentication no

Dopo aver salvato il file e riavviato il server SSH, non dovresti nemmeno chiedere una password quando accedi.

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


2
Questa è la risposta corretta più elementare ma buona per la sicurezza! Anche disabilitare il login di root è un altro valido
FreeSoftwareServers il

Colpisce PasswordAuthentication notutti gli utenti? In caso contrario, come posso disattivarlo per gli utenti normali ma lasciarlo invariato per il root mentre lo collaudo? Non voglio davvero farselo e rinchiudermi completamente.
Adam,

Tieni aperta una sessione ssh in modo da poterla cambiare di nuovo. Si desidera disabilitare password e root. Sì, puoi farsela. No;)
Thufir,

Durante ssh, ho un errore Permission denied (publickey).con PasswordAuthentication no. Cosa devo fare? Cambio PasswordAuthentication nosu un altro host?
Parigi,

9

Questa soluzione è appositamente per gli utenti che utilizzano di Windows per ssh nelle loro macchine a distanza, incluse le immagini nube su AWS cloud e GCE cloud

Clausola di esclusione della responsabilità

Recentemente ha utilizzato questa soluzione per accedere in remoto nuove immagini vm distribuite su GCE.


Strumenti utilizzati:

  1. puttygen download di puttygen
  2. winscp download di winscp

I passaggi per eseguire:

  1. Genera coppia di chiavi pubblica / privata usando puttygen.
  2. Carica la chiave pubblica sul tuo server in cloud o in posizione remota.

Come farlo:

1. Generare una chiave / coppia o utilizzare la chiave privata esistente

Se possiedi una chiave privata:

Apri puttygen, premi il pulsante di caricamento e seleziona il *.pemfile della chiave privata ( ).


Se non si possiede una chiave privata:

  • Aperto puttygen,
  • Selezionare il tipo di chiave desiderato SSH2 DSA (è possibile utilizzare RSA o DSA) nella sezione Parametri . È importante lasciare vuoto il campo passphrase.
  • Premere generatee seguire le istruzioni per generare una coppia di chiavi (pubblica / privata).

Foto di esempio di generazione chiave

(dalla fonte 1, link indicato di seguito)

2. Crea un nuovo file "authorized_keys" (con notepad)

Copia i dati della tua chiave pubblica dalla sezione "Chiave pubblica per incollarli nel file OpenSSH authorized_keys" del generatore di chiavi PuTTY e incolla i dati della chiave nel authorized_keysfile.


Assicurati che ci sia solo una riga di testo in questo file.


3. Carica chiave sul server Linux

  • Apri WinSCP,
  • Seleziona il protocollo file SFTP e accedi con le tue credenziali ssh.
  • In caso di successo, vedi la struttura della directory home sul tuo computer remoto.

Carica il file authorized_keys nella directory home sul computer remoto.


4. Impostare le autorizzazioni appropriate

Crea .sshdirectory (se non esistente)


Copia il authorized_keysfile nella .sshdirectory.
(questo sostituirà qualsiasi authorized_keysfile esistente , prendine nota).

Se il file esiste, aggiungi semplicemente il contenuto di questo file al file esistente.


Esegui i comandi per impostare le autorizzazioni:

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

Ora sarai in grado di accedere alla sshmacchina remota senza inserire le credenziali ogni volta.

Ulteriori letture:


4

Se si crea una coppia di chiavi pubblica / prata e si accede utilizzando la nostra chiave pubblica appena creata, non sarà necessario digitare la password. A seconda della configurazione del portachiavi e / o dell'agente ssh potrebbe essere necessario proteggere la chiave con una passphrase.

Ecco uno dei tanti brevi tutorial per te. È di fondamentale importanza per la sicurezza di questo metodo, che la chiave privata generata rimanga privata! Non dovresti mai condividerlo con nessuno o consentirne l'accesso a qualsiasi titolo.

Questo comando genera una chiave ragionevolmente forte in ~/.ssh/:

ssh-keygen -b 4096

In ~/.ssh/troverai la tua chiave pubblica come id_rsa.pub. Il contenuto deve essere aggiunto al authorized_keysfile del server trasportando tramite un supporto trasportabile (pen drive) o abilitando a breve l'autenticazione della password sul server, quindi utilizzandolo ssh-copy-id ~/.ssh/id_rsa.pub username@servere quindi disabilitandolo nuovamente.

Se hai scelto di proteggere la tua chiave con una passphrase (nel primo passaggio), puoi utilizzare ssh-agento il portachiavi Ubuntu per proteggere quel pharse localmente in modo da non doverlo digitare sempre.


3

Per fare alcune aggiunte:

  • Il Mac per impostazione predefinita non ha ssh-copy-id, dovrai installarlo tu stesso:

    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
    

Scopri di più qui: https://github.com/beautifulcode/ssh-copy-id-for-OSX

  • se hai effettuato un port forwarding, il comando dovrebbe essere così:

    ssh-copy-id "not-marco@127.0.0.1 -p 2222"
    

si noti che le virgolette sono necessarie.


3

Accesso / copia remoti senza fornire una password

Le applicazioni sshe scpper l'accesso remoto e la copia remota, rispettivamente, consentono di comunicare con un host remoto senza fornire una password. Ciò richiede che tu segua una procedura di autenticazione come quella descritta di seguito. Per client intendiamo la macchina su cui ci si trova e per server intendiamo la macchina a cui si desidera accedere senza fornire una password. I passaggi della procedura di autenticazione sono:

  1. Esegui ssh-keygen per generare chiavi private e pubbliche, a meno che ciò non sia già stato fatto sul tuo computer. Questi sono memorizzati in file in $HOME/.ssh.
  2. Aggiungi il contenuto del file della chiave pubblica al file $HOME/.ssh/authorized_keyso $HOME/.ssh/authorized_keys2sul server.

Esistono tre diversi tipi di protocolli di autenticazione. Si specifica il tipo quando si esegue ssh-keygen:

  1. Protocollo SSH versione 1, RSA1: questa è la scelta predefinita e comporta l'identità dei file (chiave privata, dovrebbe chmod 0700garantire che questo file non sia leggibile per gli altri) e identity.pub (chiave pubblica).
  2. Protocollo SSH versione 1, RSA : si ottiene eseguendo ssh-keygen -t rsae genera file id_rsa(chiave privata) e id_rsa.pub(chiave pubblica)
  3. Protocollo SSH versione 1, DSA : questo si ottiene eseguendo ssh-keygen -t dsae genera file id_dsa(chiave privata) e id_dsa.pub(chiave pubblica)

Quando esegui ssh-keygen puoi fare affidamento sulle risposte predefinite (sottintendendo che non dai una passphrase). Questo rende l'intero set-up semplice, ma anche insicuro.

È possibile specificare il tipo di chiavi da utilizzare con un'opzione per ssh ; ssh -1forza l'uso delle chiavi RSA1 (protocollo versione 1), mentre ssh -2forza ssh a provare solo le chiavi RSA o DSA (protocollo versione 2). Negli esempi seguenti, generiamo e installiamo le chiavi RSA1 e DSA sull'host remoto in modo da avere maggiore flessibilità. Puoi creare un file di configurazione nella tua .sshdirectory con la linea

Protocol 1,2

Questo fa ssh provare una connessione RSA1 (protocollo versione 1) prima di RSA / DSA (protocollo versione 2).

Utilizzo delle chiavi 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"

Utilizzo delle chiavi 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"

Questo è tutto ciò che devi fare se non hai usato una passphrase durante la generazione delle chiavi. È possibile verificare la connessione eseguendo ssh $ remote e vedere se è possibile accedere senza fornire una password (potrebbe essere necessario utilizzare -1o -2come opzioni per ssh ). La procedura può, ovviamente, essere ripetuta per qualsiasi macchina su cui si desidera accedere.

Se hai usato una passphrase, dovrai avviare il programma ssh-agentper avviare una shell speciale, seguita da ssh-addper registrare la tua combinazione chiave / passphrasesshd . Vedi le pagine man di questi programmi per maggiori informazioni.

Uno script per automatizzare le connessioni senza password: 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"

copiato da: http://folk.uio.no/hpl/scripting/doc/ssh-no-password.html


1

Vorrei aggiungere una risposta per coloro che potrebbero trovare che devono inserire la password anche se hanno letto tutte le risposte qui perché hai impostato IdentitàSolo come sì. E la risposta qui può farti risparmiare molto tempo per gestire più chiavi, essendo chiavi per git o server.

Dopo aver generato la chiave e copiata sul server:

ssh-keygen  # change the file to /home/yourname/.ssh/something
ssh-copy-id -i ~/.ssh/something.pub lerner@192.168.20.160

Ho scoperto che non ha funzionato.

Poi sono andato a controllare il ~/.ssh/configfile sul client, ho visto questo in fondo:

Host *
IdentitiesOnly yes

Quindi aggiungo questo sopra:

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

Posso semplicemente accedere inserendo ssh somename.

Quindi puoi aggiungere più chiavi SSH usando i tuoi nomi preferiti e devi solo aggiungere le impostazioni come le quattro righe sopra al file di configurazione.

Host è il nome che desideri inserire quando ti connetti al server in un secondo momento; HostName è l'ip del server; Utente è il nome utente che accedi al server; e il file di identità è il file in cui è memorizzata la chiave generata.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.