Le fichier ~/.ssh/known_hosts contient la liste de chaque serveur auquel vous vous êtes connectés ainsi que leur clé publique correspondante. Le but de ce fichier est de vous avertir d’une attaque man-in-the-middle lorsque la clé publique du serveur est différente de celle présente dans ce fichier, au moment d’établir la connexion SSH.

Par défaut, la plupart des clients SSH stockent les noms d’hôte de manière non chiffrée. De ce fait, si une personne, ou un virus, réussit à s’introduire sur votre machine, il lui est alors très facile de lister tous les serveurs auxquels vous vous êtes connectés, et pour peu que vous ayez une clé privée sans passphrase ou un agent en cours d’exécution, c’est cadeau, l’intrus peut aller se promener sur vos autres machines. Voir l’article en anglais Protecting SSH from known_hosts Address Harvesting.

Convertir son fichier en utilisant le système de hash intégré à SSH

SSH propose une fonctionnalité qui permet de hasher les noms d’hôte de sorte qu’il ne soit pas possible de les retrouver. Pour activer cela, c’est très simple, on ajoute au début de notre fichier ~/.ssh/config, les lignes suivantes.

Host *
HashKnownHosts yes

Ce paramètre ne s’applique qu’aux nouveaux serveurs auxquels vous allez vous connecter. Pour convertir les entrées déjà existantes, il faut exécuter la commande suivante.

ssh-keygen -H -f ~/.ssh/known_hosts
# on supprime le backup sinon c'est comme si on n'avait rien fait...
rm ~/.ssh/known_hosts.old

Supprimer une entrée

Cela peut-être nécessaire si le serveur sur lequel on souhaite se connecter a changé de clé. Un message nous indique qu’il n’est pas possible de se connecter car il peut s’agir d’une attaque man-in-the-middle. Si on est certain que c’est bien le bon serveur et que ce changement de clé est légitime (voir l’article afficher le fingerprint d’un serveur SSH), alors il est nécessaire de supprimer l’ancienne clé du fichier ~/.ssh/known_hosts. Comme celui-ci est hashé, on ne peut pas l’éditer directement avec son éditeur préféré, il faut donc utiliser une commande pour réaliser cette opération.

ssh-keygen -R <nom d'hôte ou adresse IP>

Rechercher une entrée

Je n’utilise pas cette fonctionnalité, mais il est possible de connaitre l’entrée présente pour un hôte en particulier.

ssh-keygen -F <nom d'hôte ou adresse IP>

Il est aussi possible de voir le fingerprint d’une entrée.

ssh-keygen -l -F <nom d'hôte ou adresse IP>

Inconvénients

L’activation du hash empêche les outils de complétion de fonctionner.

Si on désactive les entrées en clair dans le fichier ~/.ssh/known_hosts, pour rester cohérent, il faudrait alors configurer son bash (ou autre shell) pour ne pas historiser les commandes ssh et scp mais également ne pas configurer d’hôtes dans son fichier .ssh/config, ce que je ne fais pas, personnellement.

Certains utilisateurs préfèrent avoir un fichier known_hosts non chiffré pour pouvoir le maintenir plus facilement, avec un éditeur et ne pas conserver des hôtes qui n’ont plus rien à y faire. C’est une question de choix. Quel que soit le vôtre, utilisez toujours des clés protégées par une passphrase, gardez votre système à jour, utilisez un parefeu et un antivirus, et surtout, faites des backups.