Come vengono "inviate" le chiavi pubbliche ai server e come vengono "usate" le chiavi private per SSH?


11

Esistono due macchine Linux, A e B. Gli script in esecuzione su A devono essere in grado di SSH in B. Quindi A genera una chiave pubblica (probabilmente una ssh-keygengenerazione id_rsa.pub) e quindi utilizza la rispettiva chiave privata (di nuovo, probabilmente id_rsa) per creare quella connessione SSH.

Se qualcosa che ho detto sopra è errato o fuorviato, per favore inizia correggendomi!

Supponendo che io sia più o meno sul bersaglio:

  • In che modo A "dà" a B la sua chiave pubblica ( id_rsa.pub)? Deve essere un processo manuale o può essere automatizzato? Se manuale, qual è il processo? Se automatizzato, qual è il comando? Quando B "ottiene" questa chiave pubblica, dove va o viene memorizzata?
  • Quando si avvia la connessione SSH a B, in che modo A "usa" la sua chiave privata ( id_rsa) come parte di tale connessione?

3
Perché il downvote non spiega? Mostra la ricerca, è un SSCCE e, per quanto ne sappia , non è un duplicato. Se non sei d'accordo e pensi che si tratti di un duplicato, ti preghiamo di fornire un link alla domanda di cui ritieni sia un duplicato!
user3178622

Anche se non ho votato in negativo e non penso che questa domanda sia in alcun modo negativa, forse lo stack di sicurezza delle informazioni sarebbe un posto più adatto.
MC10

3
Nemmeno io ho votato in giù, ma capisco perché qualcuno l'abbia fatto. Questo è un metodo di accesso ampiamente utilizzato, mentre sono d'accordo sul fatto che i risultati di ricerca di Google sono ingombra di come farlo funzionare, e non di come funziona gli articoli .. È possibile trovare le informazioni che stai cercando.
Tyson,

5
La nozione di SSCCE non è realmente applicabile a domande che non riguardano il codice.
Scott,

2
Non un duplicato ma correlato: superuser.com/questions/383732/how-does-ssh-encryption-work . Potrebbe rispondere alla seconda parte della domanda (come vengono utilizzate le chiavi private)
Jay

Risposte:


5

ssh-keygengenera sia le chiavi pubbliche che private, che inizialmente risiedono solo localmente. Fornire la chiave pubblica a un altro host è qualcosa che l'utente dovrebbe fare manualmente, inviandola a qualcuno responsabile del server B o se si dispone di un account con una password, è possibile accedere e inserirla da soli. Per consentire l'accesso senza password al server B, è necessario aggiungere la chiave pubblica al file ~ / .ssh / authorized_keys sul server B (una chiave pubblica per riga, in questo file possono essere presenti un numero qualsiasi di chiavi). Esiste un comando linux ssh-copy-idche copia l'ID per te e lo inserisce nel file.

Per impostazione predefinita, ssh utilizzerà il file ~ / .ssh / id_XXX come chiave privata. XXX può essere rsa, dsa o qualsiasi protocollo per il quale è stata generata una chiave. IIRC, dsa è vecchio e non dovrebbe essere usato. Se si desidera utilizzare una chiave privata diversa, è possibile specificarla nel comando ssh utilizzando -i. Finché la chiave privata utilizzata corrisponde a una chiave pubblica sul computer remoto (nel file authorized_keys per l'account dell'utente a cui si sta effettuando l'accesso), non sarà necessario fornire una password.


Grazie @BamaPookie - alcuni followup: (1) quando ssh-keygenviene eseguito, dici che i due tasti "risiedono solo localmente"? Dove?!? Come in, in quale cartella posso navigare e vedere id_rsa.pube id_rsa? (2) Ho pensato che ssh-addfosse il comando per aggiungere una chiave pubblica a authorized_keys, no? Qual è la differenza tra ssh-copy-ide ssh-add? Grazie ancora!
user3178622

2
@ user3178622 re '1' Non ce l'ho davanti a me ma sembra ~/.ssh/id_rsa re '2', ssh-add non è per l'aggiunta a authorized_keys, è per l'aggiunta a un portachiavi .. Non ho usato ssh -add però. ssh-add ha a che fare con il fatto di non dover inserire una frase chiave ogni volta che si utilizza una chiave che richiede una frase chiave. Quindi se le tue chiavi ssh non richiedono una frase chiave, suppongo che non ci sia alcun motivo per usare ssh-add e penso che avresti ancora bisogno di usare ssh-copy-id o di fare il manuale copiando la chiave pubblica in authorized_keys
barlop

2
ssh-keygen ti chiederà dove salvare il file, ma il percorso predefinito è ~ / .ssh / ssh-copy-id copia la chiave pubblica su un host remoto. ssh-add aggiunge una chiave privata al tuo portachiavi locale. L'aggiunta di una chiave privata al tuo portachiavi locale significa che verrà controllata per impostazione predefinita quando si tenta una connessione ssh (cioè, senza dover specificarla con -i).
BamaPookie,

1
@BamaPookie Dove scrivi "L'aggiunta di una chiave privata al tuo portachiavi locale significa che verrà controllata per impostazione predefinita quando si tenta una connessione ssh (vale a dire, senza dover specificarla con -i)." <--- Vale la pena chiarire che Penso che intendi che cambia la chiave privata predefinita che viene scelta, in modo che invece di essere id_rsa, provenga dal portachiavi. (Naturalmente, senza ssh-add non è ancora necessario specificare una chiave privata con -i, avrà comunque un valore predefinito, solo un valore predefinito diverso).
barlop,

3

Esistono due macchine Linux, A e B. Gli script in esecuzione su A devono essere in grado di SSH in B. Quindi A genera una chiave pubblica (probabilmente un id_rsa.pub generato da ssh-keygen) e quindi utilizza la rispettiva chiave privata ( di nuovo, probabilmente id_rsa) per effettuare quella connessione SSH.

Se qualcosa che ho detto sopra è errato o fuorviato, per favore inizia correggendomi!

Supponendo che io sia più o meno sul bersaglio:

si

ma B ha bisogno che la chiave pubblica di A sia elencata nel file authorized_keys di B affinché A sia in grado di connettersi a B

inoltre puoi eliminare id_rsa.pub e ssh su B e funzionerà ancora, perché la chiave pubblica viene generata fresca con ogni connessione ssh e non memorizzata in nessun id_rsa.pub

In che modo A "dà" a B la sua chiave pubblica (id_rsa.pub)? Deve essere un processo manuale o può essere automatizzato? Se manuale, qual è il processo? Se automatizzato, qual è il comando?

manuale - qualcosa del genere

da un-

cat ~/.ssh/id_rsa.pub | ssh USER@HOST "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

o anche più manualmente, per interrompere il comando

A $ cat id_rsa.pub | ssh user@host 'cat>~/a.a'

quindi su B, assicurati che esista ~ / .ssh, quindi fallo cat a.a >> ~/.ssh/authorized_keys

ed è possibile eseguire il cat gatti autorizzati_keys prima e dopo per assicurarsi che la chiave sia elencata.

Oppure puoi inviare un'e-mail a id_rsa.pub a un account e-mail, quindi da B, B può controllare l'e-mail e aggiungere il contenuto di id_rsa.pub nel suo file authorized_keys

automaticamente

Il comando ssh-copy-id

Devi essere in grado di accedere, quindi hai bisogno dell'accesso con password

Invece di fare ssh user @ host fai ssh-copy-id user @ host e ti viene richiesta una password, la inserisci, sei dentro, copierà la chiave pubblica. E la prossima volta che farai ssh user @ host userà la chiave.

Quando B "ottiene" questa chiave pubblica, dove va o viene memorizzata?

B's ~ / .ssh / authorized_keys

Quando si avvia la connessione SSH a B, in che modo A "usa" la sua chiave privata (id_rsa) come parte di tale connessione?

beh, non ne so molto, al di sopra della mia testa, ma tutto ciò che è crittografato con una chiave può essere decrittografato con l'altra chiave e identificarsi è un po 'diverso dall'invio di dati .. e potrebbe esserci qualcosa anche su una chiave temporanea.


Grazie @barlop! Si prega di vedere le mie domande sotto la risposta di BamaPookie; Ho le stesse domande per te!
user3178622
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.