SSH absichern: 2-Faktor Authentifizierung auf dem Raspberry Pi (OS)/Debian einrichten

Als Video ansehen
Bereitgestellt über YouTube

SSH absichern: 2-Faktor Authentifizierung auf dem Raspberry Pi (OS)/Debian einrichten

Immer mehr Dienste bieten 2-Faktor Authentifizierung an, um Zugänge zu schützen – Google, GitHub, Twitter und Steam sind nur einige Beispiele von vielen. Wir schauen uns heute an, wie 2-Faktor funktioniert und wie du es auf deinem Raspberry Pi oder auch jedem anderen Debian-System einrichten kannst, um den SSH-Zugang damit abzusichern.

Was ist 2-Faktor Authentifizierung überhaupt?

Klassischerweise authentifiziert man sich mit einem Schlüssel oder Passwort. Das hat einen großen Nachteil: Gerät dieses Kennwort in falsche Hände, kann der Angreifer den Zugang beliebig missbrauchen. Mit der 2-Faktor Authentifizierung kommt ein zweiter Faktor dazu. Das Passwort oder der SSH-Schlüssel ist etwas, das ich weiß. Das kombiniert man z.B. mit etwas, das ich habe, wie eine bestimmte App auf einem Smartphone.

Fast jeder hat schon einmal eine 2-Faktor Authentifizierung genutzt: Wer Beispielsweise Geld abhebt, muss Karte und Pin-Code angeben. Und auch fürs Onlinebanking benötigt man neben den Zugangsdaten einen Code, der oft aufs Handy gesendet wird.

Jemand der nur Pin bzw. Password ergaunert hat, kann sich nicht einloggen. Dafür braucht der Angreifer Zugriff auf den zweiten Faktor, also etwa eine EC-Karte, dem Handy, TAN-Generator oder einem anderen Gerät. Dies ist deutlich schwieriger.

Was benötige ich, um SSH mit 2-Faktor Authentifizierung zu schützen?

Es macht daher Sinn, auch einen SSH-Zugang mit einem zweiten Faktor abzusichern. Hier gibt es verschiedene Methoden. Etwa ein Yubikey, der an den USB-Anschluss angesteckt werden muss und die Anmeldung freigibt. Die einfachste und günstigste Variante besteht in einer Smartphone-App. Sie zeigt uns einen Code an, den wir nach der Anmeldung mit SSH-Schlüssel bzw. Passwort zusätzlich eingeben müssen. Ansonsten verweigert der SSH-Server die Verbindung. Vor allem wenn SSH direkt übers Internet erreichbar ist, macht das Sinn.

Hierfür werden die offenen Standards HOTP und TOTP verwendet. Verschiedene Apps binden sie auf dem Smartphone ein: Ich habe FreeOTP genutzt, eine freie und quelloffene App für Android und iOS. Sie wird von Red Hat gesponsert, aber leider seit geraumer Zeit nicht mehr aktualisiert. Neben anderen Open Source Alternativen wie z.B. andOTP gibt es auch proprietäre Apps von Google. Eine davon wird auf eurem Smartphone benötigt.

Vorbereitung: Stimmen die Uhren?

Da jeder Code nur 30 Sekunden lang gültig ist, spielt die Uhrzeit eine wichtige Rolle bei dieser Art der 2-Faktor Authentifizierung: Sowohl der Pi als auch euer Handy sollten möglichst die gleiche, genaue Uhrzeit verwenden. Beim Handy erreicht ihr das in der Regel mit der Zeit aus dem Mobilfunknetz. Um sicherzustellen, dass dieser Abgleich aktiviert ist, sucht in den Einstellungen nach Uhrzeit

Dort sollte es einen Schalter geben, um die Synchronisation aus dem Netzwerk zu aktivieren, falls diese nicht bereits eingeschaltet ist:

Auf dem Raspberry Pi lässt sich die Zeit mit dem Befehl date prüfen. Hier sollte eure lokale Zeit erscheinen:

$ date
Sun 23 Jan 11:39:10 CET 2022

Standardmäßig gleicht das Raspberry Pi OS die Zeit mit einem Zeitserver von Debian ab – das ist notwendig, da der Pi im Gegensatz zu X86 PCs/Laptops keine Hardwareuhr besitzt und daher auf eine externe Quelle für die exakte Uhrzeit angewiesen ist.

Allerdings kann es dennoch sein, dass die angezeigte Uhrzeit aufgrund einer falschen Zeitzone nicht stimmt. Standardmäßig nutzt das Raspberry Pi OS nämlich Großbritannien als Zeitzone, dort gibt es im Vergleich zur Deutschen Winterzeit eine Stunde Versatz. Die Zeitzone lässt sich über raspi-config anpassen, wie ich in diesem Beitrag bereits gezeigt hatte.

Wie richte ich 2-Faktor Authentifizierung auf dem Raspberry Pi ein?

Anschließend folgt die wichtigste Komponente: Ein Modul, welches die 2-Faktor Anmeldung in den SSH-Server integriert. Dies stammt von Google, ist aber quelloffen auf GitHub verfügbar.

sudo apt-get install libpam-google-authenticator

Andere Distributionen haben eigene Namen für das Paket, CentOS nennt es etwa nur google-authenticator. Nach der Installation starten wir das Programm zur Ersteinrichtung:

google-authenticator

Hinweis: Die Konfiguration ist für den Nutzer gültig, mit dem der Befehl ausgeführt wird. Nur dieses Konto kann sich dadurch mit 2FA anmelden. Du solltest daher kein sudo verwenden, außer du möchtest 2FA für den root-Account einrichten. Davon ist generell abzuraten und ein normaler, nicht privilegiertes Konto zu bevorzugen. Falls du mehrere Konten verwendest, musst du also den Authenticator für jedes Konto einrichten oder per z.B. su zu einem anderen Konto wechseln.

Die erste Frage Do you want authentication tokens to be time-based (y/n) empfiehlt sich, mit y für Ja zu beantworten. Das erhöht die Sicherheit, da die Codes nur begrenzt gültig sind. Anschließend öffnet ihr die App (z.B. andOTP, FreeOTP oder eine andere) und sucht nach einem QR-Code Knopf. Scannt damit den QR Code, der euch auf der Konsole angezeigt wird. Dadurch erscheint ein neuer Eintrag in der App. Tippt anschließend darauf, dann erscheint ein Ziffercode. Gebt diesen vor Ablauf der Gültigkeit (links) in die Konsole ein.

Auf der Konsole sind mehrere „emergency scratch codes“ zu sehen. Damit könnt ihr die 2-Faktor Authentifizierung umgehen, falls z.B. euer Handy kaputt oder verloren geht. Bewahrt sie an einem sicheren Ort auf, etwa im Passwortsafe. Anschließend beantwortet ihr die Frage, ob die Authenticator Konfigurationsdatei aktualisiert werden soll, mit y für Ja.

Die nächste Frage des Assistenten lautet: Do you want to disallow multiple uses of the same authentication token? Auch dies empfiehlt sich, aus Sicherheitsgründen mit y zu beantworten. Die Limitierung auf einen Login alle 30 Sekunden sollte in der Regel kein Problem darstellen.

Hinweis: Im Video wurde an dieser Stelle fälschlicherweise „n“ angegeben. Korrekt ist die Erklärung an dieser Stelle: Mit „n“ deaktiviert man die mehrfache Verwendung eines Codes und erhöht somit die Sicherheit. „y“ würde es dagegen erlauben, einen Code mehrmals zu nutzen.

Nun geht es darum, wie viele abgelaufene Codes erlaubt sind. Am sichersten ist es, nur 3 (das aktuelle und jeweils eines davor/danach) zuzulassen – das wird durch die Eingabe von n eingestellt. Dafür müssen die Uhren aber genau gestellt sein (am besten per NTP auf dem Pi), da somit nur Zeitabweichungen von maximal 30 Sekunden möglich sind. Man kann dies aber auch mit y auf 17 Codes (8 vorherige, das aktuelle und 8 zukünftige) erweitern. In diesem Falle sind Zeitabweichungen von bis zu 4 Minuten kein Problem.

Mit Do you want to enable rate-limiting? kann man die Anmeldeversuche auf 3 Stück pro 30 Sekunden limitieren. Das ist sicherheitstechnisch sinnvoll und würde ich mit y aktivieren.

Damit ist die Konfiguration der Erweiterung abgeschlossen. Damit sie auch genutzt wird, müssen wir sie noch im Authentifizierungsmodul aktivieren. Dazu die Datei /etc/pam.d/sshd mit einem Texteditor (z.B. vim, nano) öffnen:

sudo vim /etc/pam.d/sshd

und folgende Zeile an das Ende anfügen:

auth required pam_google_authenticator.so

Sie erzwingt die Verwendung von 2FA im Authentifigierungsmodul. Damit SSH darauf zurückgreift, öffnen wir anschließend die Konfigurationsdatei des SSH-Servers:

sudo vim /etc/ssh/sshd_config

Darin nach dem Eintrag ChallengeResponseAuthentication suchen und diesen vom Standardwert no auf yes stellen. Die Änderungen werden nach einem Neustart des Dienstes vom SSH-Server wirksam:

sudo systemctl restart sshd

Testen der 2-Faktor Authentifizierung

Ihr solltet die noch offene SSH-Sitzung NICHT schließen! Falls aus irgend einem Grund der Login nicht funktionieren sollte, kann man die bestehende Sitzung verwenden, um das Problem zu suchen und zu lösen. Öffnet daher eine neue SSH-Verbindung und teste zunächst, ob der Login funktioniert.

Hat alles geklappt, solltest du zuerst nach dem SSH-Passwort (1) gefragt werden. Bevor eine Konsolen-Sitzung geöffnet wird, folgt der Verifizierungscode (2). Um diesen zu erhalten, die App öffnen und den automatisch erstellten Eintrag antippen. Die Uhr an der Seite zeigt an, wie viel Zeit dir noch bleibt, um den Code einzugeben. Nach dem Bestätigen mit <Enter> hast du eine normale SSH-Sitzung:

Selbst wenn jemand im Besitz des SSH-Passwortes oder Schlüssels ist, kann er sich nicht anmelden – ihm fehlt ja der Bestätigungscode aus dem zweiten Schritt.

Falls du SSH-Schlüssel verwendest oder das Passwort gespeichert hast, entfällt der erste Schritt möglicherweise und du wirst nur nach dem Bestätigungscode gefragt. Ob du Password oder 2-Faktor Code eingeben musst, erkennst du am Anfang der Zeile: Beim SSH-Passwort steht dort nur „Password“, wogegen im Falle des 2-Faktor Codes aus der App nach „Verification code“ gefragt wird.

2-Faktor Anmeldung funktioniert nicht? Dafür gibt es die „Emergency scratch codes“!

Wenn die Einrichtung funktioniert hat, wirst du in aller Regel einfach einen Code aus der App eingeben und dich anmelden können. In Ausnahmesituationen ist das aber vielleicht nicht möglich: Beispielsweise, wenn das Handy vergessen oder verloren wurde. Vor allem der letztere Fall ist ein großes Problem. Erhält man das Gerät nicht zurück, ist ein Login dauerhaft nicht möglich. Außerdem besteht Missbrauchsgefahr. Zwar fehlt einem Angreifer noch das Passwort, aber mit dem Gerät besitzt er bereits einen ersten Teil.

Hierfür helfen die zuvor generierten Emergency scratch codes: Sie sind im Grunde Einweg-Codes, die dauerhaft gültig sind, aber jeweils nur einmal verwendet werden können. Daher gibt es gleich fünf Stück davon. Habt ihr keinen Zugriff auf euer Gerät, könnt ihr euch mit den Notfallcodes ohne Handy anmelden – und anschließend entweder ein neues Gerät einrichten, oder als temporäre Maßnahme die 2-Faktor Authentifizierung abschalten.

Auch oder gerade weil das seltene Ausnahmefälle sind, die vielleicht nie vorkommen, sollte man dies im Hinterkopf behalten und vorbereitet sein. Wer weder Handy noch Notfallcode besitzt, kann den SSH-Zugang nicht mehr ohne weiteres nutzen. Vor allem wenn man das Gerät nicht physisch erreichbar hat, ist das ein großes Problem. Daher sollten die Codes sicher aufbewahrt werden, aber dennoch im Notfall zeitnah griffbereit.

Leave a Reply