Zwei Faktor Authentifizierung (Konzept)

Für Benutzerlogins kann eine sogenannte Zwei-Faktor Authentifizierung (2FA) implementiert werden. Dabei wird neben Benutzername und Passwort eine weitere Sicherheitsabfrage gestellt, welche zum Login erfolgreich beantwortet werden muss.
Hierbei kann sowohl ein eigener Prozess (z.B. Security-Token via Email) implementiert, oder auch ein externer TOTP Provider angebunden werden (z.B. Authentifizierung via Microsoft App). Voraussetzung für TOTP ist _data 4.5 oder höher.

Die 2FA selbst wird über Ereignisbehandlungen implementiert. Dafür stehen folgende Ereignisse zur Verfügung:

Zum Implementieren eines TOTP 2FA können folgende Bausteine verwendet werden:

Wichtiger Hinweis

Zwei-Faktor-Authentifizierungsansätze werden in _pro über Ereignisbehandlungen konfiguriert, welche aus Sicherheitsgründen nicht über den abgesicherten Modus ausgehebelt werden können.
Daher können Fehler in der Konfiguration zum permanenten Aussperren der Benutzer führen. Sollte dies geschehen, kann die Sicherheitsprüfung nur über folgende Schritte einmalig ausgehebelt werden:

  • Eine Datei namens "skip_tfa_for_USERNAME" im "backup" Verzeichnis des data Wizard abgelegt werden (Standardmäßig "datawizard/backup"). Diese Datei wird automatisch wieder entfernt, wenn der Login erfolgreich war

  • Login in abgesichertem Modus (URL Parameter safeMode=true), mit dem Benutzer, welcher im Namen der Backupdatei aufgeführt wird

Es wird daher beim Entwickeln eines 2FA Workflows empfohlen, diesen in einer separaten Sitzung (z.B. Inkognitofenster) zu testen, damit das Aussperren des Konfigurators im Vorfeld verhindert werden kann.

2FA mittels TOTP

Die Zwei-Faktor-Authentifizierung mittels TOTP erfolgt in zwei Schritten. In dem ersten Schritt wird ein geheimer Schlüssel erzeugt und zwischen der Authenticator App und dem jeweiligen Provider geteilt.

images/download/attachments/128386538/2fa-reg-version-2-modificationdate-1675864834594-api-v2.png

Dieser Schritt kann durch den Baustein Gerät registrieren gestartet und auch durch Gerät deregistrieren wieder rückgängig gemacht werden.

Ob ein Gerät für einen bestimmten Benutzer bereits zugelassen ist, kann mittels Zwei Faktor Gerät registriert? geprüft werden. Das heisst, es kann im Login-Prozess erst geprüft werden, ob ein Gerät registriert ist, und danach, je nach Ergebnis, entweder den Registrierungsprozess oder eine 2FA Authentifizierung starten.

Dieser erste Schritt muss für jeden Benutzer nur einmal durchlaufen werden.

Im zweiten Schritt wird, bei jedem Login, ein Code abgefragt, der dann auf Korrektheit geprüft wird. Der prinzipielle Ablauf ist im folgenden Bild dargestellt:

images/download/attachments/128386538/path5908-version-1-modificationdate-1675865658243-api-v2.png images/download/attachments/128386538/2fa-verify2-version-1-modificationdate-1675867707074-api-v2.png

Nach dem Benutzer-Login wird das Ereignis Zwei Faktor Authentifizierung: Vorbereiten ausgelöst. Hierauf kann in der Ereignisaktion prinzipiell beliebig reagiert werden (siehe Beispiele unten), im Falle von TOTP wird mit der Aktion Vorbereiten der Code abgefragt. Anschliessend wird das Ereignis Verifizieren ausgelöst. In dieser Ereignisbehandlung kann mit der Aktion Verifizieren auf Korrektheit geprüft werden.

Alle Aktionen können noch mit einem Parameter "Für Benutzer" auf einen anderen Benutzer als den Inhaber der aktuellen Session angewendet werden.

Beispiel

Für die 2FA mittels TOTP muss in der Konfigurationsdatei $HUB_HOME/etc/auth.xml die entsprechende Aktivierung eingetragen sein (als Beispiel der Authenticator von google, andere zulässige Authenticator können in der _data Hilfe nachgelesen werden):

<Call name="addTFAHandler">
<Arg>com.ebd.hub.services.auth.tfa.otpauth.TOTPHandler</Arg>
<Call name="addDeviceTemplate">
<Arg>GoogleAuthenticator</Arg>
<Arg>HmacSHA1</Arg>
</Call>
</Call>

Für 2FA ohne TOTP muss in Konfigurationsdateien nichts geändert werden.

Im Folgenden ein vereinfachtes Beispiel einer 2FA mit einem Google Authenticator (dieses Beispiel ist nicht übertragbar, im Falle einer fehlenden Geräteregistrierung müssten entsprechende Aktion erfolgen):


images/download/attachments/128386538/example-2fa-1-version-1-modificationdate-1675869978218-api-v2.png

Im linken Bild ist die 2FA Vorbereitung zu sehen: Die Typprüfung prüft auf eine 2FA Anfrage und ob

für den Benutzer ein Gerät registriert ist. Ist beides erfüllt, wird die Aktion Vorbereiten ausgeführt.

Diese fragt nach dem Code, der im Authentikator angezeigt wird.


Hat man diesen Code abgeschickt, wird im rechten Teil die Überprüfung ausgeführt. Die Typprüfung

ist wie im linken Beispiel, die Aktion die benötigt wird, ist 2FA - Verifizieren.

images/download/attachments/128386538/2fa-very-version-3-modificationdate-1675870537752-api-v2.png


2FA mittels eigener Verifizierungsmethode

Prinzipiell können mit den zur Verfügung gestellten Aktionen beliebige zweite Faktoren zur Authentifizierung erzeugt werden (zum Beispiel ein Token, welcher per Email verschickt und dann abgefragt wird, siehe auch die Beispiele unten). Wichtig dabei ist, dass der entspechende Wert über storage weitergegeben wird.

Beispiel

Analog zur TOTP Authentifizierung können auch eigene Methoden mit den Ereignissen Zwei Faktor Authentifizierung: Vorbereiten (Ereignis) und Zwei Faktor Authentifizierung: Verifizieren (Ereignis) implementiert werden.
Wie bereits erwähnt, geben diese Ereignisse einen Zwei Faktor Authentifizierungs-Request an die Regeln und Aktionen weiter. In dessen "storage" (erreichbar via Datenfeld), lassen sich mit dem Objekt-Feld Wertauflöser beliebige Werte schreiben und lesen.
Diese bleiben über die Zwei Faktor Ereignisse hinweg erhalten.

Das Konzept ist daher simpel: Ermittle ein Geheimnis bei Zwei Faktor Authentifizierung: Vorbereiten (Ereignis), speichere es in den Storage des Eingabeobjektes und teile es dem Benutzer auf einem beliebigen Weg mit. Prüfe das Geheimnis dann beim Ereignis Zwei Faktor Authentifizierung: Verifizieren (Ereignis).

Nachfolgend zwei extrem simple Beispiel-Ereignisbehandlungen, welche diesen Workflow abbilden:

images/download/attachments/128386538/image2023-2-8_17-8-30-version-1-modificationdate-1675872510566-api-v2.png

images/download/attachments/128386538/image2023-2-8_17-9-9-version-1-modificationdate-1675872549854-api-v2.png

Dem Benutzer soll die Nachricht "Nenne das Geheimnis!" dargestellt werden.
Das Geheimnis "Zitronensorbet" wird im erfundenen Storagefeld "secret" gemerkt.
In der Praxis wird das Geheimnis i.d.R. zufällig generiert und
z.B. via Email oder SMS an den Benutzer versendet.

Beim Verifizieren (nachdem der Benutzer das Geheimnis eingegeben hat), wird geprüft, ob das Geheimnis aus dem
Storagefeld "secret", der Antwort ("response") des Benutzers entspricht.
Der Rückgabewert der Prüfung (true/false) wird dann in das Feld "verified" geschrieben, welches darüber entscheidet,
ob der Login zugelassen (true) oder abgelehnt (false) wird.


Das konfigurierte Beispiel in Aktion:
Nach der korrekten Eingabe des Benutzernamens und des Passwortes, wird der Benutzer mit folgender Meldung konfrontiert:

images/download/attachments/128386538/image2023-2-8_17-19-18-version-1-modificationdate-1675873158995-api-v2.png

Gibt der Benutzer das Geheimnis "Zitronensorbet" korrekt ein, wird er erfolgreich eingeloggt.