65 votes

Comment gérer mon fichier .ssh/known_hosts ?

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

Je veux nettoyer mon .ssh/known_hosts mais comment savoir quelle clé appartient à quel hôte ? En d'autres termes, comment puis-je savoir quelles clés je peux supprimer en toute sécurité et quelles clés je dois laisser intactes ?

0 votes

Ce que j'ai trouvé utile, c'est de trier le fichier en fonction de l'empreinte digitale : cat ~/.ssh/known_hosts | sort -k3 . C'est parce que ssh, dans de nombreux cas (et je ne vois pas très bien dans quelles situations exactement), crée plusieurs entrées pour le même hôte, et certaines peuvent avoir un nom d'hôte en clair alors que d'autres n'en ont pas. Une fois trié, il sera évident de savoir à quel hôte correspond une entrée obscure, à condition qu'il y ait aussi une entrée claire pour elle.

85voto

asheeshr Points 145

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

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

Pour supprimer une seule entrée de known_hosts :

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

2 votes

Il est bon de rappeler que le format peut également être [ip address]:port pour l'argument

30voto

theotherreceive Points 8185

Avec difficulté...

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

Si vous voulez vraiment nettoyer le fichier, l'option la plus simple est probablement de le supprimer et de vérifier les clés des serveurs que vous connaissez au fur et à mesure qu'ils se présentent, mais en réalité, je laisserais simplement les known_hosts tranquilles.

Vous pouvez empêcher les nouvelles entrées d'hôtes d'être hachées en commentant l'option dans /etc/ssh/ssh_config

#HashKnownHosts yes

0 votes

Le nettoyage de ~/.ssh/known_hosts est également utile lorsque la configuration de l'hôte distant change et que ssh affiche un avertissement. Cependant, il faut être prudent et n'ignorer l'avertissement que pour les hôtes de confiance.

8 votes

Une meilleure option serait d'expliquer comment générer le hash pour un nom d'hôte spécifique, en lui permettant de rechercher ce hash dans known_hosts afin de le mettre à jour.

1 votes

Après la modification ci-dessus, il suffit d'ajouter une nouvelle entrée, par exemple en se connectant au nouveau serveur avec ssh root@something-new-or-new-dns-alias . Cette opération permet d'actualiser l'image originale de la known_hosts et décrypter les noms d'hôtes/IP.

28voto

freiheit Points 14144

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 écrasera votre fichier .ssh/known_hosts avec un fichier nouvellement généré basé sur l'analyse des hôtes.

Et faites également ce que l'autrereceive suggère ; HashKnownHosts est plus une gêne qu'une aide ici.

0 votes

ssh-keyscan a des règles de formatage très strictes list_of_hosts fichier. Il ne doit contenir que les adresses et aucun espace blanc autre que LF après chaque adresse. Cela inclut LF après la dernière adresse. Sinon, vous obtiendrez beaucoup de déchets dans le fichier généré.

3voto

user1953828 Points 31

J'avais plus de 300 vieilles entrées périmées dans mon fichier known_hosts. Je ne suis pas sûr que 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 de caractères correspondantes ou l'emplacement.

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

3 votes

Cela ne fonctionne pas avec un known_hosts et puisque l'auteur de la question demande "comment savoir quelle clé appartient à quel hôte", je pense qu'il est très probable que son fichier soit haché. Il dit qu'il est sur Ubuntu, et comme theotherreceive dit, Ubuntu utilise des hachages par défaut.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X