SSH-Logins werden unter RHEL, CentOS und Fedora in der Datei /var/log/secure protokolliert. Dieser Artikel beschreibt, wie man bei einem Audit den zum im Log protokollierten RSA-Fingerprint passenden SSH-Key identifiziert.
In dem hier beschriebenen Szenario wird angenommen, dass SSH-Logins ausschließlich über Public-Key-Authentifizierung zugelassen sind und die öffentlichen SSH-Schlüssel an zentraler Stelle im Dateisystem abgelegt sind. Darüber hinaus enthält jeder SSH-Schlüssel die E-Mail-Adresse des dazugehörigen Benutzers.
Authentifiziert sich ein Benutzer mit seinem öffentlichen SSH-Schlüssel an einem RHEL-, CentOS- oder Fedora-System, wird dies im Log /var/log/secure wie folgt dokumentiert:
Jun 18 15:34:55 hostname sshd[846]: Accepted publickey for tronde from X.X.X.X port 61362 ssh2: RSA cd:22:29:38:f7:e2:49:b1:a6:2f:8d:8f:cc:69:d7:c2
Neben Datum, Uhrzeit und dem verwendeten Benutzernamen wird hier der RSA-Fingerabdruck des verwendeten SSH-Publickey dokumentiert. Um nun herauszufinden, welcher SSH-Public-Key zu diesem Fingerabdruck gehört, nutze ich ein kleines Bash-Skript[1. Das Skript auf GitHub]:
#!/bin/bash # Beschreibung: # Dieses Skript gleicht einen RSA-Hash aus dem Log /var/log/secure mit den # vorhandenen SSH-Public-Keys ab. Bei Uebereinstimmung wird der entsprechende # Key ausgegeben. # # Der RSA-Hash wird dem Skript als Argument uebergeben. # # Autor: Joerg Kastning <joerg.kastning(aet)uni-bielefeld(punkt)de> # Hauptteil ####################################################### rsa_fprint="$1" printf "RSA-Fingerprint:\n${rsa_fprint}\n\n" for key in *.pub do tmp1=`/usr/bin/ssh-keygen -lf ${key}` set - $tmp1 tmp2=`echo "$2"` if [[ "${rsa_fprint}" = "${tmp2}" ]] then printf "Der zugehoerige SSH-Key lautet:\n${tmp1}\n" exit 0 fi done printf "Es wurde kein SSH-Key gefunden, welcher zu dem uebergebenen RSA-Fingerprint passt." exit 0
Diesem Skript wird der RSA-Fingerabdruck als Argument übergeben. Das Skript generiert anschließend den RSA-Fingerabdruck aller SSH-Schlüssel in dem Verzeichnis, in dem das Skript aufgerufen wird und vergleicht diese mit dem übergebenen Fingerabdruck. Bei Übereinstimmung wird der zugehörige SSH-Schlüssel ausgegeben. Beispiel:
$ ./match_ssh-pubkey.sh cd:22:29:38:f7:e2:49:b1:a6:2f:8d:8f:cc:69:d7:c2 RSA-Fingerprint: cd:22:29:38:f7:e2:49:b1:a6:2f:8d:8f:cc:69:d7:c2 Der zugehoerige SSH-Key lautet: 2048 cd:22:29:38:f7:e2:49:b1:a6:2f:8d:8f:cc:69:d7:c2 foo@example.com (RSA) $
In diesem Beispiel gehört der verwendete SSH-Schlüssel dem Benutzer Foo. Auf diese Weise kann ein Audit mit einfachen Mitteln durchgeführt werden.