Posted by ba stey
Cover Image

(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 welchem 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.

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 wurde, 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:

  • Identität des Anfragenden: Wer ist der Nutzer? Wie ist die IP? Welcher Browser wird genutzt? Wie kann ich diesen Nutzer erneut identifizieren? Wie kann ich diesen Nutzer eventuell strafrechtlich verfolgen?
  • Zeitpunkt der Anfrage: Wann genau wurde der Prozess gestartet? Wie lange hat der Nutzer Zeit?

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 diesen Link, kann ein neues Passwort gesetzt werden. Dieses Passwort wird dann entsprechend in der Datenbank gespeichert. Es gibt eine Erfolgsnachricht 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 mit speichern des neuen Passwortes.

Schritt 3: Account einfrieren

Sollte der Prozess irgendwie nicht durch den 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, dieser ist deutlich länger gültig (48 Stunden), kann nun der Account eingefroren werden und ein Administrator nimmt sich nach Notifikation der Sache an.

Der (echte) Nutzer wird nicht nur informiert, mit Glück kann er den Zugangsraub stoppen. Auch denkbar ist, dass ein Angreifer den Prozess ertinitii hat und (ohne Absicht) aus Unkenntnis den Account selber 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 final 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öhe etwas das Sicherheitslevel 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