Benutzer-Werkzeuge

Webseiten-Werkzeuge


uganádarom-luun:ssh-fingerprints.263

SSH-Fingerprints überprüfen

Jeder kennt und liebt diese Fehlermeldung von ssh:

  @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  @    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 ECDSA key sent by the remote host is
  6d:bf:c4:18:b2:13:d4:bf:4f:e8:a2:a1:24:22:8b:8d.
  Please contact your system administrator.
  Add correct host key in […]/.ssh/known_hosts to get rid of this message.
  Offending ECDSA key in […]/.ssh/known_hosts:5
  ECDSA host key for brimlagorlinagalanus.example.com has changed and you have requested strict checking.
  Host key verification failed.

Eine schnelle Google-Suche findet schnell Unmengen von Varianten der immergleichen Antwort, wie mit dieser Fehlermeldung umzugehen ist, und zwar: Die betreffende Zeile löschen, entweder von Hand, oder unter Zuhilfenahme von ssh-keygen. Dies geschieht inzwischen derart reflexartig, daß damit eines der wichtigsten Sicherheitsmerkmale von SSH unterwandert wird, und zwar eben genau das host key checking.

SSH verwendet standardmäßig so etwas ähnliches wie das das TOFU-Sicherheitsmodell, um Man-in-the-Middle-Angriffe zumindest teilweise abzufangen. Details, wie das Prinzip funktioniert, finden sich in der Wikipedia; grob gesagt wird beim ersten Verbindungsversuch gefragt, ob man sich wirklich sicher ist, daß man sich auch wirklich mit dem richtigen Rechner verbindet. Dazu wird der sogenannte Fingerabdruck verglichen und in eine Datei1) gespeichert. Bei allen zukünftigen Versuchen steht in dieser Datei schon drin, welcher Fingerabdruck erwartet wird—zeigt der Server plötzlich einen anderen, wird die Verbindung mit genau der Fehlermeldung von oben abgelehnt.

Meistens passiert dies aus Schlamperei von Seiten des Admins, der den Server betreut. Der Kontrakt von SSH sieht vor, daß sich der host key während der Lebenszeit des Servers eben nicht ändert—tut er dies doch, muß das angekündigt sein, damit Clients sicherstellen können, daß sie immer noch mit dem richtigen Server sprechen. Anderenfalls könnte sich ein Angreifer zwischen den Server und den Client setzen, einfach irgendeinen host key präsentieren und fortan mitlauschen—genau das wird durch diese Überprüfung verhindert. Und genau das wird gestört, wenn diese Fehlermeldung ohne weiteres Nachdenken quasi weggeklickt wird.

Wie gehe ich mit dieser Meldung richtig um?

Ich selbst kriege diese Meldung regelmäßig zu Gesicht. Ich betreibe eine Reihe von Servern; speziell beim Aufsetzen eines neuen Rechners sind viele Dinge gerne noch etwas im Fluß, bis sich Schlüssel, Hostnamen und so fort richtig einspielen. In diesen Fällen kann ich den betreffenden Eintrag kurzerhand löschen—ich habe selbst den dazugehörigen Schlüssel geändert, also habe ich mit der Warnung gerechnet. Natürlich wäre ich im Prinzip immer noch dazu angehalten, den Fingerabdruck auch tatsächlich zu überprüfen.

Ab und zu lege ich mir aber auch selbst ein Ei und verwende beispielsweise einen Namen wieder, der vor Monaten mal irgendein kurzlebiger Testrechner war. Dann kann ich mich natürlich nicht mehr daran erinnern, was da gelaufen ist, ergo erfüllt die Warnung dann genau den Zweck. In diesen Fällen überprüfe ich tatsächlich, ob der Fingerabdruck mit dem übereinstimmt, was da kommen soll.

Fingerabdruck überprüfen

Die Dokumentation von OpenSSH ist erstaunlich undurchsichtig, wie man das nun am besten zu bewerkstelligen hat. Hier spielt auch noch rein, daß es inzwischen eine Vielzahl an Möglichkeiten gibt, den Fingerabdruck zu hashen und darzustellen.

Im Beispiel meint ssh zum Beispiel folgendes:

  The fingerprint for the ECDSA key sent by the remote host is
  6d:bf:c4:18:b2:13:d4:bf:4f:e8:a2:a1:24:22:8b:8d.

Wie kriege ich jetzt aber raus, ob das auch tatsächlich der richtige Fingerabdruck ist?

Im speziellen Fall war ich über einen anderen Kanal bereits auf dem Rechner angemeldet, um den es ging, also kam ich an die host keys gut ran. Diese liegen bei OpenSSH in /etc/ssh/ssh_host_ecdsa_key.pub (für ECDSA-Schlüssel, wie in der Meldung gezeigt):

  ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBNTBDsTHsmjGAzc2hiPykUSzTCaYNie/dDoS6RYlNMxf2bMvqK9FJouRQ7M6xqH/ojBTCVLxDhULL7zh0Y9ezo8= root@brimlagorlinagalanus.example.com

Wie die Manpage erklärt, dient ssh-keygen sowohl dazu, die host keys anzulegen, als sie auch zu überprüfen—aber ohne etwas… Überzeugungsarbeit steht man schnell alleine im Wald da.

ssh.1
    -l  Show fingerprint of specified public key file.  Private RSA1 keys
        are also supported.  For RSA and DSA keys ssh-keygen tries to
        find the matching public key file and prints its fingerprint.  If
        combined with -v, a visual ASCII art representation of the key is
        supplied with the fingerprint.

Das ist zuerst einmal etwas müßig und sieht völlig anders aus als das, was ssh präsentiert:

  ssh-keygen -l -v -l ssh_host_ecdsa_key.pub
  256 SHA256:QOQ2paXeL3PBkEOmLMv5HhLZWffZFvJt4yIQdeB7+zk root@brimlagorlinagalanus.example.com (ECDSA)
  +---[ECDSA 256]---+
  |     .o =  o..   |
  |     + O .o .    |
  |    . X =.... .  |
  |   . O * =...= o |
  |    * + S.o.o.+.o|
  |     o   .....o..|
  |    . o o o. o . |
  |     o . +  . oE.|
  |      .        o.|
  +----[SHA256]-----+

Sowohl ssh (ab OpenSSH 6.8) als auch ssh-keygen können dazu gebracht werden, die Fingerabdrücke in einem anderen Format anzuzeigen. OpenSSH 6.7 und früher kannte nur MD5 und zeigte dies in einem hexadezimalen Format an (wie in der Fehlermeldung ganz oben); ab Version 6.8 ist base64-codiertes SHA256 üblich. Dies geschieht durch ssh-keygen -l -E ${Algorithmus} bzw. ssh -o FingerprintHash=${Algorithmus}, wie hier gezeigt:2)

  ssh-keygen -l -v -E md5 -f ssh_host_ecdsa_key.pub
  256 MD5:6d:bf:c4:18:b2:13:d4:bf:4f:e8:a2:a1:24:22:8b:8d root@nur-ab-sal.13.aleturo.com (ECDSA)
  +---[ECDSA 256]---+
  |                 |
  |         .       |
  |        . .      |
  |       . . .     |
  |        S + .    |
  |         = = o   |
  |. . . . + . * .  |
  |.= . o . o.o +   |
  |E .   . .. .o .  |
  +------[MD5]------+
  ssh -o FingerprintHash=md5 brimlagorlinagalanus.example.com
  Host key fingerprint is MD5:6d:bf:c4:18:b2:13:d4:bf:4f:e8:a2:a1:24:22:8b:8d
  +---[ECDSA 256]---+
  |                 |
  |         .       |
  |        . .      |
  |       . . .     |
  |        S + .    |
  |         = = o   |
  |. . . . + . * .  |
  |.= . o . o.o +   |
  |E .   . .. .o .  |
  +------[MD5]------+

The Method Works!

Zur Erinnerung, hier nochmal die Fehlermeldung vom Eingang:

  @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  @    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 ECDSA key sent by the remote host is
  6d:bf:c4:18:b2:13:d4:bf:4f:e8:a2:a1:24:22:8b:8d.

Der angegebene Fingerprint ist MD5 und hexadezimal, jetzt kann ich ihn aber mit der Ausgabe von ssh-keygen vergleichen. Die beiden Zeichenfolgen stimmen überein—ergo spreche ich in der Tat mit dem Rechner, mit dem ich sprechen wollte. Jetzt kann ich beruhigt den Eintrag aus der known_hosts entfernen und ab da wie gewohnt arbeiten. Und wenn man das zwei, dreimal gemacht hat, ist der Aufwand vernachlässigbar—es gibt keinen vernünftigen Grund, einfach aus schierem Reflex seine eigene Sicherheit aufs Spiel zu setzen. ◀

Diskussion

1) Üblicherweise ~/.ssh/known_hosts
2) Es ist erstaunlich schwierig, eine sinnvolle Anleitung zu finden, wie man das richtig macht. Ich bin froh, über http://www.phcomp.co.uk/Tutorials/Unix-And-Linux/ssh-check-server-fingerprint.html gestolpert zu sein, dort wird es recht gut erklärt—da habe ich auch das Material für dieses Streichholz her.
uganádarom-luun/ssh-fingerprints.263.txt · Zuletzt geändert: 2016-11-16 17:41 (vor 3 Jahren) von Stefan Unterweger