
Was ist Zwei-Faktor-Authentifizierung und wie verwendet man sie in Drupal?
Die Zwei-Faktor-Authentifizierung (2FA) ist eine zunehmend beliebte Funktionalität auf Websites, und dieser Artikel wird Ihnen beibringen, wie Sie sie vollständig auf einer Drupal 9 oder 8 Seite implementieren können.
Was ist Zwei-Faktor-Authentifizierung?
Zwei-Schritt-Authentifizierung ist der Prozess der Authentifizierung des Benutzers beim Login, bestehend aus zwei Verifizierungsmethoden. Die erste Methode bezieht sich auf die bekannte Anmeldung durch Eingabe von Benutzername und Passwort. Mit der Webentwicklung und vielen Diensten, die sensible Daten speichern, wie beispielsweise Facebook oder GitHub, steigt das Risiko von Angriffen und die Möglichkeit, dass jemand Unbefugtes auf Ihr Konto zugreift. Um eine solche Situation zu verhindern, wurde die zweite Authentifizierungsmethode eingeführt. Die Lösung garantiert zwar keine 100%ige Sicherheit, dass Ihre Daten sicher sind, aber sie verbessert die Datensicherheit erheblich, zum Beispiel in Drupal.
Zu den beliebtesten Methoden der zweiten Authentifizierung beim Login gehören:
- Ein Code, der per SMS-Nachricht gesendet wird,
- Eine Liste generierter Codes zur Nutzung,
- Generierung von Zugangscodes in externen Anwendungen wie Google Authenticator.
Implementierung der Zwei-Faktor-Authentifizierung in Drupal
Die Implementierung der Grundversion dieser Funktionalität erfordert die Installation und Konfiguration mehrerer Module.
Die Grundversion umfasst:
- Änderung des Anmeldevorgangs in Drupal,
- Ein neuer Block mit einem Anmeldeformular,
- Generierung von Textzugangscodes.
Die erweiterten Themen, die wir in diesem Artikel beschreiben werden, betreffen die Generierung von Codes in der Google Authenticator-App und Codes, die an eine E-Mail-Adresse gesendet werden.
Module
Um die in diesem Artikel vorgestellte Zwei-Faktor-Authentifizierung aufzubauen, benötigen Sie folgende Module:
- Two-factor Authentication (TFA) - Hauptfunktionalität,
- Key - Drupal-Modul zur Verwaltung von Schlüsseln,
- Encrypt - ermöglicht anderen Modulen, Daten zu verschlüsseln und zu entschlüsseln,
- Real AES oder ein anderes Modul, das eine Verschlüsselungsmethode hinzufügt (eine Liste dieser Module ist auf der Webseite des Encrypt-Moduls aufgeführt),
- GA_login - Integration mit Google Authenticator, einer mobilen Anwendung, die Codes generiert.
Installation
Der schnellste Weg, alle benötigten Module zu installieren, ist die Verwendung von Composer und das Ausführen des shell-Befehls:
composer require drupal/tfa
und
composer require drupal/real_aes

Wenn Sie Composer nicht verwenden, laden Sie jedes dieser Module herunter und entpacken Sie sie im Verzeichnis, in dem die Seite gehostet wird - /modules/contrib. Wenn Sie kein contrib-Verzeichnis haben, müssen Sie eines erstellen.
Aktivieren Sie nun alle Module.
Drush: drush en key real_aes encrypt tfa ga_login
Oder konventionell auf der Seite /admin/modules

Anmeldeprozess nach der Installation des Two-Factor Authentication (TFA) Moduls
- Der Benutzer gibt seine Anmeldedaten (Benutzername und Passwort) in das Formular ein und bestätigt diese.
- Wenn die Daten korrekt sind, erstellt Drupal eine Benutzersitzung und identifiziert den Benutzer als authentifiziert.
- Das TFA-Modul implementiert hook_user_login.
- TFA überprüft, ob der angemeldete Benutzer die zweite Authentifizierungsmethode verwenden sollte. Falls ja, wird der Benutzer abgemeldet und zur zweiten Authentifizierungsmethode umgeleitet.
- Der Authentifizierungsprozess erfolgt durch Eingabe eines Codes aus einer SMS-Nachricht.
- Wenn der Code korrekt ist, wird der Benutzer erneut angemeldet.
Konfiguration der Module
Der erste Schritt besteht darin, einen Schlüssel zur Verschlüsselung zu erstellen. Zu diesem Zweck gehen Sie zur Konfiguration des Key-Moduls und fügen einen neuen Schlüssel hinzu.
/admin/config/system/keys/add

Geben Sie dem Schlüssel einen Namen. Wählen Sie Verschlüsselung als Schlüsseltyp und setzen Sie die Schlüsselgröße auf 256 Bits.
In den Einstellungen, wo der Schlüssel herkommt, gibt es drei Optionen zur Auswahl. Aus Sicherheitsgründen empfehle ich jedoch, den Schlüssel in einer Datei außerhalb des Hauptverzeichnisses der Website oder als Umgebungsvariable (env) aufzubewahren.
Für eine Datei in Dateipfad müssen Sie den Pfad angeben, in dem sich die Datei befindet. Sie muss bereits existieren, da Sie andernfalls keine Änderungen speichern können. Siehe unten, wie Sie eine solche Datei generieren können.
Dateipfad
../keys/tfa.key
Wo .. (zwei Punkte) bedeutet, dass Sie das aktuelle Verzeichnis verlassen, um höher zu gelangen.
Eine dritte Option, die nicht empfohlen wird, besteht darin, den Schlüssel in den Konfigurationsdateien aufzubewahren. In diesem Fall müssen Sie vorsichtig sein, da sie sich im Verzeichnis befinden, in dem die Seite gehostet wird. Sie könnten auch versehentlich in das Repository gesendet werden.
Sie können unten ein Beispiel für eine Verzeichnisstruktur sehen, die den Ort der Schlüssel darstellt.
- Web - Verzeichnis mit Drupal,
- keys - Verzeichnis mit Schlüsseln,
- tfa.key - Datei mit Schlüsseln.

Wie erzeugt man einen 256-Bit-Schlüssel?
Der einfachste Weg dies zu tun, ist mit dem Linux-Befehl:
openssl rand -base64 32 > tfa.key
oder
dd if=/dev/urandom of=keyfile bs=32 count=1 > tfa.key
In beiden Fällen resultiert dies in der Erstellung einer tfa.key-Datei mit dem generierten Schlüssel.
Nach dem Speichern der Änderungen fahren Sie mit der Konfiguration des Encrypt-Moduls fort, wo Sie ein Verschlüsselungsprofil hinzufügen müssen.
/admin/config/system/encryption/profiles
Die Konfiguration ist einfach und beschränkt sich auf die Auswahl der Verschlüsselungsmethode, in diesem Fall bereitgestellt durch das Real AES-Modul, und die Auswahl des gerade erzeugten Schlüssels.

Nach diesen Operationen können Sie mit der Konfiguration des TFA-Moduls fortfahren, die auf der Seite
/admin/config/people/tfa
entdeckte Funktionalität verwaltet. Sie aktivieren und deaktivieren 2FA (Zwei-Faktor-Authentifizierung) für unsere Website, standardmäßig ist 2FA deaktiviert. Wir wählen auch die Rollen aus, für die 2FA erforderlich sein wird. Es ist wichtig, dass auf der Seite mit Berechtigungen die ausgewählte Rolle Zugriff auf die 2FA Konfiguration hat.

Zwei-Faktor-Authentifizierungs-Plugins
Nach der Installation der oben genannten Module haben wir drei Plugins zur Auswahl. Zwei davon basieren auf der Google Authenticator-Anwendung.

- Zeitbasierte OTP - die Anwendung generiert zeitgesteuerte Codes, die Ihnen die Anmeldung auf der Seite ermöglichen.
- HMAC-basierte OTP - ein Hash-Schlüssel wird generiert, und der Benutzer kann sich anmelden, wenn es eine Übereinstimmung gibt.
Das dritte Plugin ist direkt im Two-Factor-Authentication-Modul verfügbar.
- TFA-Wiederherstellungscodes - generiert eine bestimmte Anzahl von Codes, die der Benutzer bei der Anmeldung verwenden kann.
Wir können unsere eigenen Plugins erstellen (darauf werden wir später im Artikel eingehen) und neue Authentifizierungsmethoden einführen, z. B. über SMS-Codes.
In den Einstellungen können Sie auch angeben, wie oft ein Benutzer das Aktivieren von 2FA überspringen kann. Standardmäßig sind 3 Anmeldungen festgelegt. Nach dem Einloggen erscheint folgende Meldung.

Wenn die Berechtigungen für die Rolle korrekt gesetzt sind, erscheint auf der Profilseite der Sicherheits-Reiter mit der Möglichkeit, jede der aktivierten Authentifizierungsmethoden zu konfigurieren.
Adresse: /user/UID/security/tfa
Um die Zwei-Faktor-Authentifizierung zu aktivieren, müssen Sie nur eine Methode konfigurieren. Wenn mehrere Methoden konfiguriert sind, kann der Benutzer wählen, welche Methode er beim Anmelden verwenden möchte, und er muss die Authentifizierung nicht mit jeder Methode durchlaufen.

Wir aktivieren die TOTP- und HOTP-Plugins über die mobile App unserer Wahl, nämlich:
- Google Authenticator (Android/iPhone/BlackBerry),
- Authy (nur TOTP),
- FreeOTP (Android),
- GAuth Authenticator (Desktop).
Sie müssen auch einen generierten QR-Code in der Anwendung scannen.

Nach dieser Operation werden die Codes in der mobilen Anwendung generiert. Jetzt generieren Sie den ersten Code und bestätigen ihn. Wenn er korrekt ist, wird die ausgewählte Methode aktiviert.

Für Recovery Codes erzeugen und speichern Sie einfach die Codes an einem sicheren Ort.

Diese Methode wird durch die Generierung der Codes aktiviert und den Benutzerkonto zugewiesen - die Codes zum Konto speichern Taste.
Ihr eigenes Authentifizierungs-Plugin
Das TFA-Modul ermöglicht es Ihnen, Ihre eigenen Zwei-Faktor-Authentifizierungs-Plugins hinzuzufügen. Dies besteht darin, entsprechende Klassen mit Methoden zu erstellen.
Wie können Sie den Benutzer, der sich anmeldet, noch authentifizieren? Sie können den Code per SMS, E-Mail (es gibt ein fertiges TFA Email-Modul dafür) oder über Slack senden.
Der gesamte unten dargestellte Code ist kein fertiges Plugin, sondern nur eine Beschreibung, woraus es besteht.
Es ist einfach, Ihr eigenes Modul basierend auf dem Code aus dem ga_login-Modul abzubilden. Ich empfehle, es zu überprüfen und zu analysieren, um ein besseres Verständnis zu erlangen.
Nehmen wir an, dass unser Modul tfa_code heißt. Die beiden Hauptklassen sollten sich in den folgenden Verzeichnissen befinden.
TfaCodeValidation Klasse (der Name kann frei gewählt werden)
tfa_code/src/Plugin/TfaValidation/TfaCodeValidation.php
TfaCodeSetup Klasse (der Name kann frei gewählt werden)
tfa_code/src/Plugin/TfaValidation/TfaCodeSetup.php
Die TfaCodeSetup-Klasse wird verwendet, um den Prozess der Aktivierung einer bestimmten Authentifizierungsmethode zu steuern, und die TfaCodeValidation-Klasse ist für den Prozess der Authentifizierung des Benutzers beim Login mit der ausgewählten Methode verantwortlich.
TfaCodeSetup-Klasse und ihre Hauptelemente
Die Annotation im Klassenkommentar enthält Informationen, dass dies das TfaSetup-Plugin ist und über eine eindeutige ID verfügt, die in der anderen Klasse verwendet wird.
/**
* Einrichtung für 2FA, indem Code gesendet wird.
*
* @TfaSetup(
* id = "tfa_code_setup",
* label = @Translation("TFA Code Setup"),
* description = @Translation("TFA Code Setup Plugin"),
* setupMessages = {
* "saved" = @Translation("Code gespeichert."),
* "skipped" = @Translation("Code nicht gespeichert.")
* }
* )
*/
class TfaCodeSetup extends TfaCodeValidation implements TfaSetupInterface {
Die Klasse erbt von der Validierungsklasse und implementiert das im TFA-Modul enthaltene Interface.
Methode
public function ready() {
Es gibt TRUE zurück, wenn die Authentifizierungsmethode im gegebenen Kontext aktiviert werden kann. Wann kann es andererseits FALSE zurückgeben? Zum Beispiel, wenn Sie das Senden von Codes per SMS implementieren, müssen Benutzer zunächst ihre Telefonnummer in ihrem Profil bestätigen. Wenn der Benutzer seine Telefonnummer vorher nicht bestätigt, kann er diese Authentifizierungsmethode nicht aktivieren. Die ready()-Methode sollte dann so geschrieben werden, dass sie FALSE zurückgibt.
Methode
public function getOverview(array $params) {
Zeigt Informationen und Links dazu an, wie die Authentifizierungsmethode aktiviert werden kann.
Methode
public function getSetupForm(array $form, FormStateInterface $form_state, $reset = 0) {
Enthält die Definition des Formulars zur Aktivierung der gegebenen Methode. Hier müssen die Anforderungen zur Aktivierung des Plugins enthalten sein, wie zum Beispiel ein Formularfeld zur Eingabe des Codes, der der Person zugeschickt wird, die diese Authentifizierungsmethode aktivieren möchte.
Beispiel:
$form['get_code'] = [
'#type' => 'button',
'#value' => t('Validation Code anfordern'),
'#ajax' => [
'callback' => [$this, 'get'],
'event' => 'click',
],
'#limit_validation_errors' => [],
'#prefix' => '<div id="tfa-validate-set-code">',
'#suffix' => '</div>',
];
Ein Button, der die get-Funktion aktiviert, die im Callback definiert ist.
In der get-Funktion müssen Sie das Senden des Codes an den Benutzer programmieren, z.B. per E-Mail oder SMS. Der Funktionsname kann hier frei gewählt werden.
Feld zur Eingabe des gesendeten Codes
$form['tfa_container']['set_tfa_code'] = [
'#type' => 'textfield',
'#size' => 30,
'#placeholder' => t('Validation Code hier eingeben'),
'#prefix' => '<div id="tfa-validate-set-code">',
'#suffix' => '</div>',
];
Die Tatsache, ob die Codes übereinstimmen - der gesendete mit dem eingegebenen -, wird in dieser Methode überprüft
public function validateSetupForm(array $form, FormStateInterface $form_state) {
Wenn alles korrekt ist, gibt die Methode
public function submitSetupForm(array $form, FormStateInterface $form_state) {
TRUE zurück.
TfaCodeValidation-Klasse und ihre Hauptelemente
Die Klassenannotation ist analog zu der von TfaCodeSetup.
/**
* Code-Validierungsklasse.
*
* @TfaValidation(
* id = "tfa_code_validation",
* label = @Translation("TFA Code-Validierung"),
* description = @Translation("TFA Code-Validierungs-Plugin"),
* setupPluginId = "tfa_code_setup",
* )
*/
Methode
public function ready() {
Sieht analog zur vorherigen Klasse aus.
Methode
public function getForm(array $form, FormStateInterface $form_state) {
Hier wird das Formular für die Methode erstellt. Der Benutzer sieht das Formular beim Login und bei der Authentifizierung. Wie in der vorherigen Klasse sollten hier Felder für das Senden und Eingeben des Codes enthalten sein. Der Code wird in der Methode überprüft
public function validateForm(array $form, FormStateInterface $form_state) {
Hier endet die Implementierung unseres eigenen Zwei-Faktor-Authentifizierungs-Plugins. Ich empfehle erneut, den Code aus dem ga_login-Modul zu analysieren, da Sie schnell Ihr eigenes funktionsfähiges Modul darauf aufbauend erstellen können.
Zwei-Faktor-Authentifizierung in Drupal - Zusammenfassung
Mit diesem ausführlichen Artikel wollten wir die Implementierung der Zwei-Faktor-Authentifizierung für eine Drupal-Website bestmöglich erklären. Heutzutage sind sich immer mehr Internetnutzer der Risiken und des Datenverlusts bewusst. Durch die Aktivierung von 2FA werden ihre Konten auf Websites sicherer und schwerer abzufangen. Zwei-Faktor-Authentifizierung ist keine 100%ige Garantie, aber sie erhöht sicherlich sowohl die Sicherheit als auch das Vertrauen in die Website, auf der diese Funktionalität implementiert wird. Unser Drupal-Support-Team kann Ihnen bei der Implementierung helfen und weitere Ratschläge zur Sicherheit Ihrer Website geben.