"Füge korrekten Hostschlüssel zu bekannten_Hosts hinzu" / Mehrere SSH-Hostschlüssel pro Hostname?

147

Beim Versuch, in einen von mir gesteuerten Computer zu sshen, erhalte ich die vertraute Nachricht:

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
[...].
Please contact your system administrator.
Add correct host key in /home/sward/.ssh/known_hosts to get rid of this message.
Offending RSA key in /home/sward/.ssh/known_hosts:86
RSA host key for [...] has changed and you have requested strict checking.
Host key verification failed.

Ich habe in der Tat den Schlüssel geändert. Und ich habe ein paar Dutzend Postings gelesen, in denen gesagt wird, dass die Lösung dieses Problems darin besteht, den alten Schlüssel aus der known_hostsDatei zu löschen .

Aber ich möchte, dass ssh sowohl den alten als auch den neuen Schlüssel akzeptiert. Die Sprache in der Fehlermeldung (" Add correct host key") deutet darauf hin, dass es eine Möglichkeit geben sollte, den richtigen Hostschlüssel hinzuzufügen, ohne den alten zu entfernen.

Ich konnte nicht herausfinden, wie der neue Hostschlüssel hinzugefügt werden kann, ohne den alten zu entfernen.

Ist das möglich oder ist die Fehlermeldung nur extrem irreführend?

Samuel Edwin Ward
quelle
9
Dies ist der Hostschlüssel, der den Fehler generiert. Ein Host sollte nur einen Schlüssel haben. Dies hat nichts mit Client- oder Benutzerschlüsseln zu tun. Haben Sie eine IP-Adresse, die zwischen verschiedenen Hosts oder so etwas schwebt?
David Schwartz
4
In meinem Fall weiß ich, dass ich in naher Zukunft viel zwischen den beiden Tasten wechseln werde, während ich an einigen Dingen herumspiele. Dies scheint auch in der von Ihnen vorgeschlagenen Situation einer IP mit mehreren Hosts nützlich zu sein. Hauptsächlich möchte ich nur wissen, ob dies für meine eigene Ausbildung möglich ist, abgesehen von einer bestimmten praktischen Anwendung.
Samuel Edwin Ward

Antworten:

148
  1. Holen Sie sich den RSA - Schlüssel des Servers, wo server_ipIhre Server-IP - Adresse ist, wie zum Beispiel 192.168.2.1:

    $ ssh-keyscan -t rsa server_ip
    

    Beispielantwort:

    # server_ip SSH-2.0-OpenSSH_4.3
    server_ip ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAwH5EXZG...
    
  2. Kopieren Sie auf dem Client die gesamte Antwortzeile server_ip ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAwH5EXZG...und fügen Sie den folgenden Schlüssel am Ende Ihrer ~/.ssh/known_hostsDatei hinzu:

    server_ip ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAqx9m529...(the offending key, and/or the very bottom of the `known_hosts` file)
    server_ip ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAwH5EXZG... (line you're adding, copied and pasted from above)
    
Quanten
quelle
12
Das hat funktioniert! Da ich jedoch "HashKnownHosts" verwende, sah der Eintrag ein wenig fehl am Platz aus. Zum Glück hat mich ssh_config (5) auf ssh-keygen (1) verwiesen, wodurch erklärt wurde, dass ich "ssh-keygen -H" verwenden kann, um die nicht gehashten Einträge zu hashen. Danke!
Samuel Edwin Ward
2
Dies "funktioniert", aber Sie überprüfen den Schlüssel nicht, so dass Sie anfällig für Mitm-Angriffe sind ...
JasperWallace
3
@JasperWallace, solange der erste Schritt über eine sichere Verbindung erfolgt (zum Beispiel mit localhost), sollte es ziemlich sicher sein, denke ich
erst
3
Gibt es eine Möglichkeit, alle Schlüsseltypen vom Server abzurufen? Manchmal weiß man nicht, ob es sich um RSA, DSA, ECDSA, RSA1 usw. handelt.
Sopalajo de Arrierez
3
@SopalajodeArrierez die gleiche manpage sagt auch , können Sie Arten mit Komma trennen, so tun ssh-keyscan -t rsa1,dsa,rsa,ecdsa,ed25519 server_ip- aber der einzige Grund zu finden rsa1und dsaist Schlüssel - Server zu identifizieren , die aktualisiert / neu konfiguriert werden müssen
kbolino
94

Entfernen Sie den Eintrag von known_hosts mit:

ssh-keygen -R *ip_address_or_hostname*

Dadurch wird die problematische IP- Adresse oder der Hostname aus der Datei " known_hosts " entfernt und es wird erneut versucht, eine Verbindung herzustellen .

Aus den Manpages:

-R hostname
Entfernt alle zum Hostnamen gehörenden Schlüssel aus einer Datei known_hosts. Diese Option ist nützlich, um gehashte Hosts zu löschen (siehe die Option -H oben).

Luis Abarca
quelle
11
msgstr "wie man den neuen Hostschlüssel hinzufügt, ohne den alten zu entfernen."
Samuel Edwin Ward
4
Das ist die beste Lösung!
Thomas Decaux
8
Wie hat das 19 Stimmen? Es ist nicht annähernd so weit, die gestellte Frage zu beantworten.
Molomby
2
Ihre Frage erscheint als zweites, wenn ich nach "git ssh update host key automatically" google. Diese Antwort habe ich gesucht. Wenn Sie eine neue Frage mit genau dem öffnen, was ich möchte, wird sie möglicherweise als Duplikat geschlossen.
Jason Goemaat
Hostname funktioniert auch
damluar
18

Ein sehr einfacher Weg ist:

cp ~/.ssh/known_hosts ~/.ssh/known_hosts.bak

Bearbeiten Sie anschließend known_hosts, um den ursprünglichen Schlüssel zu löschen, und senden Sie ssh an den Host. Verwenden Sie dazu Folgendes:

ssh name@computer

Der neue Schlüssel wird automatisch hinzugefügt. Vergleichen Sie dann die beiden Dateien. Ein Programm wie meld ist eine gute Möglichkeit, die beiden Dateien zu vergleichen. Führen Sie dann die Dateien zusammen, damit known_hosts beide Schlüssel enthält

Mein 'Grund' für die Beibehaltung von zwei Schlüsseln ist, dass das Zielsystem Multiboot ist, obwohl ich sagen kann, dass es eine Möglichkeit gibt, die Schlüssel in den Installationen zu synchronisieren, scheint es einfacher zu sein, mehrere Schlüssel zuzulassen.

EDIT 2015/06

Ich sollte noch einmal hinzufügen, dass ich es auf noch einfachere Weise bemerke [solange der Eintrag identifizierbar ist, normalerweise anhand des Hostnamens / der IP-Adresse, abgesehen von der Fehlermeldung, die auf den spezifischen Ort verweist].

  1. Bearbeiten Sie known_hosts, um # vorübergehend am Anfang des 'alten' Eintrags in known_hosts einzufügen
  2. Verbinde [ssh mit dem Host], stimme der Aufforderung zu, den neuen Schlüssel 'automatisch' hinzuzufügen
  3. Bearbeiten Sie anschließend known_hosts erneut, um das # zu entfernen.

Es gibt sogar die Option HostKeyAlias ​​wie in

ssh -o HostKeyAlias=mynewaliasforthemachine name@computer

Anschließend können Sie, nachdem der ssh-Client den neuen Schlüssel unter dem Alias ​​hinzugefügt hat, entweder known_hosts bearbeiten, um den Alias ​​durch den "echten" Hostnamen / die IP-Adresse zu ersetzen, oder die Verbindung zu dieser Inkarnation des Hosts mit der Alias-Option immer wieder herstellen

Kennzeichen
quelle
Diese 'Verschmelzung'? meldmerge.org
Samuel Edwin Ward
Das ist die Meldung :) apt-get / yum Installationsname ist einfach meld
Mark
Ich habe eine Variante Ihres Vorschlags gemacht, die gut funktioniert hat - anstelle von cp, mv, dann ssh, dann cat ~ / .ssh / known_hosts.bak ~ / .ssh / known_hosts> tmp; mv tmp ~ / .ssh / known_hosts
Peter N Lewis
6

Ich habe das gleiche Problem mit einer Himbeer-Pi, die ich mit mehreren verschiedenen Systemen (Dev-System zum Kompilieren von Arm-Binärdateien, Project, XBMC, etc.) boote und auf das gleiche Problem gestoßen bin. In einem lokalen Netzwerk wird DHCP verwendet, und mein Router hat immer dieselbe IP-Adresse verwendet, da die MAC-Adresse identisch war. Ich habe es gelöst, indem ich verschiedene Domainnamen in meiner Hosts-Datei verwendet habe:

10.10.10.110 pi-dev
10.10.10.110 pi-xbmc
10.10.10.110 pi-etc

Die Datei known_hosts speichert Fingerabdrücke nach Hostnamen, sodass jeder eindeutige Hostname einen anderen Eintrag erhält, obwohl es sich um dieselbe IP-Adresse handelt.

Jedes Mal, wenn ich ein neues System benutzte, hatte ich es satt, die Namen zu den Hosts-Dateien hinzuzufügen. Daher kam ich auf eine noch einfachere Art und Weise, indem ich führende Nullen für IP-Adressen verwendete, wie zum Beispiel:

$ ssh [email protected]
$ ssh [email protected]
$ ssh [email protected]

Jede Variation der (nicht kanonisierten) IP-Adresse erhält einen eigenen Eintrag in known_hosts.

Mike
quelle
1
Die OpenSSH-Leute haben es mir klar gemacht, diese Lücke funktioniert in neueren Versionen nicht mehr.
Mike
Sie können CheckHostIP noin verwenden ~/.ssh/config, um das Schlupfloch noch nutzen zu können. Sie können dort sogar Ihre Aliase definieren, so dass Sie nicht nur für diese 3 Hostnamen fummeln /etc/hostsund definieren müssen CheckHostIP no.
GnP
3

Wenn sowohl Ihr Client als auch Ihr Server über OpenSSH 6.8 oder höher verfügen, können Sie die UpdateHostKeys yesOption in Ihrem ssh_configoder verwenden ~/.ssh/config. Zum Beispiel:

Host *
    UpdateHostKeys yes

Dadurch speichert SSH alle Hostschlüssel, die der Server benötigt known_hosts, und wenn ein Server einen Hostschlüssel ändert oder entfernt, wird der Schlüssel auch in Ihrem geändert oder entfernt known_hosts.

Mikaela
quelle
Dies ist mit Abstand die nützlichste Antwort! Obwohl es nicht ausdrücklich eine Möglichkeit bietet, die ursprüngliche Frage zu lösen, wenn ein Hostschlüssel bereits geändert wurde, sind alle anderen Antworten unsicher, da sie den neuen Hostschlüssel nicht verifizieren. Mit dieser Option können Sie einen sicheren Rollover auf neue Hostschlüssel ausführen.
Jaap Eldering
1

Ich verstehe nicht, warum Sie mit zwei Schlüsseln arbeiten möchten, aber Sie können der ~/.ssh/known_hostsDatei sicherlich mehr als einen gültigen Schlüssel hinzufügen , müssen dies jedoch manuell tun.

Eine andere Lösung könnte darin bestehen, die StrictHostKeyChecking=noOption für diesen bestimmten Host zu verwenden:

ssh -o StrictHostKeyChecking=no user@host

welche du in einen alias in deinem ~/.profileoder ähnlichem setzen könntest .

alias hc=ssh -o StrictHostKeyChecking=no user@host
Sven
quelle
StrictHostKeyChecking scheint in diesem Fall nicht zu helfen. Anscheinend gibt es nur das Verhalten an, wenn sich der Host nicht in der Datei known_hosts befindet. Erwähnt hier: gossamer-threads.com/lists/openssh/dev/45349#45349
Samuel Edwin Ward
Es funktioniert hier. Sie erhalten eine Warnung, die Anmeldung wird jedoch fortgesetzt.
Sven
Das ist seltsam. Verwenden Sie die Kennwortauthentifizierung? Verwenden Sie OpenSSH?
Samuel Edwin Ward
1

Wenn Sie nur in ein lokales Netzwerk ssh dann ...

Eine einfache Lösung besteht darin, die alte Schlüsseldatei zu löschen und durch eine leere zu ersetzen. Auf diese Weise können Sie alle Verbindungen mit neuen Schlüsseln erneut autorisieren. Wenn Sie SSH-Schlüssel für Standorte außerhalb Ihres lokalen Netzwerks gespeichert haben, müssen Sie sicherstellen, dass Ihre ursprüngliche Verbindung so sicher ist, wie Sie es beim ersten Herstellen einer Verbindung mit diesem Server getan haben.

z.B

cp known_hosts known_hosts.old
rm known_hosts
nano known_hosts

Drücken Sie dann die Leertaste, die Rücktaste Strg + x und 'y', um den neuen Puffer (Datei) zu speichern. Es ist eine schlechte Praxis, aber in Ordnung, vorausgesetzt, Sie ssh'n nicht regelmäßig außerhalb Ihres lokalen Netzwerks (z. B. einer Uni oder eines Arbeitsservers).

In einem sicheren lokalen Netzwerk ist dies sicher, da Sie einfach keinen Mann in den mittleren Angriff bringen können.

Es ist immer besser, Code zu verwenden, den Sie verstehen!

Aaron
quelle
4
Wenn Sie known_hostsjedes Mal die gesamte Datei löschen, wird der größte Teil der sonst von ssh bereitgestellten Sicherheit zunichte gemacht.
Kasperd
In der Tat würde ich argumentieren, dass es in einem sicheren internen Netzwerk sicherer ist, Ihren Code zu verstehen und die Sicherheit zu umgehen, als Code sinnlos zu kopieren. In einem externen Netzwerk wäre die Situation dann anders.
Aaron
-1

So viele Antworten, aber so viele, die den Schutz aufgeben, indem sie die strenge Host-Überprüfung vollständig deaktivieren oder nicht verwandte Host-Informationen zerstören oder den Benutzer nur dazu zwingen, Schlüssel interaktiv zu akzeptieren, möglicherweise zu einem späteren Zeitpunkt, wenn dies unerwartet ist.

Hier ist eine einfache Methode, mit der Sie die strenge Host-Überprüfung aktiviert lassen, den Schlüssel jedoch kontrolliert aktualisieren können, wenn Sie eine Änderung erwarten :

  • Entfernen Sie den alten Schlüssel und aktualisieren Sie ihn mit einem Befehl

    ssh-keygen -R server.example.com && \
        ssh -o StrictHostKeyChecking=no server.example.com echo SSH host key updated.
    
  • Wiederholen Sie dies mit IP-Adressen oder anderen Hostnamen, wenn Sie diese verwenden.

Der Vorteil dieses Ansatzes besteht darin, dass der Server genau einmal neu verschlüsselt wird. Die meisten Versionen von ssh-keygen scheinen keinen Fehler zurückzugeben, wenn der zu löschende Server nicht in der bekannten Hosts-Datei vorhanden ist. Wenn dies für Sie ein Problem ist, verwenden Sie die beiden Befehle nacheinander.

Dieser Ansatz überprüft auch die Konnektivität und gibt eine nette Nachricht für die Protokolle im Befehl ssh aus (der sich anmeldet, den Hostschlüssel aktualisiert und den aktualisierten SSH-Hostschlüssel ausgibt und dann sofort beendet wird.

Wenn Ihre Version von ssh-keygen einen Exit-Code ungleich Null zurückgibt und Sie es vorziehen, diesen unabhängig von oder nach dem Herstellen einer Verbindung fehlerfrei zu verarbeiten, verwenden Sie einfach die beiden Befehle nacheinander und ignorieren Sie alle Fehler im Befehl ssh-keygen.

Wenn Sie diese Technik verwenden, müssen Sie Ihren ssh-Befehl nur während dieses einen ssh-Befehls ändern oder die Host-Überprüfung deaktivieren. Sie können sicher sein, dass zukünftige ssh-Sitzungen ohne Konflikte funktionieren oder explizit einen neuen Schlüssel akzeptieren müssen, solange der obige ssh-Befehl fehlerfrei ausgeführt wird.

markgo2k
quelle
-3

Ich hatte das gleiche problem

Ich habe nur sudo nano /home/user/.ssh/ host_allowden Schlüssel gelöscht.

Als ich zum Server zurückkehrte, fügte er einen neuen Schlüssel hinzu.

David
quelle
2
Weitere Informationen dazu, warum dies geschieht, sind für die Antwort hilfreich.
Drew Khoury
-4

Verwenden Sie den Befehl sed, um die fehlerhafte Zeile zu entfernen

OUTPUT: as show in above example
Offending key in /home/user/.ssh/known_hosts:86

Entfernen Sie die Leitung 86 wie bei bekannten Hosts erwähnt.

CODE: 
sed -i '86d' /home/user/.ssh/known_hosts

Beim nächsten Zugriff mit ssh fügt das System automatisch einen neuen Schlüssel hinzu.

neuere Versionen von ssh

verwenden:

ssh-keygen -R <hostname|ip address>

Es wird den Hostnamen Eintrag entfernen und nimmt Sicherung der alten .known_hostalsknown_hosts.old

Viikram Simha
quelle
4
"Aber ich möchte, dass ssh sowohl den alten als auch den neuen Schlüssel akzeptiert." Ihre Antwort tut dies nicht.
Samuel Edwin Ward