La chiave ssh deve essere chiamata id_rsa?


130

Ho riscontrato questo problema un paio di volte durante la creazione di server di build con autenticazione con chiave.

Mi chiedevo se qualcun altro ha sperimentato questo. Ho un paio di chiavi per il mio attuale utente che possono connettersi a macchine diverse. Diciamo machine1 e machine2. Ho incollato la mia chiave pubblica nel loro rispettivo file authorized_keys. Il primo che ho chiamato la prima chiave id_rsa e la seconda chiave bender.

Quando provo a connettermi a bender ottengo il seguente output con la mia connessione ssh dettagliata

debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug1: SSH2_MSG_NEWKEYS received
debug1: SSH2_MSG_SERVICE_REQUEST sent
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug1: Authentications that can continue: publickey
debug1: Next authentication method: publickey
debug1: Trying private key: /home/bozo/.ssh/.ssh/identity
debug1: Trying private key: /home/bozo/.ssh/.ssh/id_rsa
debug1: Trying private key: /home/bozo/.ssh/id_dsa
debug1: No more authentication methods to try.
Permission denied (publickey).

Offre solo la chiave id_rsa, come puoi vedere sopra. È corretto? Se sì, perché? Come ottengo per offrire più chiavi? So che è un problema che vedo a intermittenza, perché a casa ho più chiavi senza troppi problemi.

Gradirei anche una panoramica su come il pub e le chiavi private interagiscono con il client e il server. Pensavo di avere un'idea abbastanza decente, ma a quanto pare mi manca qualcosa.

Per favore e grazie.

Risposte:


157

Per impostazione predefinita, ssh cerca id_dsae id_rsafile. Le chiavi non devono essere nominate in questo modo, puoi anche nominarle mykeyo anche posizionarle in una directory diversa. Tuttavia, se si esegue una di queste, è necessario fare riferimento esplicito alla chiave nel comando ssh in questo modo:

ssh user@server -i /path/to/mykey

Se un comando non accetta -i, ad esempio sshfs, utilizzare l' IdentityFileopzione:

sshfs -o IdentityFile=/path/to/mykey user@host:/path/on/remote /mountpoint

Come funziona

Quando generi una chiave, otterrai due file: id_rsa(chiave privata) e id_rsa.pub(chiave pubblica). Come suggeriscono i loro nomi, la chiave privata deve essere mantenuta segreta e la chiave pubblica può essere pubblicata al pubblico.

L'autenticazione con chiave pubblica funziona con una chiave pubblica e una privata. Sia il client che il server hanno le proprie chiavi. Quando si installa openssh-serveril server, le chiavi pubbliche e private vengono generate automaticamente. Per il cliente, dovrai farlo da solo.

Quando l'utente (client) si connette a un server, vengono scambiate le chiavi pubbliche. Riceverai i server uno e il server tuo. La prima volta che ricevi la chiave pubblica del server, ti verrà chiesto di accettarla. Se questa chiave pubblica cambia nel tempo, verrai avvisato perché è in corso un possibile attacco MITM (Man in the middle) che intercetta il traffico tra il client e il server.

Il server verifica se è consentito connettersi (definito in /etc/ssh/sshd_config) e se la chiave pubblica è elencata nel ~/.ssh/authorized_keysfile. Possibili motivi per cui viene negata la chiave pubblica:

  • /etc/ssh/sshd_config:
    • AllowUserso AllowGroupsè specificato, ma l'utente del server non è elencato nell'elenco dei gruppi o degli utenti (impostazione predefinita non definita, non ponendo alcuna limitazione agli utenti o ai gruppi dall'accesso).
    • DenyUserso DenyGroupsè specificato e ci si trova nell'elenco utenti o gruppi.
    • Stai tentando di accedere come root, ma PermitRootLoginè impostato su No(impostazione predefinita yes).
    • PubkeyAuthenticationè impostato su No(impostazione predefinita yes).
    • AuthorizedKeysFileè impostato su una posizione diversa e le chiavi pubbliche non vengono aggiunte a quel file (impostazione predefinita .ssh/authorized_keys, relativa alla home directory )
  • ~/.ssh/authorized_keys: la tua chiave pubblica non viene aggiunta in questo file (tieni presente che questo file viene letto come utente root)

Utilizzando più chiavi

Non è raro usare più chiavi. Invece di correre ssh user@host -i /path/to/identity_file, è possibile utilizzare un file di configurazione, ~/.ssh/config.

Le impostazioni comuni sono IdentityFile (le chiavi) e la porta. La configurazione successiva controllerà "id_dsa" e "bender" solo quando ci si connette con ssh youruser@yourhost:

Host yourhost
   IdentityFile ~/.ssh/id_dsa
   IdentityFile ~/.ssh/bender

Se si omette Host yourhost, le impostazioni verranno applicate a tutte le connessioni SSH. Altre opzioni possono anche essere specificati per questa partita ospite, come User youruser, Port 2222, ecc Questo permetterebbe di collegare con l'abbreviazione ssh yourhostal posto di ssh -p2222 youruser@yourhost -i ~/.ssh/id_dsa -i ~/.ssh/bender.


1
perché devo specificare la chiave? il punto è che posso così ssh alla macchina più facile.
myusuf3

2
@StevenRoose da ssh_config(5): il nome del file può utilizzare la sintassi tilde per fare riferimento alla home directory di un utente o uno dei seguenti caratteri di escape: '% d' (home directory dell'utente locale), '% u' (nome utente locale), '% l '(nome host locale),'% h '(nome host remoto) o'% r '(nome utente remoto). Non è possibile specificare i caratteri jolly, ma questo dovrebbe essere abbastanza conveniente immagino. Tieni presente che un server deve esaminare ogni chiave che hai inviato, quindi è meglio specificare meno chiavi. I caratteri jolly sull'host funzionano, vedere di nuovo la pagina di manuale di ssh_config(5).
Lekensteyn,

2
@therobyouknow Non è necessario creare una coppia di chiavi univoca per ogni macchina. Di solito hai poche chiavi e aggiungi la chiave pubblica di una delle chiavi al .ssh/authorized_keysfile sui computer remoti. Se usi il .ssh/id_rsanome file standard (o id_dsa, id_ecdsa o il recente id_ed25519), allora ssh proverà questo automaticamente e non dovrai specificarlo IdentityFilenella tua configurazione (o il -i path/to/id_fileparametro per ssh).
Lekensteyn,

4
Adoro le risposte che vanno oltre i dettagli richiesti e richiedono tempo per spiegare il concetto. Lavoro meraviglioso! +1
user2490003,

1
@landed È l'host del server SSH (potrebbe essere un indirizzo IP o un nome DNS). Ho cercato di chiarire quella sezione, speriamo che aiuti.
Lekensteyn,

40

Il mio metodo preferito consente di selezionare automaticamente la chiave privata

IdentityFile ~/.ssh/%l_%r@%h_id_rsa

SSH sostituirà% l con il nome del computer locale,% r con il nome utente remoto e% h con l'host remoto, quindi se volevo connettermi dal mio computer chiamato foo to bar come utente, eseguo:

ssh bar

E ssh userebbe automaticamente:

~/.ssh/foo_user@bar_id_rsa

Poiché l'host locale è anche memorizzato, questo consente di home directory condivise su NFS (chiave diversa per macchina!) O persino di identificare su quale macchina la chiave doveva trovarsi ...


1

In considerazione del commento di StevenRoose sul fatto che ci vuole più tempo per specificare molti tasti, e mi capita di giocare con molti tasti, vorrei suggerire la mia soluzione personale.

Creo un collegamento simbolico alla chiave che voglio usare in quel momento, e dato che cambia solo raramente a seconda del progetto su cui sto lavorando, ne sono contento.

Qui ho collegato alle mie chiavi per le macchine che funzionano sotto virtualbox:

$ cd .ssh/
$ ln -s adam_vbox-id_rsa.pub id_rsa.pub
$ ln -s adam_vbox-id_rsa id_rsa

$ ls -l
total 12
-rw------- 1 adam adam 1675 2013-10-04 02:04 adam_vbox-id_rsa
-rw-r--r-- 1 adam adam  396 2013-10-04 02:04 adam_vbox-id_rsa.pub
lrwxrwxrwx 1 adam adam   16 2013-10-04 02:17 id_rsa -> adam_vbox-id_rsa
lrwxrwxrwx 1 adam adam   20 2013-10-04 02:17 id_rsa.pub -> adam_vbox-id_rsa.pub
-rw-r--r-- 1 adam adam 3094 2013-10-04 02:09 known_hosts

Si potrebbe anche aggiungere uno script molto veloce per passare a un altro set senza dover digitare nuovamente il comando ln .

Ancora una volta, questa non è una soluzione solo per due chiavi, ma per un numero maggiore, potrebbe essere praticabile.


1
Aggiungo solo un alias di bash_profile per ogni server con cui lavoro. Quindi per un server chiamato bob ho solo questo ... alias bob = "ssh bob.example.com -l pete -i / path / to / key" - quindi scrivo semplicemente bob - e ci sto!
Peter Bagnall,

2
Mentre a volte è più facile "fare le cose come già sai", ci sono approcci più semplici se si impostano chiavi e host .ssh / configs. Questo commento è diretto sia al poster che al commentatore @ Peter-Bagnall
Scott Prive
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.