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.