Wie bearbeite ich known_hosts, wenn mehrere Hosts denselben IP- und DNS-Namen haben?

29

Ich ssh regelmäßig in einen Computer, der ein Dual-Boot-OS X / Linux-Computer ist. Die beiden Betriebssysteminstanzen verwenden nicht denselben Hostschlüssel, sodass sie als zwei Hosts angesehen werden können, die dieselbe IP und denselben DNS verwenden. Nehmen wir an, die IP ist 192.168.0.9und die Namen sind hostnameundhostname.domainname

Soweit ich verstanden habe, besteht die Lösung, um eine Verbindung zu den beiden Hosts herzustellen, darin, beide zur ~/.ssh/know_hostsDatei hinzuzufügen . Allerdings ist es leichter gesagt als getan, da die Datei gehasht wird, und hat wahrscheinlich mehrere Einträge pro Host ( 192.168.0.9, hostname, hostname.domainname). Als Konsequenz habe ich folgende Warnung

Warning: the ECDSA host key for 'hostname' differs from the key for the IP address '192.168.0.9'

Gibt es eine einfache Möglichkeit, die known_hostsDatei unter Beibehaltung der Hashes zu bearbeiten ? Wie kann ich zum Beispiel die Zeilen finden, die einem bestimmten Hostnamen entsprechen? Wie kann ich die Hashes für einige bekannte Hosts generieren?

Die ideale Lösung würde mir erlauben , nahtlos an diesen Computer mit ssh zu verbinden, egal ob ich es nennen 192.168.0.9, hostnameoder hostname.domainname, noch wenn es verwendet , um seine Linux hostkey oder seine OSX hostkey. Ich möchte jedoch weiterhin eine Warnung erhalten, wenn es sich um einen echten Man-in-the-Middle-Angriff handelt, dh wenn ein anderer Schlüssel als diese beiden verwendet wird.

Frédéric Grosshans
quelle
Was möchten Sie tun? Bearbeiten Sie es für was?
Rhyuk
@Rhyuk: Bearbeiten Sie diese Option, damit sowohl der OSX- als auch der Linux-Hostschlüssel für die IP-Adresse, den Hostnamen und den Hostnamen.Domänennamen als gültig erkannt werden.
Frédéric Grosshans
@ Ryuk: Ich habe die Frage bearbeitet. Ist es jetzt klarer?
Frédéric Grosshans
2
Haben Sie einfach darüber nachgedacht, für beide Installationen den gleichen Schlüssel zu verwenden?
Zoredache
3
Es gibt einige Fälle, in denen es sinnvoll ist, eine IP-Adresse für den Zugriff auf mehrere Entitäten (jeweils mit individuellen SSH-Hostschlüsseln) zu verwenden und dennoch die strikte Kontrolle zu behalten, dass NUR diese Hostschlüssel vom SSH-Client gesehen werden. ZB einige Hochverfügbarkeits-Setups, bei denen auf einen Cluster von Einheiten unter Verwendung einer gemeinsamen IP-Adresse zugegriffen wird, sich jedoch (aus irgendeinem Grund) der von Clients angezeigte SSH-Hostschlüssel ändert, je nachdem, welche Cluster-Einheit gerade aktiv ist. Ein anderer Fall ist, wenn sich mehrere SSH-Hosts hinter einer NAT-Firewall befinden und von außen darauf zugegriffen wird, scheinen alle dieselbe IP zu haben.
IllvilJa

Antworten:

12

Die einfachste Lösung besteht darin, für Linux und OS X nur dieselben Host-Schlüssel zu verwenden. Wählen Sie also einen Satz von /etc/ssh/ssh_host_*_key*Dateien aus und kopieren Sie sie auf das andere Betriebssystem. Dann wird einem SSH-Client derselbe Host-Schlüssel angezeigt, unabhängig davon, unter welchem ​​Betriebssystem Sie gebootet haben, und der SSH-Client ist auch nicht klüger.

jjlin
quelle
Ich bevorzuge eine Client-Version, aber ich werde diese ausprobieren, wenn ich keine finde. Übrigens ist die OSX (nicht-Standard) -Lokalisierung der Dateien /private/etc/ssh_host*nicht /etc/ssh/ssh_host*.
Frédéric Grosshans
Das Kopieren der Dateien von einem Computer auf einen anderen (zwei Linux-Computer) hat bei mir nicht funktioniert. Obwohl der Dateiinhalt identisch war, war der Hash nicht so, dass ich immer noch das Problem bekam (vielleicht die Änderungszeit?). Die folgende Lösung ist viel besser.
Stav
sshdLädt die Host-Schlüssel einmal beim Start, sodass Sie höchstwahrscheinlich neu starten müssen sshd. Ich werde das zur Antwort hinzufügen. Welche anderen Lösungen besser sind, hängt von Ihrer Situation ab. Ich würde argumentieren, dass die Hauptvorteile dieser Methode darin bestehen, dass sie nur eine einmalige Einrichtung erfordert und mit größerer Wahrscheinlichkeit mit mehreren SSH-Client-Implementierungen zusammenarbeitet.
JJLIN
Es ist merkwürdigerweise so, dass meine relativ neue Version von OpenSSH 7.4p1 sshdHost-Schlüssel für jede neue Verbindung lädt. Vielleicht war es schon lange so und ich ging einfach davon aus, dass Host-Schlüssel wie andere sshdKonfigurationen behandelt wurden . Das kann also Ihr Problem sein oder auch nicht.
JJLIN
Wäre es eine schlechte Idee, dies zwei Hosts in einem Cluster zuzuteilen, die dieselbe VRRP-Adresse haben? Bei einem Failover ist der Host, der antwortet, unterschiedlich. Ich möchte die Warnung nicht erhalten.
Colin 't Hart
26

Wie @Izzy in einem obigen Kommentar angedeutet hat, teilt ssh Ihnen die fehlerhafte Zeile mit. Wenn Sie diese Zeile entfernen (an einer anderen Stelle speichern), den neuen Schlüssel akzeptieren und die entfernte Zeile dann zurückkopieren, erhalten Sie zwei Schlüssel für dieselbe Zeile Host, und ssh wird entweder akzeptieren.

(Sie können auch ssh-keygen -H -F <hostname>Zeilen in Ihrer Datei known_hosts suchen, die mit diesem Hostnamen übereinstimmen. Wenn Sie dies nach dem Zurückkopieren der entfernten Zeile ausführen, sollten zwei Einträge aufgelistet werden.)

Wenn jemand weiß, wie man PuTTY dazu bringt, dasselbe zu tun, wäre ich sehr interessiert, davon zu hören.

DaCheetah
quelle
4
Wenn Sie einen Linux-Client haben, müssen Sie nicht einmal die anstößige Zeile entfernen, sondern müssen sie nur mit einem Rautezeichen ('#') vorne auskommentieren. Sobald Sie den neuen Schlüssel akzeptiert haben, können Sie einfach die Datei known_hosts bearbeiten und die Zeile mit dem alten Schlüssel auskommentieren. Aber ja, das wäre auch in Putty nützlich.
IllvilJa
1
Wenn es zwei Hosts mit demselben Namen, aber unterschiedlicher IP-Adresse und unterschiedlichem Hostschlüssel gibt, funktioniert diese Problemumgehung auch: Kommentieren Sie beide Zeilen für diesen Host aus (oder löschen Sie sie vorübergehend) (die auf der IP-Adresse basierende und die auf dem Host basierende) name), stellen Sie eine Verbindung zu dem noch nicht bekannten Host her und fügen Sie die auskommentierten oder gelöschten Zeilen erneut hinzu.
Kai Petzke
13

Ich habe dies gefunden, das dir dabei helfen kann, was du erreichen willst.

Quelle: /programming/733753/how-to-handle-ssh-host-key-verification-with-2-different-hosts-on-the- same- but

Erstellen Sie eine Konfigurationsdatei in Ihrem .ssh-Verzeichnis wie folgt:

Host server1
  Hostname x1.example.com
  HostKeyAlias server1
  CheckHostIP no
  Port 22001
  User karl

Host server2
  Hostname x2.example.com
  HostKeyAlias server2
  CheckHostIP no
  Port 22002
  User karl

Erklärung unten (von man ssh_config)

CheckHostIP

Wenn dieses Flag auf "yes" gesetzt ist, überprüft ssh (1) zusätzlich die Host-IP-Adresse in der Datei known_hosts. Dadurch kann ssh erkennen, ob sich ein Hostschlüssel aufgrund von DNS-Spoofing geändert hat. Wenn die Option auf "nein" gesetzt ist, wird die Prüfung nicht ausgeführt. Der Standardwert ist "Ja".

HostKeyAlias

Gibt einen Alias ​​an, der anstelle des tatsächlichen Hostnamens verwendet werden soll, wenn der Hostschlüssel in den Hostschlüsseldatenbankdateien gesucht oder gespeichert wird. Diese Option ist nützlich für das Tunneln von SSH-Verbindungen oder für mehrere Server, die auf einem einzelnen Host ausgeführt werden.

In der Benutzernamen- und Port-Zeile müssen Sie diese Optionen nicht auch in der Befehlszeile angeben, sodass Sie nur Folgendes verwenden können:

% ssh server1
% ssh server2
Rhyuk
quelle
Ich habe diesen Artikel gesehen, aber er entspricht nicht meinem Fall: Die beiden Server unterscheiden sich nach der Portnummer im Artikel, nicht in meinem Fall. Außerdem möchte ich die zusätzlichen Sicherheitsschichten behalten, die durch die gesalzenen Haschischs in known_hostsund gebracht werden CheckHostIP.
Frédéric Grosshans
1
@ FrédéricGrosshans, ich überprüfe geprüft. Sie müssen keine separaten Ports haben und die HashKnownHosts-Option funktioniert gut mit HostKeyAlias.
Zoredache
Der Nachteil dabei ist, dass, sofern ich mich nicht irre, dies auf Client-Basis konfiguriert wird, während die akzeptierte Antwort nur auf den akzeptierenden SSH-Servern konfiguriert wird.
FreeSoftwareServers
2

Der einfachste Weg, um Ihr Problem zu lösen, besteht darin, jedem Host eine eigene IP-Adresse zuzuweisen. Mit 253 verfügbaren Adressen in Ihrem (privaten) Netz und IPv4 sollte das keine große Sache sein. Geben Sie ihnen feste IP-Adressen (da ein DHCP-Server den Computer anhand der MAC-Adresse der Netzwerkkarte identifiziert und beide dieselbe Adresse erhalten würden). Ich sehe keine andere Lösung, wenn Sie die Sicherheitsmaßnahmen einhalten möchten (die ich auch wegen dieses kleinen "Trostes" nicht fallen lassen würde).

Izzy
quelle
Tatsächlich ist die IP-Adresse nicht 192.168.0.xxund nicht privat. Es ist eine "echte" IPv4-Adresse, die von meiner Universität vergeben wird und die ich nicht ändern kann.
Frédéric Grosshans
Wenn Sie bei Wikipedia nachsehen , sehen Sie 192.168.0.0 - 192.168.255.255 (Ihre Frage 192.168.0.9, die in diesen Bereich fällt), die zu den "privaten IPv4-Adressräumen" gehört. Also bezog ich mich von "privat" nicht darauf, dass Sie es "besitzen", sondern auf die Spezifikationen der IETF . In Ihrer Frage haben Sie nicht angegeben, dass Sie die IP-Adresse nicht ändern können.
Izzy
Entschuldigen Sie die schlecht formulierte Frage. Ich habe nicht abgelehnt.
Frédéric Grosshans
Kein Problem, und danke, dass ich es weiß - die Ablehnung ist weniger entmutigend. Aber eine andere Idee: Ich bin nicht sicher, woher die Datei known_hosts den Hostnamen bezieht, DNS umkehrt oder vom Client angeboten wird. Sie können versuchen, einen Ihrer "Hosts" umzubenennen, damit er einen anderen Hostnamen aufweist. Oder um beide Host-Schlüssel hinzuzufügen: ssh teilt Ihnen die "beleidigende Zeile" in Ihrer known_hosts-Datei mit (wenn # 1 enthalten ist und Sie sich mit # 2 verbinden). Sie können diese Zeile dann in eine andere Datei kopieren, sie von known_hosts entfernen, die Verbindung mit Nummer 2 herstellen und ihre Zeile hinzufügen und die entfernte Zeile wieder hinzufügen. Ich bin nicht sicher, ob es funktioniert, aber Sie können es versuchen.
Izzy
2

Dieses Problem tritt nicht auf, wenn ich eine Verbindung zu verschiedenen VPS-Boxen herstelle, die dieselbe IP-Adresse verwenden, da jede über einen anderen SSH-Port verfügt (20022.30022 usw.), sodass sie als bekannte Hosts mit unterschiedlichen Schlüsseln registriert sind.

Könnte das ein Workaround für Sie sein?

Pyheme
quelle
Hallo @Pyheme, willkommen bei Super User! Beachten Sie, dass diese Frage fast 4 Jahre alt ist. Es ist nichts Falsches daran, es zu beantworten, aber denken Sie daran, dass Sie möglicherweise keine Antwort erhalten.
Hewbot
Ich habe keine OS X-Maschine mehr, aber Ihre Antwort könnte für jemand anderen nützlich sein. Das ist der springende Punkt beim Stapelaustausch
Frédéric Grosshans
@Hewbot ... in der Tat sehe ich es jetzt. Ich weiß nicht warum, es erschien in der Liste der letzten Fragen ...
Pyheme
1

Ein weiterer Artikel , der verschiedene Möglichkeiten zur Behandlung Ihres Problems beschreibt:

Die zweite Methode verwendet zwei openSSH-Parameter: StrictHostKeyCheckinund UserKnownHostsFile. Bei dieser Methode wird SSH so konfiguriert, dass eine leere Datei known_hosts verwendet wird und Sie NICHT aufgefordert werden, den Identitätsschlüssel des Remote-Hosts zu bestätigen.

afk
quelle
In diesem Artikel geht es darum, die Schlüsselüberprüfung zu verbieten. Ich möchte die Schlüsselüberprüfung beibehalten und nicht jedes Mal, hostnamewenn Linut oder OSX neu gestartet wird, deaktivieren
Frédéric Grosshans
1
Willkommen bei Super User! Während dies theoretisch die Frage beantworten mag, wäre es vorzuziehen , die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz bereitzustellen. Ich habe einen kurzen Teil aufgenommen, aber es könnte nicht das sein, was Sie beabsichtigt haben ...
Tamara Wijsman
1

Da Sie die strikte Überprüfung des Hostschlüssels beibehalten möchten, müssten sie unterschiedliche known_hostsDateien verwenden. Richten Sie dazu Ihre ~/.ssh/configDatei (oder die /etc/ssh/ssh_configDatei, wenn Sie dies für mehrere lokale Benutzerkonten benötigen) folgendermaßen ein:

Host myserver.osx
  UserKnownHostsFile ~/.ssh/known_hosts.dual.osx
  # default is ~/.ssh/known_hosts
  Hostname $REALHOSTNAME

Host myserver.linux
  UserKnownHostsFile ~/.ssh/known_hosts.dual.linux
  Hostname $REALHOSTNAME

und $REALHOSTNAMEnatürlich durch den tatsächlichen Hostnamen oder die tatsächliche IP-Adresse ersetzen . (Es spielt keine Rolle, für welche Sie sich entscheiden, solange Sie etwas nach "Hostname" auswählen, das sich in die IP-Adresse auflösen würde, aber ich würde den Hostnamen einer IP-Adresse vorziehen, nur nach allgemeinen Grundsätzen.)

Dann ssh myserver.linuxund ssh myserver.osxsomit kann man verschiedene Hostschlüssel haben, aber man bekommt trotzdem die Prüfung. Wenn Linux installiert ist und Sie OS X eingeben (oder umgekehrt), erhalten Sie die Warnung (die meines Erachtens der gewünschte Effekt ist).

Wenn ich dieses Problem hätte, würde ich sicherstellen, dass in der Hauptdatei etwas völlig falsch ist known_hosts, das mit keinem der beiden Dateien übereinstimmt. Wenn Sie also etwas eingeben, $REALHOSTNAMEanstatt myserver.osxeine Warnung zu erhalten. :-) Ich würde das tun, indem ich so etwas setze

<ip-address-of-github.com> $REALHOSTNAME

in my /etc/hosts, dann mache ich einen ssh $REALHOSTNAMEund akzeptiere den neuen Schlüssel, dann nehme ich diesen Eintrag heraus.

Jim
quelle