Safety

Reverse Proxy mit HTTPS und Authentifizierung einrichten

Im vorherigen Artikel Sicherheit erhöhen – Raspberry Pi mit SSH-Schlüssel absichern habe ich beschrieben, wie man den Zugang zum Betriebssystem des Raspberry Pi mittels SSH-Key absichern kann. In diesem Artikel soll es nun darum gehen, die FHEM-Webseite nur noch über eine gesicherte Verbindung (HTTPS) und nur noch für ausgewählte Nutzer zugänglich zu machen, damit der Raspberry Pi ins Internet gestellt werden kann, ohne sich Sorgen machen zu müssen, dass ungebetene Gäste Zugriff darauf haben.

Da der Raspberry Pi nicht gerade mit viel Rechenleistung ausgestattet ist, sollten die darauf laufenden Programme möglichst leichtgewichtig sein. Für die Einrichtung eines Reverse Proxy benötigt man einen Webserver. Weit verbreitet in der Linux-Welt ist der Webserver Apache. Allerdings ist er inzwischen auch ein ziemliches Monster geworden, was seinen Ressourcenbedarf angeht. Deshalb empfehle und nutze ich hier als Alternative den nicht so ressourcenhungrigen Webserver Nginx (ausgesprochen Engine X).

Installation von Nginx als Reverse Proxy

Vor einer Installation ist es immer gut, das zugrundeliegende Betriebssystem Raspbian auf den neuesten Stand zu bringen und alle Updates/Upgrades zu installieren:

Danach wird Nginx installiert:

Danach legen wir im Pfad /etc/nginx/sites-available eine neue Proxy Konfiguration an:

und füllen die neu angelegte Datei reverse-proxy mit folgendem Inhalt:

Mit dieser Konfiguration werden zwei Serverinstanzen angelegt. Eine auf Port 80 (HTTP – also unverschlüsselt) und eine auf Port 443 (HTTPS – mit TLS abgesichert). Kommt eine Anfrage auf Port 80 herein, wird dieser mitgeteilt, dass der Dienst dauerhaft umgezogen ist (Fehler 301) und sofort auf die verschlüsselte Verbindung auf Port 443 umgeleitet. Die Zertifikate für die TLS-Verschlüsselung werden im Verzeichnis /etc/nginx erwartet.

Nutzer mit Zugriffsberechtigung anlegen

Als nächstes müssen wir mindestens einen Nutzer anlegen, der die Zugriffsberechtigung bekommen soll. Zum Beispiel würde der Nutzer ErikaMustermann folgendermaßen angelegt werden:

Mit folgendem Befehl wird der Passwort-Prompt aufgerufen und nach Eingabe des sich ausgedachten Passworts verschlüsselt in die Datei .htpasswd geschrieben:

Allerdings ist das Passwort dann nur mit dem heutzutage als unsicher geltenden Hash-Algorithmus MD5 gehashed. Zyniker sagen zu MD5, es ist nur noch für Dekorationszwecke zu gebrauchen, aber nicht mehr zur Absicherung von Daten. Besser ist es, einen nach heutigen Gesichtspunkten sicheren Hash-Algorithmus wie beispielsweise SHA512 zu nutzen.

Passwörter die mit SHA512 gehasht werden sollen, können mit dem Befehl mkpasswd erstellt werden. Damit wir die Funktion mkpasswd nutzen können, muss diese erst einmal installiert werden. Sie befindet sich im Paket whois. Wir installieren also:

Nach der Installation kann durch folgenden Aufruf ein SHA512-Passworthash erzeugt werden:

Der Passworthash kann dann in die Datei .htpasswd in folgender Form übernommen werden:

ErikaMustermann:$6$5kMj4sGCM$.st6U8U/8OS5IBHp0pbaFxXQ/xcnh9xpe/KiroDck3EN1ddwG1RaL4gxQ878ZyF.h3062IrMeqq4KDKriPS6H1

Also Aufruf der Datei .htpasswd im Editor nano:

und Einfügen bzw. Ersetzen des bisherigen Eintrags mit dem eben erzeugten Hash. Der Nutzername mit abschließendem Doppelpunkt muss natürlich vor dem Hash stehen bleiben.

Die Nutzung von SHA512 statt MD5 oder SHA1 erhöht den Schutz vor sogenannten Kollisionsangriffen. Der Schutz vor Wörterbuch- und Brute-Force-Angriffen wird dadurch nicht erhöht. Darum müssen wir uns also später noch kümmern.

DynDNS-Dienst erstellen und einrichten

Um eine Webseite im Internet über den Browser aufzurufen, kann man in der Adresszeile entweder die öffentliche IP-Adresse oder den zugehörigen Domainnamen eingeben. Für heise.de ist zum Beispiel die (feste) IP-Adresse 193.99.144.80 vergeben. Ruft man diese IP im Browser auf (und ignoriert die Fehlermeldungen), dann landet man auf der Seite heise.de. Zugegeben – die Eingabe und vor allem das Merken einer IP-Adresse ist ungleich schwerer als einen einprägsamen Domainnamen zu nutzen. Zusätzlich kommt erschwerend hinzu, dass sich die IP-Adresse bei den meisten Privatleuten täglich ändert. Wenn wir nun auf unsere FHEM-Webseite zugreifen wollen, benötigen wir die aktuell gültige öffentliche IP-Adresse. Woher bekommen wir die? Verantwortlich für die Übersetzung der IP-Adresse in einen für das menschliche Gehirn viel besser merkbaren Namen ist im Internet das Domain Name System (DNS). Und zum Glück gibt es sogenannte DynDNS-Dienste, die die Übersetzung der aktuellen IP-Adresse in einen schönen Namen anbieten. Einige sind sogar kostenlos. Da wären beispielsweise die Dienste

Wenn man sich bei solch einem Dienst registriert, bekommt man die Möglichkeit, auf seinem Router eine Update-URL einzutragen, die bei jeder Neueinwahl des Routers (was üblicherweise einmal nachts automatisch passiert) automatisch aufgerufen wird, und dem DynDNS-Dienst die aktuelle IP-Adresse mitteilt. Damit ist der beim DynDNS-Anbieter gewählte Domainname innerhalb weniger Sekunden mit der neuen IP-Adresse aktualisiert. Es genügt dann, im Browser den einmal gewählten Domainnamen einzugeben und man wird immer auf die aktuelle IP-Adresse verbunden. Bevor es zum nächsten Schritt der Zertifikatserstellung geht, sollten wir jetzt also einen DynDNS-Dienst unserer Wahl aussuchen (siehe obige kurze Liste, oder man sucht sich einen anderen) und dort einen Domainnamen registrieren.

Router konfigurieren

OK – wenn jetzt hier weiter gelesen wird, gehe ich davon aus, das man sich für einen DynDNS-Dienst entschieden und dort registriert hat. Ein Domainname wie meine_domain.ddns.de oder ähnliches existiert nun also!? Dieses Namen benötigen wir nämlich gleich.

Damit unser Webserver auch vom Internet erreichbar ist, müssen wir in unserem Router noch ein oder gar zwei Weiterleitungsregeln einrichten. Da das abhängig vom Router ist und es da viele verschiedene gibt, kann ich das hier nur exemplarisch vorstellen.

Port-Weiterleitungsregeln:

  • externer Port 80 – weiterleiten auf Raspberry Pi Port 80
  • externer Port 443 – weiterleiten auf Raspberry Pi Port 443

Und da wir gerade dabei sind, sollten wir auch gleich den DynDNS-Dienst einrichten. Dazu gibt es üblicherweise auf den Seiten des DynDNS-Anbieters Anleitungen, wie das in der verschiedenen Routern zu machen ist.

Zertifikatserstellung

Erst durch Zertifikate ist eine verschlüsselte Kommunikation zwischen einem Browser und einem Webserver (in unserem Fall nginx) möglich. Damit nicht jedem Zertifikat vertraut wird, gibt es das Konzept der Zertifizierungsstellen (engl. Certificate Authorities [CA]). Bei solchen Zertifizierungsstellen kann man sich ein TLS-Zertifikat (üblicherweise gegen Gebühren) erstellen lassen. Seit Ende 2015 bietet Let’s Encrypt auch kostenlose Zertifikate an, die von allen gängigen Browsern akzeptiert werden. Allerdings ist es ein wenig Aufwand, diese Zertifikate zu erstellen und regelmäßig zu erneuern (die Zertifikate von Let’s Encrypt sind nur 90 Tage gültig). Da die FHEM-Webseite nur für einige wenige Personen zugänglich werden soll, reicht es in diesem Fall völlig aus, sich selbst ein Zertifikat zu erzeugen. Der Browser wird dann zwar beim Aufruf eine Warnung anzeigen, das diesem Zertifikat nicht vertraut wird, da wir aber wissen, dass wir es eben selbst erzeugt haben, können wir getrost eine Ausnahmeregel im Browser hinterlegen und werden die Warnung beim nächsten Aufruf nicht mehr angezeigt bekommen.

Um ein selbst signiertes Zertifikat mit 10 Jahren Gültigkeit zu erstellen geben wir ein:

Dabei werden bei der Erstellung ein paar Angaben abgefragt. Wichtig ist dabei vor allem der Common Name, der identisch mit der später verwendeten Domain (oder der öffentlichen IP-Adresse) sein muss.

Damit die in nginx gemachten Änderungen und das Zertifikat übernommen werden, muss nginx neu gestartet werden:

Anschließend sollte die FHEM-Webseite durch folgende Eingabe im Browser

bzw. auch nur

auf https://meine_domain umgeleitet werden und eine Abfrage nach Nutzername und Passwort erscheinen.

Gibt man nun hier bei Nutzername ErikaMustermann (oder falls ihr einen anderen Namen gewählt haben solltet, dann diesen Namen 😉 ) und das zugehörige Passwort ein, dann sollte sich die FHEM-Webseite wie gewohnt öffnen.

Wenn man hier ein sicheres Passwort* vergeben hat,  spricht erst mal nichts dagegen, den Rasperry Pi mit dieser Konfiguration im Internet zugänglich zu machen. Wenn man sich dennoch Sorgen vor automatischen Einbruchsversuchen macht, kann man in einem weiteren Schritt auch noch eine Software installieren, die nach bestimmten Kriterien (zum Beispiel x Fehleingaben bei Nutzername und Passwort) die anfragende IP-Adresse für eine bestimmte Zeit von weiteren Zugriffen sperrt. Aber das ist dann schon wieder ein Thema für einen separaten Artikel mit dem Titel Sicherheit erhöhen – fail2ban installieren und einrichten.

*Ein sicheres Passwort besteht heutzutage aus wenigstens 10 Zeichen, enthält Groß- und Kleinbuchstaben, Sonderzeichen und Zahlen und beinhaltet kein Wort, das in einem Wörterbuch zu finden ist. So etwas ist schwierig zu merken? Aber zum Beispiel der Satz: Sichere Passwörter sollten mindestens 10 Zeichen lang sein und Sonderzeichen enthalten! sollte doch zu merken sein.  Das daraus erzeugte Passwort SPsm10ZlsuSe! enthält sogar 13 Zeichen und erfüllt auch sonst alle Kriterien. Allerdings ist es jetzt auf dieser Webseite zu finden – wir sollten also ein anderes wählen! 😉

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.