it-swarm.com.de

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

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.9 und die Namen sind hostname und hostname.domainname

Soweit ich verstanden habe, besteht die Lösung, um eine Verbindung zu den beiden Hosts herzustellen, darin, beide zur Datei ~/.ssh/know_hosts hinzuzufügen. Dies ist jedoch einfacher gesagt als getan, da die Datei gehasht ist und wahrscheinlich mehrere Einträge pro Host enthält (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_hosts-Datei 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 es mir ermöglichen, mit ssh eine nahtlose Verbindung zu diesem Computer herzustellen, unabhängig davon, ob ich ihn 192.168.0.9, hostname oder hostname.domainname nenne oder ob er seinen Linux-Hostkey oder seinen OSX-Hostkey verwendet. Ich möchte jedoch weiterhin eine Warnung erhalten, wenn es sich um einen echten Man-in-the-Middle-Angriff handelt , d. H. , wenn ein anderer Schlüssel als diese beiden verwendet wird.

26

Die einfachste Lösung besteht darin, nur die gleichen Host-Schlüssel für Linux und OS X 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 nicht klüger.

12
jjlin

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 akzeptieren beide.

(Sie können auch ssh-keygen -H -F <hostname> verwenden, um Zeilen in Ihrer Datei known_hosts zu finden, 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.

26
DaCheetah

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

Quelle: https://stackoverflow.com/questions/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 Host-Schlü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 Benutzername- 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
9
Rhyuk

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?

2
Pyheme

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).

2
Izzy

Da Sie die strenge Überprüfung des Host-Schlüssels beibehalten möchten, sollten sie unterschiedliche known_hosts-Dateien verwenden. Richten Sie dazu Ihre ~/.ssh/config-Datei (oder die /etc/ssh/ssh_config-Datei, wenn Sie diese 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 $REALHOSTNAME natü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 können ssh myserver.linux und ssh myserver.osx also unterschiedliche Host-Schlüssel haben, aber Sie erhalten trotzdem die Prüfung. Wenn es sich um Linux handelt 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 known_hosts etwas völlig nicht stimmt. Wenn Sie also $REALHOSTNAME anstelle von myserver.osx eingeben, wird eine Warnung angezeigt. :-) Ich würde das tun, indem ich so etwas setze

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

führen Sie in meinem /etc/hosts einen ssh $REALHOSTNAME aus, akzeptieren Sie den neuen Schlüssel und nehmen Sie diesen Eintrag heraus.

1
Jim

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

Die zweite Methode verwendet zwei openSSH-Parameter: StrictHostKeyCheckin und 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.

1
afk