Überlegungen

Überlegungen

Stellen wir uns folgendes Szenario vor.

Ich habe einen Hostschlüssel ABCDEF1234für einen bestimmten Hostnamen, daher sieht meine known_hostsDatei folgendermaßen aus (nicht gehashte Version):

example.com ssh-rsa ABCDEF1234

Jetzt verbinde ich mich damit und die Hostnamen werden auf 10.11.12.13 aufgelöst. Ich habe eine Meldung wie diese

Warning: Permanently added the ECDSA host key for IP address '10.11.12.13' to the list of known hosts.

Und meine known_hosts sehen so aus

example.com ssh-rsa ABCDEF1234
192.0.2.1 ssh-rsa ABCDEF1234 

Jetzt, ein paar Monate später, example.comteilt mir der Administrator mit, dass der RSA-Schlüssel entfernt und durch den 1234ABCDEFSchlüssel ersetzt wurde. Also entferne ich den fehlerhaften Schlüssel mit ssh-keygen -R example.com, verbinde mich dann zum ersten Mal, akzeptiere den Schlüssel und weiß, dass mein Schlüssel known_hostso aussieht:

192.0.2.1 ssh-rsa ABCDEF1234 
example.com  ssh-rsa 1234ABCDEF

Und jedes Mal, wenn ich eine Verbindung herstelle, erhalte ich diese nette Warnmeldung:

Warning: the ECDSA host key for 'example.com' differs from the key for the IP address '192.0.2.1'
Offending key for IP in /home/jenkins/.ssh/known_hosts:162
Matching host key in /home/jenkins/.ssh/known_hosts:182

Stellen Sie sich nun vor, es gibt Dutzende oder Hunderte von IPs für diesen bestimmten Hostnamen. Das sind ziemlich viele Zeilen, die gelöscht werden müssen. Eine Lösung besteht darin, sedübereinstimmende Zeilen zu entfernen. Aber besteht das Ziel nicht darin, ssh-keygen -RFehler zu vermeiden sed?

sed -i '/ABCDEF1234/d' known_hosts

Gibt es eine andere Lösung, die alle Einträge aus einer Datei entfernt known_host, die mit einem bestimmten Schlüssel statt mit einem Hostnamen oder einer IP-Adresse verknüpft sind?

Antwort1

Der Zweck von ssh-keygen -Rist nicht, die Verwendung von zu vermeiden sed, sondern gehashte Hosts zu entfernen, die beispielsweise sednicht gefunden werden konnten. Vonssh-keygen(1):

-R hostname

Entfernt alle Schlüssel, die zu hostnameeiner known_hostsDatei gehören. Diese Option ist nützlich, um gehashte Hosts zu löschen (siehe Option -Hoben).

-H

Hashen Sie eine known_hostsDatei. Dies ersetzt alle Hostnamen und Adressen innerhalb der angegebenen Datei durch gehashte Darstellungen; der ursprüngliche Inhalt wird in eine Datei mit einem Suffix verschoben . Diese Hashes können von und .oldnormal verwendet werden , aber sie geben keine identifizierenden Informationen preis, falls der Inhalt der Datei offengelegt wird. Diese Option ändert keine vorhandenen gehashten Hostnamen und kann daher sicher für Dateien verwendet werden, die gehashte und nicht gehashte Namen mischen.sshsshd

Überlegungen

Kollisionen vermeiden

Beachten Sie, dass es am besten ist, den vollständigen öffentlichen Schlüssel in Base64 zu verwenden, um das Entfernen anderer Schlüssel zu vermeiden. Wenn Sie beispielsweise nur Teile desHeaderSie würden letztendlich alle Schlüssel desselben Typs entfernen:

 Base64 ASCII Art.-Nr.
AAAAE2VjZHNhLXNoYTItbmlzdHAyNTY
AAAAIbmlzdHAyNTYAAABBB
....ecdsa-sha2-nistp256
....nistp256...A
RFC 5656, 3.1
AAAAC3NzaC1lZDI1NTE5AAAAIFKy ....ssh-ed25519... R² RFC 8709, 4
AAAAB3NzaC1yc2EAAAADAQABAAABAQ ...ssh-rsa........... RFC 4253, 6.6

Passen Sie Ihre sedfür Base64 an

Der Base64-codierte öffentliche Schlüssel enthält die Zeichen A-Za-z0-9+/=. Da er das /in Ihrem sedBeispiel verwendete enthalten kann, möchten Sie ein anderes Zeichen wie verwenden :.

Arbeitsbeispiele

In den Beispielen:

  • Dies AAAA+OLD/KEY=ist ein Platzhalter für dievollalter öffentlicher Schlüssel.
  • Dies AAAA+NEW/KEY=ist ein Platzhalter für dievollneuer öffentlicher Schlüssel.

Entfernen Sie alle Hosts mit demselben Schlüssel

Verwenden Sie den vollständigen alten Schlüssel, um alle Zeilen zu entfernen, die ihn enthalten:

sed -i ':AAAA+OLD/KEY=:d' ~/.ssh/known_hosts

Ersetzen Sie den alten Schlüssel durch einen neuen

Verwenden Sie die vollständigen Schlüssel (alt und neu), um sie in allen Zeilen zu ersetzen, die den alten Schlüssel enthalten:

sed -i 's:AAAA+OLD/KEY=:AAAA+NEW/KEY=:g' ~/.ssh/known_hosts

Ändert sich auch der Schlüsseltyp, müsste dieser mit angegeben werden, z.B.

sed -i 's:ssh-rsa AAAA+OLD/KEY=:ecdsa-sha2-nistp256 AAAA+NEW/KEY=:g' ~/.ssh/known_hosts

Entfernen Sie Schlüssel für den Hostnamen oder die IP

Dies ist der einzige Anwendungsfall, in dem Sie verwenden würden ssh-keygen.

ssh-keygen -R example.com

ssh-keygen -R 192.0.2.1

Antwort2

Das Problem von vornherein zu vermeiden, ist eine gute Lösung. Wenn known_hosts nicht mit Einträgen für jede einzelne IP für einen bestimmten Hostnamen gefüllt wäre, wäre es nicht nötig, mit sed herumzuspielen. Es ssh_keygen -R hostnamewürde ausreichen, eine Schlüsselrotation durchzuführen.

Meine Lösung hierfür besteht darin, in der SSH-Konfiguration CheckHostIPFolgendes festzulegen .no

Wie hilft mir die SSH-Option CheckHostIP=yes konkret?

verwandte Informationen