Zurück

Mnemosyne Wiederholungen mit Login über HTTPS

TL;DR: Ich habe einen HTTPS Reverse-Proxy mit Basic Auth für die Mnemosyne-Fernwiederholung via NGINX eingerichtet.

Inhaltsverzeichnis

Was ist Mnemosyne?

Okay. Vielleicht kennt ihr ja Mnemosyne. Falls nicht, hier ein kurzer Zusammenschnitt: Es ist eine Software, welche Frage-Antwort Paare dem Nutzer in sich steigernden Intervallen präsentiert. Die Intervalle hängen davon ab, wie der Nutzer die eigene Antwort einschätzt.

Diese Einschätzungen (im Weiteren „Wiederholungen“) werden anonymisiert und dem Mnemosyne Forschungsprojekt zur Verfügung gestellt. Sollte man das nicht wollen, kann man das auch abstellen.

Warum benutze ich das?

Für mich kommt Mnemosyne in Frage, da es im Gegensatz zu seinem wesentlich bekannteren Cousin Anki weniger Optionen bietet. Ich möchte mich mit meinen Karten und nur meinen Karten auseinandersetzen und gar nicht erst in die Versuchung kommen, den Algorithmus optimieren zu wollen.

Letztendlich ist der Algorithm SM-2, auf dem die von Mnemosyne und Anki aufbauen, ein Bergsteiger Algorithmus, dessen Eingabe-Daten meine Karten und Wiederholungen sind.

Also anstatt den Algorithmus zu optimieren, sollte ich sorgfältiger meine Wiederholungen angehen. „Garbage in, garbage out“, wie es so schön heißt.

Manch einer wählt auch Mnemosyne, weil es schon länger entwickelt wird, als Anki.

Wiederholungen über den Webbrowser

Mnemosyne hat eine sehr eingeschränkte Fern-Wiederholung, bei der ein HTTP-Server auf dem Port 8513 geöffnet wird. Normalerweise würde ich mit einer eingebauten Funktion oder einer App meiner Wahl einfach die Datenbank zwischen Computer und Handy synchronisieren.

Da F-Droid die Mnemosyne-App aber nicht hat, blieb eigentlich nur noch die Fern-Wiederholung übrig. Das Problem mit der Fernwiederholung steht aber schon oben. HTTP. Nicht HTTPS. Auf einem lokalen Netzwerk weniger kritisch, da aber mein Computer stationär ist und mein Handy nicht, sieht das schon anders aus.

Außerdem keinerlei Anmeldung oder sonstiges. Jeder kann einfach, wenn er den Port kennt, meine Karten für mich machen >:(

Die Lösung

Schnell hatte ich einen fixen Plan mit drei Schritten:

  1. Einen Webserver aufsetzen und eine Weiterleitung zu Mnemosyne einrichten
  2. Eine Anmeldung mit Hilfe von HTTP Basic Auth für diese Weiterleitung einrichten
  3. Die Weiterleitung mit TLS versehen, damit meine Login-Daten nicht gestohlen werden.

Als ich also nach „Reverse Proxy“ (was ich mit Weiterleitung meinte) geschaut habe, kam als erstes NGINX auf, also habe ich das genommen; NGINX flux von den Repos installiert.

Die Weiterleitung

Ich habe die Standard-Konfiguration erst einmal kopiert (danach musst du selbst suchen, die ist von Distro zu Distro anders) und dann nach diesem Guide proxy_pass eingerichtet:

...
location / { 
    proxy_pass  http://localhost:8513; 
}
...

Basic Auth

Dann habe ich mir eine Anmeldung via HTTP Basic Auth mit diesem Guide zusammengeklaubt.

...
location / {
    basic_auth            "Mnemosyne";
    basic_auth_user_file  /pfad/zur/htpasswd;
    proxy_pass            http://localhost:8513;
}
...

Die Syntax für die htpasswd, wo die Nutzer und ihre Passwörter drin steht, kann denkbar einfach sein. nutzername:password kann da schon genügen. Die Passwörter können aber auch gehasht werden. Ich habe das mit openssl passwd gemacht, es gibt aber besser Möglichkeiten.

TLS

Damit HTTPS die einzige Möglichkeit ist, habe ich prompt Port 80 komplett deaktiviert und habe nur noch

listen 443 ssl default_server;
listen [::]:443 ssl default_server;

in meiner Konfiguration. Denn aus irgendeinem Grund scheint mein Browser HTTP lieber zu nehmen, als HTTPS mit einem selbst signierten Zertifikat.

Ich finde leider nicht mehr das Tutorial, das ich ursprünglich genutzt habe, aber dieses hier wird es auch tun. Ich habe einfach ein selbst signiertes Zertifikat mit genau diesem einen Stackoverflow Kommentar gemacht. Bloß ist meine Ablaufdauer ich glaube zehn Jahre lang stattdessen.

Dann diese noch eingebunden:

ssl_certificate /pfad/zu/zertifikat.pem;
ssl_certificate_key /pfad/zu/schluessel.pem;

Und das war’s auch schon. Kein Let’s Encrypt oder sonst eine Zertifikatsauthorität, weil ich eh der einzige Benutzer bin. Mnemosyne unterstützt eh nur einen. Und den einen Fingerabdruck meines eigenen Zertifikats zu überprüfen kriege ich glaube ich noch gebacken.

Und nun?

Wahrscheinlich könnten Profis das um ein Vielfaches besser und ich habe bestimmt irgendwelche Fehler gemacht, welche in Zukunft oder jetzt schon Sicherheitsprobleme bereiten könnten.

Aber: Es ist ausschließlich für mich. Ich bin kein Profi, nur jemand, der Mnemosyne benutzen möchte. Das läuft einfach auf meine Computer, wenn der mal an ist, nicht auf einem Server. Und es ist besser als davor. Ursprünglich hatte Mnemosyne nämlich kein Passwort, kein HTTPS, nichts.

Es geht mir nicht darum, dass mein Passwort da sicher bleibt. Das wird eh irgendein lächerlich langes Passwort wie 9eMbHrWUEDsCwwJQxbvN7Kn8XC3n6U4bHvnwMfzJUGs sein, das ich genau einmal eingebe und dann vom Browser speichern lasse. Es geht mir nicht darum, dass das, was ich da lerne von keinem anderen bis in alle Ewigkeit einsehbar ist.

Es geht mir darum, dass, wenn ich meine Wiederholungen über das Internet mache, nicht wirklich absolut jeder einfach so mir dazwischenfunken kann. Ich will wenigstens ein Modikum Sicherheit haben.

Dass die Fern-Wiederholungen in Mnemosyne wirklich komplett ungesichert sind, ist für mich unverständlich. Selbst die schäbigsten Web-Admin-Interfaces haben ein Login mit admin:admin als Standard.

Ich glaube ehrlich gesagt aber nicht daran, dass die Fernwiederholung jemals Verschlüsselung und Anmeldung bekommt :(

P.S.: Ja, ich weiß. Ein VPN hätte es auch getan, aber wäre das wirklich einfacher gewesen?