Domanda ssh: accetta automaticamente le chiavi


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 interrotto 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 ssh accettare automaticamente qualsiasi nuova chiave?


171
2018-04-18 09:11


origine


La risposta di Lekensteyn è eccellente e corretta, ma volevo solo sottolineare che siccome ssh si aspetta "sì" e yes uscite "y", potresti aver avuto più fortuna con for h in $SERVER_LIST; do yes yes | ssh $h "uptime"; done (notare il sì in più, che dice sì a cosa dire invece di "y"). - chazomaticus


risposte:


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 cambiate, riceverai un avvertimento, 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 le chiavi host che cambiano spesso) con -oUserKnownHostsFile=/dev/null opzione. Questo elimina tutte le chiavi host ricevute in modo che non genererà mai l'avviso.


Con la 18.04, c'è una nuova possibilità: StrictHostKeyChecking=accept-new. A partire dal 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.

185
2018-04-18 09:29



Questa non è la soluzione migliore in quanto ignora gli strumenti di sicurezza incorporati. ssh-keyscan è preferibile, se è disponibile sul tuo sistema. - Stefan Lasiewski
@StefanLasiewski Permette attacchi man in the middle se si è su reti non fidate. Per accettare nuove chiavi su host fissi, il ssh-keyscan l'approccio è più sano Per le macchine virtuali locali e altri host in reti affidabili con indirizzi IP dinamici / riutilizzati, l'approccio descritto è abbastanza buono. - Lekensteyn
Giusto per chiarire la differenza tra le due soluzioni: The ssh-keyscan la soluzione è soggetta a un attacco man-in-the-middle solo una volta ssh-keyscan è in corso. Il -oStrictHostKeyChecking=no la soluzione è soggetta a un attacco man-in-the-middle ogni volta sshè in corso. - Erik Sjölund


Puoi usare il seguente comando per aggiungere l'impronta digitale per un server ai tuoi known_hosts

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

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

L'unico problema con questo è che ti ritroverai con alcuni server nei tuoi known_hosts due volte. Non è davvero un grosso problema, solo menzionando. Per garantire 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 eseguire:

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 di verificare l'impronta digitale. Quindi non vorresti assolutamente eseguire questo script prima di ogni esecuzione del tuo script di utilità.


96
2017-10-17 00:24



gestirlo attraverso ordinamento | uniq e quindi cercare l'host duplicato utilizzando awk dopo renderebbe lo script in grado di rilevare gli host modificati e avvisare gli utenti solo su quelli, poiché lo stesso host con chiavi diverse potrebbe significare problemi - Lennart Rolland
Potresti voler aggiungere una nota -H hash hostname e indirizzi. - David Cullen


Sono un po 'in ritardo con questa risposta, ma il modo sensato sarebbe di fare un ssh-keyscan sulla nuova macchina prima di eseguire la raccolta di uptime.

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

Disabilitare il controllo di integrità per motivi di praticità suona come un cattivo piano, anche se pensi di avere il pieno controllo dell'ambiente.


23
2017-11-24 19:47



Questo è in realtà quello che stavo cercando. Grazie. - user156516
eseguire il comando precedente e non controllare effettivamente le chiavi host rispetto alle impronte digitali acquisite fuori banda è vulnerabile esattamente nello stesso modo di StrictHostKeyChecking no - code_monk
@code_monk: no, non lo è. Apro un una tantum opportunità di errore (accettare una chiave da un host sbagliato da aggiungere agli host conosciuti). StrictHostKeyChecking no consentirà di ripetere accetta per altre macchine. - tink


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

Aggiungi server IP in file server-list

Gli IP dovrebbero essere aggiunti sotto il formato.

Uscita di cat servers-list

123.1.2.3
124.1.2.4
123.1.2.5

Cambia sopra gli IP sostituendo il tuo.

Sotto il comando si aggiungeranno tutti i server dall'elenco.

ssh-keyscan -p61 -H "`cat servers-list`" >> ~/.ssh/known_hosts

0
2018-02-16 07:46