
Stellen wir uns folgendes Szenario vor.
Ich habe einen Hostschlüssel ABCDEF1234
für einen bestimmten Hostnamen, daher sieht meine known_hosts
Datei 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.com
teilt mir der Administrator mit, dass der RSA-Schlüssel entfernt und durch den 1234ABCDEF
Schlü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_host
so 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 -R
Fehler 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 -R
ist nicht, die Verwendung von zu vermeiden sed
, sondern gehashte Hosts zu entfernen, die beispielsweise sed
nicht gefunden werden konnten. Vonssh-keygen(1):
-R hostname
Entfernt alle Schlüssel, die zu
hostname
einerknown_hosts
Datei gehören. Diese Option ist nützlich, um gehashte Hosts zu löschen (siehe Option-H
oben).
-H
Hashen Sie eine
known_hosts
Datei. 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.old
normal 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.ssh
sshd
Ü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 sed
für Base64 an
Der Base64-codierte öffentliche Schlüssel enthält die Zeichen A-Za-z0-9+/=
. Da er das /
in Ihrem sed
Beispiel 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 hostname
würde ausreichen, eine Schlüsselrotation durchzuführen.
Meine Lösung hierfür besteht darin, in der SSH-Konfiguration CheckHostIP
Folgendes festzulegen .no