sviluppo-web-qa.it

Come gestire il mio file .ssh / known_hosts

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_hosts Il file contiene un sacco di chiavi, la maggior parte delle quali non vengono più utilizzate.

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

49
Luke

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>
67
mikehapner

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.

27
freiheit

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
21
theotherreceive

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  [email protected]${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
2
user1953828