Supprimer la clé de known_hosts


129

J'ai construit plusieurs machines virtuelles au cours des dernières semaines. Le problème est que cela .ssh/known_hostsme donne l' avertissement de l' homme au milieu . Cela se produit car une autre empreinte digitale est associée à l'adresse IP de la machine virtuelle.

Dans le .ssh/known_hostsfichier, cependant, je ne trouve pas l’enregistrement lié à l’IP, seulement deux chaînes bizarres ressemblant à des clés et "ssh-rsa".

Quelqu'un a-t-il des idées sur la façon de retirer l'ancienne clé known_hosts?


7
Les "chaînes bizarres ressemblant à des clés" auxquelles vous faites référence sont les adresses IP / hôtes hachées. Ceci est une fonctionnalité de sécurité qui empêche un intrus de savoir à quels systèmes vous avez accès. Si vous voyez cela, votre ssh_config est HashKnownHosts yesdéfini.
Deebster

1
Si vous estimez que le contenu du fichier est trop déroutant, le retour à la ligne est probablement activé. Le désactiver. Toutes les lignes commencent par un nom d'hôte ou une adresse IP.
Daniel B

Réponses:


90
sed -i '6d' ~/.ssh/known_hosts

Modifie le fichier ~ / .ssh / known_hosts: 6, en supprimant la 6ème ligne.

À mon avis, l’utilisation ssh-keygen -Rest une meilleure solution pour un utilisateur averti openssh, alors que votre administrateur Linux habituel ferait mieux de conserver ses compétences sed à jour en utilisant la méthode ci-dessus.


18
Je ne pense pas que ce soit un bon conseil pour éditer un fichier de configuration manuellement si vous avez une application officielle pour cela. Prendre des risques ne fait pas de vous un professionnel, mais trouver l’option la plus rapide et la plus sûre. C'est comme dire aux gens d'aller de l'avant et d'éditer /etc/sudoerssans visudo. Si vous voulez affiner vos sedcompétences, allez-y sans gâcher votre système.
kraxor

2
"si vous avez une application officielle pour cela" => les deux ssh-keygen -Ret sed -i {line}dêtes assez "officiel", et les deux fonctionneront dans un avenir prévisible. Util ssh-keygen permet la suppression par numéro de ligne, les deux sont parfaitement acceptables (car les numéros de ligne sont souvent plus faciles à traiter et moins sujets aux erreurs que les noms d'hôte de centres de données modernes).
michael

2
A) La suppression de spécifiquement la 6ème ligne, est très "regarde pas les mains". Aucune explication sur l’importance de la 6ème ligne du fichier?! B) En outre autres man ssh-keygenmentions que ssh-keygen -R hostname vous venez de dire ssh-keygen -Rsans nom d' hôte spécifié, et vous ne l' avez pas expliqué ce que vous entendez par là.
Barlop

124

La solution la plus simple est:

rm -f .ssh/known_hosts

ssh va recréer le fichier à nouveau, mais vous perdez la vérification des clés pour d'autres hôtes!

Ou, vous pouvez utiliser:

ssh-keygen -R "hostname"

Ou bien le message "Man-in-the-middle" de ssh doit indiquer quelle ligne du fichier known_hosts contient l'empreinte digitale incriminée. Editez le fichier, passez à cette ligne et supprimez-le.


55
ssh-keygen -R hostnameva travailler aussi.
Grawity

6
Si nous supprimons ce fichier, d'autres clés seront également supprimées.
shgnInc

16
Supprimer le fichier est un mauvais conseil, c'est comme dire à quelqu'un d'acheter un nouveau PC car l'ancien a une souris cassée. Éditer manuellement un fichier pouvant être édité par une application officielle est également une mauvaise idée. L' ssh-keygenoption a été ajoutée à cause d'un commentaire, mais sans explication. Je ne pense pas que cette réponse mérite autant de votes positifs.
kraxor

12
-1 à cause de la totalité des premières lignes "supprimer l'intégralité du fichier known_hosts" C’est une chose terrible, terrible, terrible à proposer et qui devrait être supprimée.
Olivier Dulac

4
Cette solution est excessive. Il suffit de retirer la ligne incriminée. C'est ça.
Blake Frederick,

81

Il existe un commutateur ssh-keygen ( -R) pour cela.

man ssh-keygen lit:

-R nom d'hôte

Supprime toutes les clés appartenant à hostnameun known_hostsfichier. Cette option est utile pour supprimer les hôtes hachés (voir l’ -Hoption ci-dessus).


8
C'est la méthode la plus simple et la plus sûre.
Poulet

Remarque: cela modifiera les autorisations du fichier known_hosts en 0600. Si vous avez un fichier known_hosts partagé pour une raison quelconque, cela pourrait en désactiver le partage.
Jiri Klouda

et le bon. En outre, je devais faire [localhost]:port, en utilisant les crochets parce que j'ai utilisé un port personnalisé je suppose = /. Comme d'autres l'ont déjà dit, j'utiliserais également l'approche de vérification sans clé SSH pour le développement de mon système transitoire / test.
Pysis

Cela supprime toutes les occurrences de la meilleure façon. Vous pouvez ajouter une nouvelle clé avec:ssh-keyscan -H my.ssh.server.example.com >> ~/.ssh/known_hosts;
Nux

18

L'avertissement vous indiquera la ligne exacte dans le fichier hosts connu.

Voici un exemple:

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@       WARNING: POSSIBLE DNS SPOOFING DETECTED!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
The RSA host key for foo-bar.net has changed,
and the key for the corresponding IP address 127.0.0.1
is unchanged. This could either mean that
DNS SPOOFING is happening or the IP address for the host
and its host key have changed at the same time.
Offending key for IP in /home/user/.ssh/known_hosts:6
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!

Voir la /home/user/.ssh/known_hosts:6partie? Il spécifie le fichier et le numéro de ligne.


10

Vous devez exécuter la commande suivante pour vous débarrasser de ce problème. Ouvrez le terminal et tapez la commande suivante:

Pour tous les exemples ci-dessous, remplacez simplement la valeur après -R

ssh-keygen -R server-name
ssh-keygen -R server.ip.addre.ss
ssh-keygen -R 202.54.1.5
ssh-keygen -R server1.example.com

Cette méthode a déjà été suggérée dans les réponses précédentes. Pourriez-vous développer ce qui est différent dans votre réponse?
Burgi

@ Burgi - cette réponse donne plus de détails sur la syntaxe de ssh-keygen -Rtoutes les autres réponses jusqu'à présent. Cela montre par exemple exactement ce que vous pouvez écrire après -R. Donc, cette réponse en vaut la peine, même si ce n’est pas une réponse totalement nouvelle.
Yitz

@ Yitz Mon commentaire a été fait dans le cadre de l'examen. À l'époque (il y a 18 mois), je pensais que la question avait besoin d'un petit coup de pouce pour la rendre encore meilleure.
Burgi

8

Vous pouvez également demander à ssh de ne pas vérifier le fichier known_hosts à l'aide des indicateurs UserKnownHostsFile et StrictHostKeyChecking.

Par exemple:

ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no user@example.com

Pour la facilité d'utilisation, vous pouvez alias ceci:

alias boldssh='ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no'

Vous pouvez maintenant mettre en gras chaque fois que vous êtes sûr de faire confiance au certificat du serveur.


8
Quelle idée horrible. Désactiver de manière permanente une couche de sécurité simplement parce que vous êtes trop paresseux pour rester ~/.ssh/known_hostsà jour? Pourquoi ne pas simplement aller de l'avant et utiliser telnet? "chaque fois que vous en êtes sûr" - si vous en êtes sûr, alors vous n'avez aucune idée de ce qu'est une attaque de MITM et vous devriez probablement passer un peu de temps à lire de la bonne littérature.
kraxor

2
Sur la base de la question du PO, je pense que cette réponse est valable. Parfois, vous avez un système de test sur lequel vous créez / détruisez de nombreuses machines virtuelles. (Je le fais maintenant alors que je prépare l'examen RHCE.) Il pourrait ne pas y avoir d'incidence sur la sécurité. Tout en notant que les implications en matière de sécurité sont importantes, je ne pense pas que cela doive être qualifié d '"idée horrible".
Rick Chatham


3

Toutes les réponses sont bonnes, mais pour les vrais professionnels SSH, il nous manque des informations sur la manière de supprimer la signature SSH avec le numéro de port.

  • Commande de suppression de signature d'hôte SSH simple:

    ssh-keygen -R example.com
    
  • Suppression de la clé ssh complexe, par exemple vous vous connectez à ssh sur le port non standard 222:

    ssh example.com -p 222
    

et vous obtenez un avertissement, et pour le supprimer, vous devez utiliser le numéro de port du côlon entre crochets:

    ssh-keygen -R [example.com]:222

J'espère que cela aidera les utilisateurs de configuration non standard.


Exactement ce que je cherchais. Je vous remercie!
aexl

1

Voici une méthode utilisant l'éditeur Ex:

ex +6d -scwq ~/.ssh/known_hosts

où 6 est votre numéro de ligne mentionné dans le message d'avertissement. Comme celui-ci:

Clé fautive pour IP dans /home/user/.ssh/known_hosts:6 <== LINE NUMBER


En général, il est conseillé d'utiliserex pour éditer les fichiers non-interactive , au lieu de sed, qui est plus un S tream ED Itor et son -iparamètre qui est une extension FreeBSD non standard.


0

L'entrée pour le nom d'hôte ou l'adresse IP doit figurer dans la première colonne. L’avertissement doit également indiquer un numéro de ligne sur lequel se trouve la clé incriminée.


0

Vous pouvez également supprimer une seule ligne des hôtes connus, par exemple avec rmknownhost 111 (111 est la ligne à supprimer):

#! /usr/bin/env ruby
line = ARGV[0] || raise("gimme line to remove")
hosts = File.expand_path("~/.ssh/known_hosts")
content = File.readlines(hosts)
removed = content.delete_at line.to_i - 1
puts "Removed:\n#{removed}"
File.open(hosts, 'w'){|f| f.write content * ""}

Enregistrez ceci rmknownhostdans un dossier de votre PATH.


Quel est l'avantage de le faire dans n'importe quel éditeur de texte? Y a-t-il une raison de ne pas le faire de cette façon, comme par exemple la façon dont les sudoers doivent être édités avec visudo?
Andy Lester

Quelles distributions viennent avec cela? Ubuntu ne semble pas l'avoir.
papillotement

L'avantage est que c'est automatisé et rapide / c'est un binaire séparé que vous ajoutez vous
gros le

2
Vous auriez pu simplement poster votre script ici au lieu de lier votre propre entrée de blog que vous avez créée le jour où vous avez posté cette réponse. Ceci est qualifié de spam IMHO. Sans oublier que vous pouvez créer un simple alias pour obtenir le même résultat, inutile de recourir à un script ruby ​​de 7 lignes.
kraxor

1
ou ajoutez simplement ceci à votre ~ / .bashrc: sshdel() { sed -i "${@}d" ~/.ssh/known_hosts; }et appelez-le avec sshdel [line number]. pas de rubis, pas de binaire, pas de soucis.
rubynorails le

0

C'est un fichier texte. Vous pouvez facilement éditer avec vi (m) et simplement supprimer la ligne en question (jj) et sauvegarder le fichier (wq). Mais s'il existe une commande spécifique pour supprimer un hôte, c'est probablement la méthode la plus sûre.


Je ne vois pas en quoi le fait de modifier le fichier directement dans VIM est "dangereux". Cela dépend de votre niveau de confort avec VIM. Surtout avec ce fichier, le plus gros risque est de supprimer trop de clés, auquel cas vous serez invité à nouveau.
Rick Chatham

La "sécurité" à laquelle je faisais référence implique 1) d'oublier / de ne pas savoir supprimer les informations dépendantes dans d'autres fichiers (le cas échéant) et 2) de supprimer accidentellement plus ou moins que nécessaire, cassant ainsi le fichier.
Ryan Griggs
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.