{"id":8321,"date":"2022-01-23T15:44:28","date_gmt":"2022-01-23T13:44:28","guid":{"rendered":"https:\/\/u-labs.de\/portal\/?p=8321"},"modified":"2022-12-12T16:56:03","modified_gmt":"2022-12-12T14:56:03","slug":"ssh-absichern-2-faktor-authentifizierung-auf-dem-raspberry-pi-os-debian-einrichten","status":"publish","type":"post","link":"https:\/\/u-labs.de\/portal\/ssh-absichern-2-faktor-authentifizierung-auf-dem-raspberry-pi-os-debian-einrichten\/","title":{"rendered":"SSH absichern: 2-Faktor Authentifizierung auf dem Raspberry Pi (OS)\/Debian einrichten"},"content":{"rendered":"<p>Immer mehr Dienste bieten 2-Faktor Authentifizierung an, um Zug\u00e4nge zu sch\u00fctzen &#8211; 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.<\/p>\n<h2 class=\"wp-block-heading\" id=\"was-ist-2-faktor-authentifizierung-uberhaupt\">Was ist 2-Faktor Authentifizierung \u00fcberhaupt?<\/h2>\n<p>Klassischerweise authentifiziert man sich mit einem Schl\u00fcssel oder Passwort. Das hat einen gro\u00dfen Nachteil: Ger\u00e4t dieses Kennwort in falsche H\u00e4nde, kann der Angreifer den Zugang beliebig missbrauchen. Mit der 2-Faktor Authentifizierung kommt ein zweiter Faktor dazu. Das Passwort oder der SSH-Schl\u00fcssel ist etwas, das ich wei\u00df. Das kombiniert man z.B. mit etwas, das ich habe, wie eine bestimmte App auf einem Smartphone.<\/p>\n<p>Fast jeder hat schon einmal eine 2-Faktor Authentifizierung genutzt: Wer Beispielsweise Geld abhebt, muss Karte und Pin-Code angeben. Und auch f\u00fcrs Onlinebanking ben\u00f6tigt man neben den Zugangsdaten einen Code, der oft aufs Handy gesendet wird. <\/p>\n<p>Jemand der nur Pin bzw. Password ergaunert hat, kann sich nicht einloggen. Daf\u00fcr braucht der Angreifer Zugriff auf den zweiten Faktor, also etwa eine EC-Karte, dem Handy, TAN-Generator oder einem anderen Ger\u00e4t. Dies ist deutlich schwieriger.<\/p>\n<h2 class=\"wp-block-heading\" id=\"was-benotige-ich-um-ssh-mit-2-faktor-authentifizierung-zu-schutzen\">Was ben\u00f6tige ich, um SSH mit 2-Faktor Authentifizierung zu sch\u00fctzen?<\/h2>\n<p>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\u00fcnstigste Variante besteht in einer Smartphone-App. Sie zeigt uns einen Code an, den wir nach der Anmeldung mit SSH-Schl\u00fcssel bzw. Passwort zus\u00e4tzlich eingeben m\u00fcssen. Ansonsten verweigert der SSH-Server die Verbindung. Vor allem wenn SSH direkt \u00fcbers Internet erreichbar ist, macht das Sinn.<\/p>\n<p>Hierf\u00fcr werden die offenen Standards <strong>HOTP <\/strong>und <strong>TOTP <\/strong>verwendet. Verschiedene Apps binden sie auf dem Smartphone ein: Ich habe <a href=\"https:\/\/freeotp.github.io\/\" title=\"FreeOTP, eine freie und quelloffene App f\u00fcr Android und iOS\" target=\"_blank\" rel=\"nofollow\">FreeOTP genutzt, eine freie und quelloffene App f\u00fcr Android und iOS<\/a>. Sie wird von Red Hat gesponsert, aber leider seit geraumer Zeit nicht mehr aktualisiert. Neben anderen<a href=\"https:\/\/play.google.com\/store\/apps\/details?id=org.shadowice.flocke.andotp&amp;hl=en_US&amp;gl=US\" title=\" Open Source Alternativen wie z.B. andOTP\" target=\"_blank\" rel=\"nofollow\"> Open Source Alternativen wie z.B. andOTP<\/a> gibt es auch propriet\u00e4re Apps von Google. Eine davon wird auf eurem Smartphone ben\u00f6tigt. <\/p>\n<h2 class=\"wp-block-heading\" id=\"vorbereitung-stimmen-die-uhren\">Vorbereitung: Stimmen die Uhren?<\/h2>\n<p>Da jeder Code nur 30 Sekunden lang g\u00fcltig ist, spielt die Uhrzeit eine wichtige Rolle bei dieser Art der 2-Faktor Authentifizierung: Sowohl der Pi als auch euer Handy sollten m\u00f6glichst 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 <em>Uhrzeit<\/em><\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><a href=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2022\/01\/grafik-4.png\"><img loading=\"lazy\" decoding=\"async\" width=\"500\" height=\"178\" src=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2022\/01\/grafik-4.png\" alt=\"\" class=\"wp-image-8324\" srcset=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2022\/01\/grafik-4.png 500w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2022\/01\/grafik-4-300x107.png 300w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2022\/01\/grafik-4-70x25.png 70w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><\/a><\/figure>\n<\/div>\n<p>Dort sollte es einen Schalter geben, um die Synchronisation aus dem Netzwerk zu aktivieren, falls diese nicht bereits eingeschaltet ist:<\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><a href=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2022\/01\/grafik-5.png\"><img loading=\"lazy\" decoding=\"async\" width=\"500\" height=\"275\" src=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2022\/01\/grafik-5.png\" alt=\"\" class=\"wp-image-8325\" srcset=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2022\/01\/grafik-5.png 500w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2022\/01\/grafik-5-300x165.png 300w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2022\/01\/grafik-5-70x39.png 70w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><\/a><\/figure>\n<\/div>\n<p>Auf dem Raspberry Pi l\u00e4sst sich die Zeit mit dem Befehl <strong>date<\/strong> pr\u00fcfen. Hier sollte eure lokale Zeit erscheinen:<\/p>\n<div class=\"wp-block-syntaxhighlighter-code \">\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\n$ date\nSun 23 Jan 11:39:10 CET 2022\n<\/pre>\n<\/div>\n<p>Standardm\u00e4\u00dfig gleicht das Raspberry Pi OS die Zeit mit einem Zeitserver von Debian ab &#8211; das ist notwendig, da der Pi im Gegensatz zu X86 PCs\/Laptops keine Hardwareuhr besitzt und daher auf eine externe Quelle f\u00fcr die exakte Uhrzeit angewiesen ist. <\/p>\n<p>Allerdings kann es dennoch sein, dass die angezeigte Uhrzeit aufgrund einer falschen Zeitzone nicht stimmt. Standardm\u00e4\u00dfig nutzt das Raspberry Pi OS n\u00e4mlich Gro\u00dfbritannien als Zeitzone, dort gibt es im Vergleich zur Deutschen Winterzeit eine Stunde Versatz. <a href=\"https:\/\/u-labs.de\/portal\/raspberry-pi-uhrzeit-stimmt-nicht-so-korrigierst-du-die-zeitzone\/\" title=\"Die Zeitzone l\u00e4sst sich \u00fcber raspi-config anpassen, wie ich in diesem Beitrag bereits gezeigt hatte.\">Die Zeitzone l\u00e4sst sich \u00fcber raspi-config anpassen, wie ich in diesem Beitrag bereits gezeigt hatte.<\/a><\/p>\n<h2 class=\"wp-block-heading\" id=\"wie-richte-ich-2-faktor-authentifizierung-auf-dem-raspberry-pi-ein\">Wie richte ich 2-Faktor Authentifizierung auf dem Raspberry Pi ein?<\/h2>\n<p>Anschlie\u00dfend 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\u00fcgbar.<\/p>\n<div class=\"wp-block-syntaxhighlighter-code \">\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nsudo apt-get install libpam-google-authenticator\n<\/pre>\n<\/div>\n<p>Andere Distributionen haben eigene Namen f\u00fcr das Paket, CentOS nennt es etwa nur <strong>google-authenticator<\/strong>. Nach der Installation starten wir das Programm zur Ersteinrichtung:<\/p>\n<div class=\"wp-block-syntaxhighlighter-code \">\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\ngoogle-authenticator\n<\/pre>\n<\/div>\n<p><strong>Hinweis<\/strong>: Die Konfiguration ist f\u00fcr den Nutzer g\u00fcltig, mit dem der Befehl ausgef\u00fchrt wird. Nur dieses Konto kann sich dadurch mit 2FA anmelden. Du solltest daher <strong>kein sudo<\/strong> verwenden, au\u00dfer du m\u00f6chtest 2FA f\u00fcr 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\u00fcr jedes Konto einrichten oder per z.B. <strong>su<\/strong> zu einem anderen Konto wechseln.<\/p>\n<p>Die erste Frage <em><strong>Do you want authentication tokens to be time-based (y\/n)<\/strong><\/em> empfiehlt sich, mit y f\u00fcr Ja zu beantworten. Das erh\u00f6ht die Sicherheit, da die Codes nur begrenzt g\u00fcltig sind. Anschlie\u00dfend \u00f6ffnet 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\u00dfend darauf, dann erscheint ein Ziffercode. Gebt diesen vor Ablauf der G\u00fcltigkeit (links) in die Konsole ein.<\/p>\n<p>Auf der Konsole sind mehrere &#8222;emergency scratch codes&#8220; zu sehen. Damit k\u00f6nnt 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\u00dfend beantwortet ihr die Frage, ob die Authenticator Konfigurationsdatei aktualisiert werden soll, mit <strong>y<\/strong> f\u00fcr Ja.<\/p>\n<p>Die n\u00e4chste Frage des Assistenten lautet: <em><strong>Do you want to disallow multiple uses of the same authentication token?<\/strong><\/em> Auch dies empfiehlt sich, aus Sicherheitsgr\u00fcnden mit <strong>y<\/strong> zu beantworten. Die Limitierung auf einen Login alle 30 Sekunden sollte in der Regel kein Problem darstellen.<\/p>\n<div style=\"background-color: orange;color:white; padding: 10px; font-weight:bold\">\nHinweis: Im Video wurde an dieser Stelle f\u00e4lschlicherweise &#8222;n&#8220; angegeben. Korrekt ist die Erkl\u00e4rung an dieser Stelle: Mit &#8222;n&#8220; deaktiviert man die mehrfache Verwendung eines Codes und erh\u00f6ht somit die Sicherheit. &#8222;y&#8220; w\u00fcrde es dagegen erlauben, einen Code mehrmals zu nutzen.\n<\/div>\n<p>Nun geht es darum, wie viele abgelaufene Codes erlaubt sind. Am sichersten ist es, nur 3 (das aktuelle und jeweils eines davor\/danach) zuzulassen &#8211; das wird durch die Eingabe von <strong>n<\/strong> eingestellt. Daf\u00fcr m\u00fcssen die Uhren aber genau gestellt sein (am besten per NTP auf dem Pi), da somit nur Zeitabweichungen von maximal 30 Sekunden m\u00f6glich sind. Man kann dies aber auch mit <strong>y<\/strong> auf 17 Codes (8 vorherige, das aktuelle und 8 zuk\u00fcnftige) erweitern. In diesem Falle sind Zeitabweichungen von bis zu 4 Minuten kein Problem. <\/p>\n<p>Mit <em><strong>Do you want to enable rate-limiting?<\/strong><\/em> kann man die Anmeldeversuche auf 3 St\u00fcck pro 30 Sekunden limitieren. Das ist sicherheitstechnisch sinnvoll und w\u00fcrde ich mit <strong>y <\/strong>aktivieren.<\/p>\n<p>Damit ist die Konfiguration der Erweiterung abgeschlossen. Damit sie auch genutzt wird, m\u00fcssen wir sie noch im Authentifizierungsmodul aktivieren. Dazu die Datei <strong>\/etc\/pam.d\/sshd <\/strong>mit einem Texteditor (z.B. vim, nano) \u00f6ffnen:<\/p>\n<div class=\"wp-block-syntaxhighlighter-code \">\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nsudo vim \/etc\/pam.d\/sshd\n<\/pre>\n<\/div>\n<p>und folgende Zeile an das Ende anf\u00fcgen:<\/p>\n<div class=\"wp-block-syntaxhighlighter-code \">\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nauth required pam_google_authenticator.so\n<\/pre>\n<\/div>\n<p>Sie erzwingt die Verwendung von 2FA im Authentifigierungsmodul. Damit SSH darauf zur\u00fcckgreift, \u00f6ffnen wir anschlie\u00dfend die Konfigurationsdatei des SSH-Servers:<\/p>\n<div class=\"wp-block-syntaxhighlighter-code \">\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nsudo vim \/etc\/ssh\/sshd_config\n<\/pre>\n<\/div>\n<p>Darin nach dem Eintrag <strong>ChallengeResponseAuthentication <\/strong>suchen und diesen vom Standardwert <strong>no<\/strong> auf <strong>yes<\/strong> stellen. Die \u00c4nderungen werden nach einem Neustart des Dienstes vom SSH-Server wirksam:<\/p>\n<div class=\"wp-block-syntaxhighlighter-code \">\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nsudo systemctl restart sshd\n<\/pre>\n<\/div>\n<h2 class=\"wp-block-heading\" id=\"testen-der-2-faktor-authentifizierung\">Testen der 2-Faktor Authentifizierung<\/h2>\n<p>Ihr solltet die noch offene SSH-Sitzung <strong>NICHT <\/strong>schlie\u00dfen! Falls aus irgend einem Grund der Login nicht funktionieren sollte, kann man die bestehende Sitzung verwenden, um das Problem zu suchen und zu l\u00f6sen. \u00d6ffnet daher eine <strong>neue <\/strong>SSH-Verbindung und teste zun\u00e4chst, ob der Login funktioniert.<\/p>\n<p>Hat alles geklappt, solltest du zuerst nach dem SSH-Passwort (1) gefragt werden. Bevor eine Konsolen-Sitzung ge\u00f6ffnet wird, folgt der Verifizierungscode (2). Um diesen zu erhalten, die App \u00f6ffnen 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\u00e4tigen mit &lt;Enter&gt; hast du eine normale SSH-Sitzung:<\/p>\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2022\/01\/grafik-6.png\"><img loading=\"lazy\" decoding=\"async\" width=\"828\" height=\"268\" src=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2022\/01\/grafik-6.png\" alt=\"\" class=\"wp-image-8326\" srcset=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2022\/01\/grafik-6.png 828w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2022\/01\/grafik-6-300x97.png 300w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2022\/01\/grafik-6-768x249.png 768w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2022\/01\/grafik-6-70x23.png 70w\" sizes=\"auto, (max-width: 828px) 100vw, 828px\" \/><\/a><\/figure>\n<p>Selbst wenn jemand im Besitz des SSH-Passwortes oder Schl\u00fcssels ist, kann er sich nicht anmelden &#8211; ihm fehlt ja der Best\u00e4tigungscode aus dem zweiten Schritt.<\/p>\n<p>Falls du SSH-Schl\u00fcssel verwendest oder das Passwort gespeichert hast, entf\u00e4llt der erste Schritt m\u00f6glicherweise und du wirst nur nach dem Best\u00e4tigungscode gefragt. Ob du Password oder 2-Faktor Code eingeben musst, erkennst du am Anfang der Zeile: Beim SSH-Passwort steht dort nur &#8222;Password&#8220;, wogegen im Falle des 2-Faktor Codes aus der App nach &#8222;Verification code&#8220; gefragt wird.<\/p>\n<h2 class=\"wp-block-heading\" id=\"2-faktor-anmeldung-funktioniert-nicht-dafur-gibt-es-die-emergency-scratch-codes\">2-Faktor Anmeldung funktioniert nicht? Daf\u00fcr gibt es die &#8222;Emergency scratch codes&#8220;!<\/h2>\n<p>Wenn die Einrichtung funktioniert hat, wirst du in aller Regel einfach einen Code aus der App eingeben und dich anmelden k\u00f6nnen. In Ausnahmesituationen ist das aber vielleicht nicht m\u00f6glich: Beispielsweise, wenn das Handy vergessen oder verloren wurde. Vor allem der letztere Fall ist ein gro\u00dfes Problem. Erh\u00e4lt man das Ger\u00e4t nicht zur\u00fcck, ist ein Login dauerhaft nicht m\u00f6glich. Au\u00dferdem besteht Missbrauchsgefahr. Zwar fehlt einem Angreifer noch das Passwort, aber mit dem Ger\u00e4t besitzt er bereits einen ersten Teil.<\/p>\n<p>Hierf\u00fcr helfen die zuvor generierten <strong>Emergency scratch codes<\/strong>: Sie sind im Grunde Einweg-Codes, die dauerhaft g\u00fcltig sind, aber jeweils nur einmal verwendet werden k\u00f6nnen. Daher gibt es gleich f\u00fcnf St\u00fcck davon. Habt ihr keinen Zugriff auf euer Ger\u00e4t, k\u00f6nnt ihr euch mit den Notfallcodes ohne Handy anmelden &#8211; und anschlie\u00dfend entweder ein neues Ger\u00e4t einrichten, oder als tempor\u00e4re Ma\u00dfnahme die 2-Faktor Authentifizierung abschalten.<\/p>\n<p>Auch oder gerade weil das seltene Ausnahmef\u00e4lle 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\u00e4t nicht physisch erreichbar hat, ist das ein gro\u00dfes Problem. Daher sollten die Codes sicher aufbewahrt werden, aber dennoch im Notfall zeitnah griffbereit.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Immer mehr Dienste bieten 2-Faktor Authentifizierung an, um Zug\u00e4nge zu sch\u00fctzen &#8211; 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 &#8230;<\/p>\n","protected":false},"author":5,"featured_media":8328,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[671],"tags":[56,781],"class_list":["post-8321","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-raspberry-pi","tag-sicherheit","tag-ssh"],"_links":{"self":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/8321","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/comments?post=8321"}],"version-history":[{"count":7,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/8321\/revisions"}],"predecessor-version":[{"id":9786,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/8321\/revisions\/9786"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/media\/8328"}],"wp:attachment":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/media?parent=8321"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/categories?post=8321"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/tags?post=8321"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}