Aggiungi in modo sicuro un host (ad es. GitHub) al file SSH known_hosts


20

Come posso aggiungere una chiave host al known_hostsfile SSH in modo sicuro?

Sto configurando una macchina di sviluppo e desidero (ad esempio) impedire gitdi richiedere quando clonare un repository github.comdall'uso di SSH.

So che posso usare StrictHostKeyChecking=no(ad esempio questa risposta ), ma non è sicuro.

Finora ho trovato ...

  1. GitHub pubblica le loro impronte digitali chiave SSH su https://help.github.com/articles/github-s-ssh-key-fingerprints/

  2. Posso usare ssh-keyscanper ottenere la chiave host per github.com.

Come posso combinare questi fatti? Dato un elenco prepopolato di impronte digitali, come posso verificare che l'output di ssh-keyscanpossa essere aggiunto al known_hostsfile?


Immagino che sto chiedendo quanto segue:

Come posso ottenere l'impronta digitale per una chiave restituita ssh-keyscan?

Supponiamo che io sia già stato MITM-eded per SSH, ma che posso fidarmi della pagina HTTPS di GitHub (perché ha una catena di certificati valida).

Ciò significa che ho alcune (sospette) chiavi host SSH (da ssh-keyscan) e alcune impronte digitali (attendibili). Come posso verificare l'uno contro l'altro?


Correlati: come posso fare l'hashing della porzione host dell'output ssh-keyscan? O posso mescolare gli host con hash / senza hash known_hosts?


Perché non sarebbe sicuro per il tuo caso d'uso?
quadruplebucky

StrictHostKeyChecking=noè vulnerabile al MITM. È ssh-keyscansicuro contro il MITM?
Roger Lipscombe,

Non riesco a capire perché sono eccessivamente preoccupato per qualcuno che impersona uno sconosciuto che non ho mai incontrato, di cui mi fido abbastanza per scrivere il codice che sto per scaricare ed eseguire ...
quadruplebucky,

Perché questo è il mio codice sorgente in un repository privato su github e non voglio che un MITM (ad es.) Introduca modifiche dannose quando invio commit. Questo è solo un esempio.
Roger Lipscombe,

Io (nel bene o nel male) scelgo di fidarmi di Github. Non scelgo di fidarmi di ogni collegamento di rete casuale tra me e loro.
Roger Lipscombe,

Risposte:


11

La parte più importante dell'aggiunta "sicura" di una chiave al known_hostsfile è di ottenere l'impronta digitale della chiave dall'amministratore del server. L'impronta digitale chiave dovrebbe essere simile a questa:

2048 SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8 github.com (RSA)

Nel caso di GitHub, normalmente non possiamo parlare direttamente con un amministratore. Tuttavia, hanno messo la chiave sulle loro pagine Web in modo da poter recuperare le informazioni da lì.

Installazione manuale delle chiavi

1) Prendi una copia della chiave dal server e ottieni la sua impronta digitale. NB: farlo prima di controllare l'impronta digitale.

$ ssh-keyscan -t rsa github.com | tee github-key-temp | ssh-keygen -lf -
# github.com:22 SSH-2.0-babeld-f3847d63
2048 SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8 github.com (RSA)

2) Ottieni una copia dell'impronta digitale chiave dall'amministratore del server - in questo caso vai alla pagina con le informazioni su github.com

  1. Vai su github.com
  2. Vai alla pagina di aiuto (nel menu a destra se hai effettuato l'accesso; in fondo alla homepage altrimenti).
  3. Nella sezione Introduzione , vai a Connessione a GitHub con SSH
  4. Vai a Test della tua connessione SSH
  5. Copia l'impronta digitale SHA256 da quella pagina nel tuo editor di testo per un uso successivo.

3) Confronta i tasti delle due fonti

Posizionandoli direttamente uno sopra l'altro in un editor di testo, è facile vedere se qualcosa è cambiato

2048 SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8 github.com (RSA) #key recovered from github website
2048 SHA256:nThbg6kXUpJ3Gl7E1InsaspRomtxdcArLviKaEsTGY8 github.com (RSA) #key recovered with keyscan

(Si noti che la seconda chiave è stata manipolata, ma sembra abbastanza simile all'originale - se succede qualcosa del genere, si è sottoposti a gravi attacchi e si dovrebbe contattare un esperto di sicurezza di fiducia.)

Se le chiavi sono diverse, interrompere la procedura e contattare un esperto di sicurezza

4) Se le chiavi vengono confrontate correttamente, è necessario installare la chiave già scaricata

cat github-key-temp >> ~/.ssh/known_hosts

O da installare per tutti gli utenti su un sistema (come root):

cat github-key-temp >> /etc/ssh/ssh_known_hosts

Installazione chiavi automatizzata

Se è necessario aggiungere una chiave durante un processo di compilazione, è necessario seguire i passaggi 1-3 del processo manuale sopra.

Fatto ciò, esamina i contenuti del tuo github-key-tempfile e crea uno script per aggiungere tali contenuti al tuo file hosts noto.

if ! grep github.com ~/.ssh/known_hosts > /dev/null
then
     echo "github.com ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ==" >> ~/.ssh/known_hosts
fi

Ora dovresti sbarazzarti di tutti i sshcomandi che hanno StrictHostKeyCheckingdisabilitato.


17

È possibile combinare voci con hash / non cancellate nel file known_hosts.

Quindi se vuoi aggiungere la chiave github, puoi semplicemente fare:

ssh-keyscan github.com >> ~/.ssh/known_hosts

Se lo vuoi hash, aggiungi -H

ssh-keyscan -H github.com >> ~/.ssh/known_hosts


1
Qual'è la differenza tra hashed / unhashed? So cos'è l'hashing, non solo perché viene applicato in questo contesto.
Glen Thomas,

3
L'hashing delle voci consente di nascondere informazioni sugli host a cui siete abituati a connettervi. Controlla la risposta accettata su security.stackexchange.com/questions/56268/…
Wee,

4
Questo non risponde alla domanda. L'uso di ssh-keyscan è soggetto a un uomo nel mezzo dell'attacco, il che significa che la chiave che memorizzi potrebbe essere una chiave appartenente all'attaccante che tenta di entrare nel tuo sistema. Si prega di vedere la mia risposta per un modo per controllare le cose.
Michael,

Att. Ottenere attenzione per le risposte che sono sempre state errate - "le due risposte principali sono in realtà insicure"
Peter Mortensen,

6

Il modo più semplice è recuperare manualmente le chiavi usando ssh-keyscan, verificarle manualmente:

$ ssh-keyscan -t rsa github.com | ssh-keygen -lf -
# github.com:22 SSH-2.0-libssh-0.7.0
2048 SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8 github.com (RSA)

E aggiungili al tuo script, che porterà quindi la chiave pubblica "autorevole".


Ho le chiavi come hai detto tu, come posso "aggiungerle alla mia sceneggiatura"?
Glen Thomas,

O come file separato o come stringa nel tuo script.
Jakuje,

Questa risposta è pericolosa perché nascosta nel "verifica manualmente" è un processo del tutto difficile. Ho aggiunto una risposta sotto la quale tenta di spiegare come farlo e utilizzare i risultati in modo sicuro.
Michael,

Att. Ottenere attenzione per le risposte che sono sempre state errate - "le due risposte principali sono in realtà insicure"
Peter Mortensen,

1
@RogerLipscombe Sono d'accordo che la risposta potrebbe essere interpretata in modo sicuro - "verificarli manualmente" non è spiegato, ma se capisci che significa "seguire le istruzioni nella pagina del manuale ssh", probabilmente andrebbe bene. Il rischio qui è che qualcuno potrebbe non capirlo e, ad esempio, provare cose insicure come controllare la chiave dopo aver effettuato l'accesso al server. Ecco perché ho chiamato questa risposta "pericolosa" e l'altra "insicura" - il dettaglio di come controlli manualmente è la parte importante. Grazie per aver accettato.
Michael,
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.