osob.de Unicorn Logo
Blogpost overview

Passwort-vergessen absichern | 08.07.2018

(Copyright des Bildes siehe Credits)

Auf fast jeder Plattform, die mit Nutzern arbeitet, gibt es die Funktion des "Passwort vergessen". Mit dieser kann ein neues Passwort gesetzt werden. Vor kurzem habe ich für ein Projekt, bei dem Sicherheit wichtig ist, eine solche Funktion umgesetzt. Dabei habe ich einige Mechanismen eingebaut, die ich vorstellen möchte. Dabei geht es mir primär nur um die Absicherung des Vorgangs.

You like what you find here? A donation helps to keep this project running.

Die Umsetzung eines "Passwort vergessen" kann in drei Schritten passieren.

Schritt 1: Request starten

Sobald der Nutzer das Passwort vergessen hat, kann dieser einen Prozess starten. Dabei wird, in meinem Szenario, zuerst von ihm der Loginschlüssel (quasi Loginname) und die E-Mailadresse verlangt. Wenn diese richtig eingegeben wurden, wird eine E-Mail mit einem Link an die Nutzeradresse verschickt (siehe Schritt 2). Gleichzeitig wird der Vorgang aufgezeichnet. Dabei ist es wichtig zu wissen:

Zu diesem Zeitpunkt wird die Entität des Nutzers nicht angefasst. Es wird also kein Passwort geändert oder im Datenbankeintrag etwas hinzugefügt. Diese Informationen werden in einer extra Tabelle abgelegt. Weiterhin wird nun dafür gesorgt, dass nur ein Prozess je Nutzer-Account bzw. Nutzeridentität gleichzeitig laufen kann. D.h. ich vermeide es, dass der anfragende Nutzer die Funktion missbraucht und viele Nutzer zuspammt. Für die kommenden 30 Minuten hängt die aktuell anfragende Identität also in diesem Prozess fest (einen Identitätswechsel kann ich natürlich nicht vermeiden). Erst nach Ablauf dieser Zeit ist eine neue Abfrage möglich.

Schritt 2: Neues Passwort festlegen

Der Nutzer erhält nun eine E-Mail mit einem Link. Folgt er diesem Link, kann ein neues Passwort gesetzt werden. Dieses Passwort wird dann entsprechend in der Datenbank gespeichert. Es gibt eine Erfolgsmeldung und die Information, dass nun der Login mit dem neuen Passwort möglich ist. Ich verzichte darauf, dass der Nutzer direkt eingeloggt ist. So hat er die Chance, eventuelle Passwort-Manager zu aktualisieren (hängt von der App bzw. dem genutzten Browser ab).

Der Blockeintrag für die Identität wird aus der Datenbank entfernt (er könnte nun für andere Nutzer den Prozess starten, siehe Schritt 1). Auch wird eine E-Mail an die E-Mailadresse geschickt. Dies passiert direkt beim Speichern des neuen Passwortes.

Schritt 3: Account einfrieren

Sollte der Prozess irgendwie nicht vom richtigen Eigentümer ausgeführt worden sein, habe ich nun ein Problem. Der böse Bube ist also im Besitz eines Passwortes und kann alle Dateien ändern. Aus diesem Grund gibt es bei mir in der Information über das geänderte Passwort auch einen Freeze-Link.

Durch diesen Freeze-Link, der deutlich länger gültig ist (48 Stunden), kann nun der Account eingefroren werden und ein Administrator nimmt sich nach Benachrichtigung der Sache an.

Der (echte) Nutzer wird nicht nur informiert, mit Glück kann er den Zugriffsstopp stoppen. Auch denkbar ist, dass ein Angreifer den Prozess initiiert hat und (ohne Absicht) aus Unkenntnis den Account selbst sperrt. Wenn nun der Angreifer als Erstes die E-Mailadresse ändern will - ein Prozess, der länger dauern sollte - hat der echte Nutzer eventuell noch Zeit zum Reagieren.

Natürlich wird auch im letzten Schritt geloggt, welche Identität das Passwort endgültig geändert hat. Auch hier gelten wieder die Aspekte aus Schritt 1 hinsichtlich Rechtssicherheit und Verfahrenseignung.

Fazit

Dieses Modell garantiert keine absolute Sicherheit, ist jedoch einfach umzusetzen und erhöht etwas das Sicherheitsniveau einer Anwendung. Mich interessiert natürlich, welche Strategien andere einsetzen. Ich würde mich über einen Gedankenaustausch freuen.

Credits

Beitragsbild von typographyimages Pixabay. CC0 Creative Commons: Freie kommerzielle Nutzung, kein Bildnachweis nötig