it-swarm-eu.dev

Comment gérer mon fichier .ssh / known_hosts

J'exécute un bureau Ubuntu avec un tas de serveurs virtuels dans Virtual Box pour tester des trucs, etc. Dans le passé, je me suis également connecté à d'autres types de boîtes Linux VPS distantes. Actuellement, mon .ssh/known_hosts le fichier contient tout un tas de clés, dont la plupart ne sont plus utilisées.

Je veux nettoyer mon .ssh/known_hosts fichier, mais comment savoir quelle clé appartient à quel hôte? C'est à dire. comment savoir quelles clés je peux retirer en toute sécurité et lesquelles je dois laisser seules?

49
Luke

Pour savoir quelle entrée correspond à un nom d'hôte connu dans les hôtes connus:

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

Pour supprimer une seule entrée de known_hosts:

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

Si vous avez une liste de tous vos hôtes, vous pouvez faire quelque chose comme

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

Cela remplacera votre fichier .ssh/known_hosts par un fichier nouvellement généré basé sur l'analyse des hôtes.

Et faites aussi ce que l'autre vous suggère; HashKnownHosts est plus ennuyeux que d'aider ici.

27
freiheit

Avec difficulté...

Ubuntu par défaut hache les noms d'hôte du fichier known_hosts (ce n'est pas le comportement openssh par défaut), pour qu'il soit difficile pour quiconque lisant le fichier de savoir à quels systèmes vous accédez.

Si vous vouliez vraiment nettoyer le fichier, l'option la plus simple est probablement de simplement le supprimer et de vérifier les clés des serveurs que vous connaissez au fur et à mesure qu'elles surviennent, mais vraiment je laisserais connus_hosts seuls.

Vous pouvez empêcher le hachage de nouvelles entrées d'hôtes en mettant en commentaire l'option dans/etc/ssh/ssh_config

#HashKnownHosts yes
21
theotherreceive

J'avais plus de 300 anciennes entrées périmées dans mon fichier known_hosts. Je ne sais pas si cela fonctionnera pour tous les systèmes (ou même la plupart des systèmes), mais voici mon script Q&D. Vous devrez peut-être ajuster les chaînes ou l'emplacement correspondants.

#!/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