Come gestire il mio file .ssh / known_hosts


47

Gestisco un desktop Ubuntu con un sacco di server virtuali in Virtual Box per testare cose, ecc. In passato mi sono anche connesso ad altri tipi di box VPS Linux remoti. Attualmente il mio .ssh/known_hostsfile contiene un sacco di chiavi, la maggior parte delle quali non vengono più utilizzate.

Voglio ripulire il mio .ssh/known_hostsfile, ma come faccio a sapere quale chiave appartiene a quale host? Vale a dire come faccio a sapere quali chiavi posso rimuovere in modo sicuro e quali dovrei lasciare da solo?

Risposte:


64

Per scoprire quale voce è per un nome host noto in known_hosts:

 # ssh-keygen -H  -F <hostname or IP address>

Per eliminare una singola voce da known_hosts:

 # ssh-keygen -R <hostname or IP address>

27

Se hai un elenco di tutti i tuoi host, puoi fare qualcosa del genere

ssh-keyscan -t rsa,dsa -f list_of_hosts > ~/.ssh/known_hosts

Ciò sovrascriverà il tuo file .ssh / known_hosts con uno appena generato in base alla scansione degli host.

E fai anche ciò che suggerisce l'altro; HashKnownHosts è più fastidio che aiuto qui.


ssh-keyscanha regole di formattazione molto rigide del list_of_hostsfile. Deve essere solo l'indirizzo e nessun altro spazio, quindi LF dopo ogni indirizzo. Ciò include LF dopo l'ultimo indirizzo. Altrimenti ricevi un sacco di spazzatura nel file generato.
Nux,

21

Con difficoltà...

Ubuntu di default esegue l'hashing dei nomi host del file known_hosts (questo non è il comportamento openssh predefinito), per rendere difficile a chiunque legga il file sapere a quali sistemi si accede.

Se volessi davvero ripulire il file, l'opzione più semplice è probabilmente semplicemente cancellarlo e controllare le chiavi per i server che conosci quando si presentano, ma in realtà lascerei solo gli host_stati.

È possibile interrompere l'hash delle voci di nuovi host commentando l'opzione in / etc / ssh / ssh_config

#HashKnownHosts yes

La pulizia ~ / .ssh / known_hosts aiuta anche quando la configurazione dell'host remoto cambia e ssh mostra un avviso. Tuttavia, bisogna stare attenti a questo e ignorare l'avvertimento solo per host fidati.
Alex,

6
Un'opzione migliore potrebbe essere quella di spiegare come generare l'hash per un nome host specifico, consentendogli di cercare tale hash in known_hosts in modo da poterlo aggiornare.
Cerin,

1
Dopo la modifica sopra, basta aggiungere una nuova voce, ad es. Connettendosi al nuovo server con ssh root@something-new-or-new-dns-alias. Ciò aggiornerà il known_hostsfile originale e decifrerà i nomi host / IP.
Nux,

2

Nel mio file known_hosts avevo più di 300 voci obsolete. Non sono sicuro che funzionerà per tutti i sistemi (o anche per la maggior parte dei sistemi) ma ecco il mio script di domande e risposte. Potrebbe essere necessario regolare le stringhe o la posizione corrispondenti.

#!/bin/sh
list=`cat ~/.ssh/known_hosts | awk '{print $1}' |sed -e 's/,/ /g' | sort -u `

listsorted=$(printf "%s\n" ${list[@]} | sort -u)
echo $listsorted
#listsorted="10.2.10.1"
echo > /tmp/sshstat.txt
for host in $listsorted ;
do
echo $host 
ssh -oBatchMode=yes -oConnectTimeout=2  root@${host} "exit" >/tmp/sshstat.txt 2>&1 
ret=$?
if [ $ret -ne 0 ]; then
     echo "Failed: $host"
     echo sed -i.bak \"/$host/d\" "~/.ssh/known_hosts" | sh
else
    grep "Offending RSA" /tmp/sshstat.txt |  sed -e 's/:/ /g' | awk '{printf "sed -i.bak -e \"%dd\" %s  \n", $6, "~/.ssh/known_hosts" }' | sh
   fi
done
#echo $list

Questo non funziona su un known_hostsfile con hash e poiché l'interrogante chiede "come faccio a sapere quale chiave appartiene a quale host" penso sia molto probabile che il suo file sia sottoposto a hash. Dice che è su Ubuntu e, come theotherreceivedetto, gli hash di Ubuntu di default.
Neil Mayhew,
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.