it-swarm.com.de

Passwortlose Authentifizierung - wie und wann ein Anmeldecode ungültig gemacht werden soll

Unser System verwendet die kennwortlose Anmeldung, um dem Benutzer einen Anmeldecode + Link per E-Mail zu senden, über den er sich anmelden kann.

Wir haben festgestellt, dass einer unserer Kunden einen Mail-Scanner hat, der diesen Links tatsächlich folgt. Wir machen die verwendeten Anmeldecodes ungültig, um die Angriffsfläche für einen Angreifer zu verringern. Aber jetzt haben solche E-Mails keinen gültigen Login-Link mehr.

Hierfür scheint es zwei Lösungen zu geben:

  • Geben Sie keinen Anmeldelink an, sondern nur einen Code in der Nachricht.
  • Lassen Sie den Anmeldecode nach der ersten Verwendung für den Zeitraum X gültig sein (sagen wir, er wird nach 15 Minuten ungültig).

Option 1 scheint für unser UX-Team nicht akzeptabel zu sein.

Option zwei scheint viel weniger sicher zu sein:

  • Bietet eine größere Angriffsfläche, da mehr Codes in unserer Datenbank aktiv sind
  • Social Engineering wird einfacher: Ein Benutzer kann innerhalb des gültigen Zeitraums (obwohl der Benutzer den Code bereits verwendet hat) ein Bild von einer E-Mail und einem Typ des Codes aufnehmen und sich mit diesem Code anmelden.

Gibt es eine andere oder bessere Lösung, die sowohl UX-freundlich als auch (zumindest) sicher ist?

24
Joel Harkes

Anstatt den Anmeldecode beim Klicken auf den Link ungültig zu machen, haben Sie ein Skript auf der Seite, das ausgeführt wird, und fordern Sie Ihren Server auf, den Code ungültig zu machen. Dies ist nur wirksam, wenn der "Mail-Scanner" nur die Seite besucht und keine Skripte darauf ausführt.

Sie sollten den Code auch nach einer bestimmten Zeit ungültig machen (Ihre zweite Option), da der Code durch diese Methode nicht ungültig wird, wenn der Benutzer einen Browser mit deaktivierten Skripten ausführt. Das Timeout dient in diesem Fall als Backup.

Wenn Sie feststellen, dass der "Mail-Scanner" Ihrer Benutzer Skripte auf der Seite ausführt, funktioniert dies nicht. Stattdessen können Sie eine Benutzeraktion auf der verknüpften Seite benötigen, um den Anmeldevorgang abzuschließen. Ihre Benutzer würden auf den Link in der E-Mail klicken und zu einer einfachen Seite mit einer Anmeldeschaltfläche und möglicherweise einem Text wie Log in as <username>? Weitergeleitet werden. Melden Sie sie nur an (und machen Sie den Anmeldecode ungültig), wenn sie auf die Schaltfläche klicken. Dies würde zwei Klicks von Ihren Benutzern anstelle von einem erfordern, aber ich denke nicht, dass dies auch unpraktisch ist.

Da der "Mail-Scanner" nur die Seite besucht und nicht auf die Schaltfläche klickt, wird der Code nicht verbraucht.

Je mehr ich darüber nachdenke, desto mehr möchte ich einen Klick benötigen. Es ist nicht darauf angewiesen, dass der Mailscanner keine Skripte ausführt, daher sollte er robuster sein. Sie können es sogar mit Steffen Ullrichs Cookie-Idee kombinieren. Wenn der Benutzer in der E-Mail auf den Anmeldelink klickt und das Cookie hat, wissen Sie, dass es sich nicht um den Mail-Scanner handelt, sodass Sie sich sofort anmelden können. Ein Klick und sie sind angemeldet. Wenn das Cookie NICHT vorhanden ist, kommt der Klick möglicherweise tatsächlich vom Mail-Scanner, sodass Sie eine Seite mit einer Anmeldeschaltfläche anzeigen. Wenn es sich tatsächlich nur um den Benutzer in einem anderen Browser handelt (oder um denselben Browser mit deaktivierten Cookies), klicken sie auf die Schaltfläche und melden sich an. In diesem Fall waren zwei Klicks erforderlich, dies ist jedoch nur eine geringfügige Unannehmlichkeit und nur dann erforderlich, wenn Der Cookie ist nicht da.

Siehe diese ähnliche Frage.

45
gfrung4

Es ist unklar, in welchem ​​Kontext das passwortlose Login verwendet wird. Wenn der Benutzer den Link zum Anmelden jedoch erst nach dem Besuch der Website sendet, können Sie ein Cookie an den Browser des Benutzers senden und dieses Cookie erwarten, wenn sich der Benutzer anmeldet.

Die meisten Benutzer verwenden wahrscheinlich denselben Browser, um sich anzumelden, nachdem sie den Link per E-Mail erhalten haben. In diesem Fall können Sie die angeklickte URL an dem vom Browser gesendeten Cookie ausrichten. Da die Security Appliance keine Kenntnis von den Endbenutzer-Cookies hat, können Sie den Klick von dieser Appliance einfach ablehnen.

Wenn der Benutzer einen anderen Browser zum Klicken auf den Link verwendet oder wenn der Benutzer die Cookies explizit oder implizit gelöscht hat (wie bei Verwendung einer neuen privaten Browsersitzung), kann die E-Mail weiterhin ein explizites Token enthalten, das der Benutzer manuell eingeben kann, um fortzufahren mit der Authentifizierung.

Auf diese Weise werden fast alle Benutzer beim Klicken auf den Link transparent behandelt, die verbleibenden Benutzer können manuell fortfahren, indem sie das Token eingeben, und alle automatischen Systeme werden ausgelassen - selbst wenn sie das Javascript auf der Seite ausführen können.

Ich würde nicht mit der Unfähigkeit dieser Analysesysteme rechnen, Skripte auszuführen. Ich bin mir ziemlich sicher, dass viele tatsächlich mit Skripten umgehen werden, da dies auch ein typischer Mechanismus ist, der in Phishing-Mails verwendet wird, um die Analyse zu erschweren. Stattdessen sollten Sie sich auf fehlende Systemkenntnisse (d. H. Kennen Sie das Cookie nicht) und fehlende Funktionen verlassen.

14
Steffen Ullrich

Melden Sie sich nur an POST request. Der Link in der E-Mail sollte nicht eine Anmeldung verursachen: Er sollte einfach auf eine Anmeldeseite verlinken. Der URL-Code kann extrahiert werden Die URL wird in ein ausgeblendetes Formularfeld eingefügt. Wenn das Formular gesendet wird, was der E-Mail-Scanner nicht tut, ist der Benutzer nur dann angemeldet.

Wenn Sie die Benutzerreibung verringern möchten, können Sie das Formular nach dem Laden der Seite automatisch mit Javascript senden.

10
TRiG

Wenn der Link geöffnet ist, zeigen Sie nur eine Seite mit einer Schaltfläche an, aber machen Sie nichts mit dem Code. Erst wenn der Benutzer auf die Schaltfläche geklickt hat, wird der Code ungültig.

2
mentallurg
  1. Vermeiden Sie Einwegmarken. Diese eignen sich nicht gut für Fehlertoleranz, z. Wenn ein Benutzer versucht, einen Link zu verwenden, und sein Gerät eine langsame Verbindung hat. Außerdem ist alles, was zum einmaligen Gebrauch bestimmt ist, anfälliger für Denial-of-Service-Angriffe von Anwendungen.

  2. Das Token läuft nach dem Senden innerhalb eines angemessenen Zeitraums ab, z. 15 Minuten.

  3. Nachdem der Benutzer auf den Link geklickt hat, benötigen Sie einen zweiten Authentifizierungsfaktor. Dies könnte etwas sehr Einfaches sein, wie ihr Name. Dies verringert das Risiko, dass ein Tippfehler in der E-Mail des Benutzers einem Fremden mit einer ähnlichen Adresse vollen Zugriff auf sein Konto gewährt. Für zusätzliche Sicherheit könnte der zweite Faktor außerhalb des Bandes geliefert werden (z. B. per SMS), dies ist jedoch offensichtlich weniger bequem. Wenn Sie keinen zweiten Faktor finden können, können Sie eine CAPCTHA verwenden. Wenn dies für Personen zu anstrengend ist, verwenden Sie einfach eine Zielseite mit einer Schaltfläche und fordern Sie den Benutzer auf, darauf zu klicken, bevor Sie fortfahren.

  4. Verwenden Sie Sitzungsfixierung und CSRF-Schadensbegrenzung auf den Authentifizierungsseiten.

  5. Lassen Sie alle Token im Flug ablaufen, sobald sich der Benutzer erfolgreich authentifiziert hat, jedoch nicht vorher. Dadurch wird verhindert, dass Bots und E-Mail-Clients den Code versehentlich verbrauchen.

  6. Führen Sie ein Überwachungsprotokoll über die Verwendung von Token und analysieren Sie es regelmäßig auf verdächtige Muster.

1
John Wu

Ich werde meine Kommentarfrage als mögliche Antwort hinzufügen.

Blockieren Sie den einmaligen Kunden SER-AGENT auf Ihrem Server? Paar mit dem Kunden Statische IP .

Vorausgesetzt, diese sind ausreichend eindeutig, können Sie sie transparent machen.

Codieren Sie die eine Instanz nicht fest, nehmen Sie an, dass sie erneut auftreten wird, und richten Sie eine Referenztabelle mit SER-AGENT und IP ein blockiert werden. Auf diese Weise können Sie die Tabelle bei Bedarf einfach ergänzen.

0
user10216038