ssh: accetta automaticamente le chiavi


218

Ho scritto questo piccolo script di utilità:

for h in $SERVER_LIST; do ssh $h "uptime"; done

Quando viene aggiunto un nuovo server $SERVER_LIST, lo script viene arrestato con:

The authenticity of host 'blah.blah.blah (10.10.10.10)' can't be established.
RSA key fingerprint is a4:d9:a4:d9:a4:d9a4:d9:a4:d9a4:d9a4:d9a4:d9a4:d9a4:d9.
Are you sure you want to continue connecting (yes/no)?

Ho provato yes:

for h in $SERVER_LIST; do yes | ssh $h "uptime"; done

senza fortuna.

C'è un modo per parametrizzare sshper accettare automaticamente una nuova chiave?


6
La risposta di Lekensteyn è eccellente e corretta, ma volevo solo notare che poiché ssh si aspetta "sì" e yesproduce "y", potresti avere avuto più fortuna con for h in $SERVER_LIST; do yes yes | ssh $h "uptime"; done(nota il sì aggiuntivo, che dice sì cosa dire invece di "y ").
Chazomaticus,

Risposte:


240

Utilizzare l'opzione StrictHostKeyChecking, ad esempio:

ssh -oStrictHostKeyChecking=no $h uptime

Questa opzione può anche essere aggiunta a ~ / .ssh / config, ad esempio:

Host somehost
    Hostname 10.0.0.1
    StrictHostKeyChecking no

Nota che quando le chiavi dell'host sono state modificate, riceverai un avviso, anche con questa opzione:

$ ssh -oStrictHostKeyChecking=no somehost uptime
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
31:6f:2a:d5:76:c3:1e:74:f7:73:2f:96:16:12:e0:d8.
Please contact your system administrator.
Add correct host key in /home/peter/.ssh/known_hosts to get rid of this message.
Offending RSA key in /home/peter/.ssh/known_hosts:24
  remove with: ssh-keygen -f "/home/peter/.ssh/known_hosts" -R 10.0.0.1
Password authentication is disabled to avoid man-in-the-middle attacks.
Keyboard-interactive authentication is disabled to avoid man-in-the-middle attacks.
ash: uptime: not found

Se i tuoi host non vengono spesso reinstallati, potresti renderlo meno sicuro (ma più conveniente per cambiare spesso le chiavi dell'host) con l' -oUserKnownHostsFile=/dev/nullopzione. Questo elimina tutte le chiavi host ricevute, quindi non genererà mai l'avviso.


Con 18.04, c'è una nuova possibilità: StrictHostKeyChecking=accept-new. Da man 5 ssh_config:

If this flag is set to accept-new then ssh will automatically
add new host keys to the user known hosts files, but will not
permit connections to hosts with changed host keys.  If this flag
is set to no or off”, ssh will automatically add new host keys
to the user known hosts files and allow connections to hosts with
changed hostkeys to proceed, subject to some restrictions.

10
Questa non è la soluzione migliore in quanto ignora gli strumenti di sicurezza integrati. ssh-keyscanè preferibile, se è disponibile sul tuo sistema.
Stefan Lasiewski,

2
@StefanLasiewski Permette all'uomo nel mezzo di attacchi se ci si trova su reti non attendibili. Per accettare nuove chiavi su host fissi, l' ssh-keyscanapproccio è più sano. Per le macchine virtuali locali e altri host in reti fidate con indirizzi IP dinamici / riutilizzati, l'approccio descritto è abbastanza buono.
Lekensteyn,

8
Giusto per chiarire la differenza tra le due soluzioni: la ssh-keyscansoluzione è soggetta a un attacco man-in-the-middle solo una volta ssh-keyscan. La -oStrictHostKeyChecking=nosoluzione è soggetta a un attacco man-in-the-middle ogni volta che sshviene eseguita.
Erik Sjölund,

121

È possibile utilizzare il comando seguente per aggiungere l'impronta digitale per un server a known_hosts

ssh-keyscan -H <ip-address> >> ~/.ssh/known_hosts
ssh-keyscan -H <hostname> >> ~/.ssh/known_hosts

NOTA: Sostituire <indirizzo IP> e <nome host> con l'IP e il nome DNS del server che si desidera aggiungere.

L'unico problema con questo è che finirai con alcuni server nei tuoi known_hosts due volte. Non è davvero un grosso problema, solo per citare. Per assicurarsi che non vi siano duplicati, è possibile rimuovere prima tutti i server eseguendo prima quanto segue:

ssh-keygen -R <ip-address>
ssh-keygen -R <hostname>

Quindi potresti correre:

for h in $SERVER_LIST; do
    ip=$(dig +search +short $h)
    ssh-keygen -R $h
    ssh-keygen -R $ip
    ssh-keyscan -H $ip >> ~/.ssh/known_hosts
    ssh-keyscan -H $h >> ~/.ssh/known_hosts
done

Una cosa da tenere a mente quando si rimuove solo per aggiungere nuovamente, si sta essenzialmente rimuovendo la sicurezza della verifica dell'impronta digitale. Quindi non vorrai assolutamente eseguire questo script prima di ogni esecuzione del tuo script di utilità.


1
eseguendolo attraverso l'ordinamento | uniq e quindi la ricerca di un host duplicato usando awk after renderebbe lo script in grado di rilevare host cambiati e avvertire gli utenti solo di quelli, dal momento che lo stesso host con chiavi diverse potrebbe significare guai
Lennart Rolland,

2
Potresti voler aggiungere una nota che -Hincluda nomi host e indirizzi.
David Cullen,

25

Sono un po 'in ritardo con questa risposta, ma il modo sensato sarebbe quello di eseguire un ssh-keyscan sulla nuova macchina prima di eseguire la raccolta dei tempi di attività.

ssh-keyscan  <newhost> >> ~/.ssh/known_hosts

Disabilitare il controllo della sanità mentale per convenienza suona come un cattivo piano, anche se pensi di avere il pieno controllo dell'ambiente.


eseguire il comando precedente e non controllare effettivamente le chiavi host rispetto alle impronte digitali acquisite fuori banda è vulnerabile esattamente comeStrictHostKeyChecking no
code_monk

3
@code_monk: no, non lo è. Ho aperto un'occasione unica per il fallimento (accettando una chiave da un host sbagliato da aggiungere agli host conosciuti). StrictHostKeyChecking no consentirà ripetute accettazioni per altre macchine.
tink

0

Per aggiungere automaticamente un elenco di server possiamo fare di seguito:

Aggiungi IP server nell'elenco dei file server

Gli IP devono essere aggiunti nel seguente formato.

Uscita di cat servers-list

123.1.2.3
124.1.2.4
123.1.2.5

Cambia sopra gli IP sostituendo i tuoi.

Il comando seguente aggiungerà tutti i server dall'elenco.

ssh-keyscan -p61 -H "`cat servers-list`" >> ~/.ssh/known_hosts
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.