Entfernen Sie den Schlüssel von known_hosts


129

Ich habe in den letzten Wochen mehrere virtuelle Maschinen gebaut. Das Problem ist, das .ssh/known_hostsmich der Mann in der Mitte warnt. Dies liegt daran, dass der IP-Adresse der virtuellen Maschine ein anderer Fingerabdruck zugeordnet ist.

In der .ssh/known_hostsDatei finde ich jedoch keinen Datensatz in Bezug auf die IP, sondern nur zwei bizarre, schlüsselähnliche Zeichenfolgen und "ssh-rsa".

Hat jemand eine Idee, wie man den alten Schlüssel entfernt known_hosts?


7
Die "bizarren, schlüsselartigen Zeichenfolgen", auf die Sie sich beziehen, sind die gehashten Hosts / IP-Adressen. Diese Sicherheitsfunktion verhindert, dass ein Eindringling weiß, auf welche Systeme Sie zugreifen können. Wenn Sie dies sehen, ist Ihre ssh_config HashKnownHosts yesgesetzt.
Deebster

1
Wenn Sie der Meinung sind, dass der Inhalt der Datei zu verwirrend ist, ist wahrscheinlich Zeilenumbruch aktiviert. Deaktiviere es. Alle Zeilen beginnen mit einem Hostnamen oder einer IP-Adresse.
Daniel B

Antworten:


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

Ändert die Datei ~ / .ssh / known_hosts: 6 und entfernt die 6. Zeile.

Meiner Meinung nach ssh-keygen -Rist using eine bessere Lösung für einen OpenSSH-Poweruser, während Ihr regulärer Linux-Administrator mit der oben beschriebenen Methode besser dafür sorgen würde, dass seine / ihre Sed Skills auf dem neuesten Stand bleiben.


18
Ich denke nicht, dass es ein guter Rat ist, eine Konfigurationsdatei manuell zu bearbeiten, wenn Sie eine offizielle Anwendung dafür haben. Das Eingehen von Risiken macht Sie nicht zum Profi, sondern das Finden der schnellsten und sichersten Option. Es ist, als würde man den Leuten sagen, sie sollen weitermachen und /etc/sudoersohne redigieren visudo. Wenn Sie Ihre sedFähigkeiten verbessern möchten, können Sie dies tun, ohne Ihr System zu beschädigen.
Kraxor

2
"Wenn Sie eine offizielle Bewerbung dafür haben" => beide ssh-keygen -Rund sed -i {line}dsind ziemlich "offiziell", und beide werden auf absehbare Zeit funktionieren. Util ssh-keygen ermöglicht das Entfernen nach Zeilennummer. Beide sind vollkommen akzeptabel (da Zeilennummern häufig einfacher zu handhaben und weniger fehleranfällig sind als der Umgang mit modernen Hostnamen in Rechenzentren).
Michael

2
A) Die Streichung der spezifisch 6. Zeile ist allesamt sehr "look no hands". Überhaupt keine Erklärung, was an der 6. Zeile der Akte von Bedeutung ist ?! B) man ssh-keygenErwähnt auch, dass ssh-keygen -R hostname Sie gerade gesagt haben, dass ssh-keygen -Rkein Hostname angegeben wurde, und dass Sie nicht erklärt haben, was Sie damit meinen.
Barlop

124

Die einfachste Lösung ist:

rm -f .ssh/known_hosts

ssh erstellt die Datei erneut, aber Sie verlieren die Schlüsselüberprüfung für andere Hosts!

Oder Sie können verwenden:

ssh-keygen -R "hostname"

Oder die ssh "man-in-the-middle" -Nachricht sollte angeben, in welcher Zeile der Datei known_hosts sich der fehlerhafte Fingerabdruck befindet. Bearbeiten Sie die Datei, springen Sie zu dieser Zeile und löschen Sie sie.


55
ssh-keygen -R hostnamewird auch funktionieren.
Grawity

6
Wenn wir diese Datei entfernen, werden auch andere Schlüssel entfernt.
ShgnInc

16
Das Entfernen der Datei ist ein schlechter Rat. Es ist, als würde man jemandem sagen, er solle einen neuen PC kaufen, weil der alte eine kaputte Maus hat. Das manuelle Bearbeiten einer Datei, die von einer offiziellen Anwendung bearbeitet werden kann, ist ebenfalls eine schlechte Idee. Die ssh-keygenOption wurde aufgrund eines Kommentars hinzugefügt, jedoch ohne Erklärung. Ich denke nicht, dass diese Antwort so viele positive Stimmen verdient.
Kraxor

12
-1 wegen der ganzen "Lösche die ganze known_hosts Datei" ersten Zeilen. Dies ist eine schreckliche, schreckliche, schreckliche Sache, die vorzuschlagen ist und herausgearbeitet werden sollte.
Olivier Dulac

4
Diese Lösung ist übertrieben. Entfernen Sie einfach die störende Linie. Das ist es.
Blake Frederick

81

Dafür gibt es einen ssh-keygen switch ( -R).

man ssh-keygen liest:

-R Hostname

Entfernt alle Schlüssel hostnameaus einer known_hostsDatei. Diese Option ist nützlich, um gehashte Hosts zu löschen (siehe die -Hobige Option).


8
Dies ist die einfachste und sicherste Methode.
Huhn

Hinweis: Dadurch werden die Berechtigungen der Datei known_hosts in 0600 geändert. Wenn Sie aus irgendeinem Grund eine freigegebene Datei known_hosts haben, kann dies die Freigabe deaktivieren.
Jiri Klouda

und die richtige. Außerdem musste ich [localhost]:portdie Klammern verwenden, weil ich einen benutzerdefinierten Port verwendet habe, denke ich = /. Wie andere bereits gesagt haben, würde ich für meine Entwicklung von Transienten- / Testsystemen auch den Ansatz ohne SSH-Schlüsselprüfung verwenden.
Pysis

Dadurch werden alle Unebenheiten so bestmöglich beseitigt. Sie können einen neuen Schlüssel hinzufügen mit:ssh-keyscan -H my.ssh.server.example.com >> ~/.ssh/known_hosts;
Nux vor

18

Die Warnung teilt Ihnen die genaue Zeile in der bekannten Hosts-Datei mit.

Hier ist ein Beispiel:

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@       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!

Sehen Sie den /home/user/.ssh/known_hosts:6Teil? Es gibt die Datei- und Zeilennummer an.


10

Sie müssen den folgenden Befehl ausführen, um dieses Problem zu beheben. Öffnen Sie das Terminal und geben Sie den folgenden Befehl ein:

Ersetzen Sie für alle folgenden Beispiele einfach den Wert nach -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

Diese Methode wurde bereits in den vorherigen Antworten vorgeschlagen. Könnten Sie näher auf das eingehen, was in Ihrer Antwort anders ist?
Burgi

@Burgi - Diese Antwort enthält detailliertere Informationen zur Syntax ssh-keygen -Rals alle bisherigen Antworten. Es zeigt anhand eines Beispiels genau, wonach Sie schreiben können -R. Diese Antwort lohnt sich also, auch wenn es sich nicht um eine völlig neue Antwort handelt.
Yitz

@Yitz Mein Kommentar wurde als Teil der Überprüfung abgegeben. Zu der Zeit (vor 18 Monaten) dachte ich, dass die Frage etwas Hilfe braucht, um sie noch besser zu machen.
Burgi

8

Sie können ssh auch anweisen, die Datei known_hosts nicht mit den Flags UserKnownHostsFile und StrictHostKeyChecking zu überprüfen.

Zum Beispiel:

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

Zur Vereinfachung der Verwendung können Sie Folgendes aliasen:

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

Jetzt können Sie einfach fett schreiben, wenn Sie sicher sind, dass Sie dem Zertifikat des Servers vertrauen.


8
Was für eine schreckliche Idee. Deaktivieren Sie dauerhaft eine Sicherheitsebene, nur weil Sie zu faul sind, ~/.ssh/known_hostsum auf dem neuesten Stand zu bleiben ? Warum nicht einfach weitermachen und nutzen telnet? "wann immer Sie sicher sind" - wenn Sie sich jemals sicher sind, dann haben Sie keine Ahnung, was ein MITM-Angriff ist, und Sie sollten wahrscheinlich einige Zeit damit verbringen, gute Literatur zu lesen.
Kraxor

2
Aufgrund der Frage des OP halte ich dies für eine gültige Antwort. Manchmal haben Sie ein Testsystem, auf dem Sie viele VMs erstellen / zerstören. (Ich mache das gerade, als ich mich auf die RHCE-Prüfung vorbereite.) Möglicherweise gibt es keine Auswirkungen auf die Sicherheit. Die Auswirkungen auf die Sicherheit sind zwar großartig, aber ich denke nicht, dass dies als "schreckliche Idee" bezeichnet werden muss.
Rick Chatham


3

Alle Antworten sind gut, aber für echte SSH-Profis fehlen Informationen zum Entfernen der SSH-Signatur mit Portnummer.

  • Einfacher Befehl zum Entfernen der SSH-Hostsignatur:

    ssh-keygen -R example.com
    
  • Komplexes Entfernen des SSH-Schlüssels, z. B. Sie stellen eine Verbindung zu SSH über nicht standardmäßigen Port 222 her:

    ssh example.com -p 222
    

und Sie erhalten eine Warnung, und um diese zu entfernen, müssen Sie die Doppelpunkt-Portnummer in eckigen Klammern verwenden:

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

Hoffe, dies hilft nicht-standardmäßigen Konfigurationsbenutzern.


Genau das, wonach ich gesucht habe. Danke!
3.

1

Hier ist eine Methode mit dem Ex-Editor:

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

Dabei steht 6 für die in der Warnmeldung angegebene Zeilennummer. Wie dieser:

Beleidigender Schlüssel für IP in /home/user/.ssh/known_hosts:6 <== LINE NUMBER


Im Allgemeinen ist es ratsam , verwendenex , um die Dateien nicht interaktiv zu bearbeiten , statt sed, was mehr ist ein S tream ED itor und seine -iParameter, der eine Nicht-Standard - FreeBSD - Erweiterung ist.


0

Der Eintrag für den Hostnamen oder die IP sollte in der ersten Spalte sein. In der Warnung sollte auch eine Zeilennummer aufgeführt sein, in der der fehlerhafte Schlüssel liegt.


0

Sie können auch eine einzelne Zeile von bekannten Hosts mit z. B. rmknownhost 111 entfernen (111 ist die zu entfernende Zeile):

#! /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 * ""}

Speichern Sie dies als rmknownhostin einem Ordner von Ihrem PATH.


Was ist der Vorteil davon gegenüber dem Ausführen in einem bestimmten Texteditor? Gibt es einen Grund, es nicht so zu machen, wie Sudoer mit Visudo bearbeitet werden müssen?
Andy Lester

Welche Distributionen kommen damit? Ubuntu scheint es nicht zu haben.
Flickerfly

Der Vorteil ist, dass es automatisiert und schnell ist / es ist eine separate Binärdatei, die Sie selbst hinzufügen
grober

2
Sie hätten Ihr Skript auch einfach hier veröffentlichen können, anstatt Ihren eigenen Blogeintrag zu verknüpfen, den Sie an dem Tag erstellt haben, an dem Sie diese Antwort veröffentlicht haben. Dies gilt meiner Meinung nach als Spam. Ganz zu schweigen davon, dass Sie einen einfachen Alias ​​erstellen können, um dasselbe Ergebnis zu erzielen, ohne ein 7 Zeilen langes Ruby-Skript zu benötigen.
Kraxor

1
oder fügen Sie dies einfach zu Ihrem ~ / .bashrc hinzu: sshdel() { sed -i "${@}d" ~/.ssh/known_hosts; }und rufen Sie es mit auf sshdel [line number]. Kein Rubin, keine Binärdatei, keine Sorgen.
Rubynorails

0

Es ist eine Textdatei. Sie können die betreffende Zeile einfach mit vi (m) bearbeiten, löschen (dd) und die Datei speichern (wq). Wenn es jedoch einen bestimmten Befehl zum Entfernen eines Hosts gibt, ist dies wahrscheinlich die sicherste Methode.


Ich sehe nicht, wie unsicher es ist, die Datei direkt in VIM zu bearbeiten. Es basiert auf Ihrem Komfortniveau mit VIM. Insbesondere bei dieser Datei besteht das größte Risiko darin, zu viele Schlüssel zu löschen. In diesem Fall werden Sie nur erneut aufgefordert, die Eingabe zu wiederholen.
Rick Chatham

Die "Sicherheit", auf die ich mich bezog, beinhaltet 1) das Vergessen / Nicht-Wissen, abhängige Informationen in anderen Dateien zu entfernen (falls vorhanden) und 2) das versehentliche Löschen von mehr oder weniger als nötig, wodurch die Datei beschädigt wird.
Ryan Griggs
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.