
Qu'est-ce que l'authentification à deux facteurs et comment l'utiliser dans Drupal ?
L'authentification à deux facteurs (2FA) est une fonctionnalité de plus en plus populaire sur les sites web, et cet article va vous apprendre à l'implémenter complètement sur un site Drupal 9 ou 8.
Qu'est-ce que l'authentification à deux facteurs ?
L'authentification à deux étapes est le processus d'authentification de l'utilisateur lors de la connexion, composé de deux méthodes de vérification. La première méthode se réfère à la connexion bien connue par l'entrée d'un identifiant et d'un mot de passe. Avec le développement web et de nombreux services stockant des données sensibles, tels que Facebook ou GitHub, le risque d'attaques et la possibilité qu'une personne non autorisée accède à votre compte ont augmenté. Pour prévenir une telle situation, une deuxième méthode d'authentification a été introduite. La solution ne garantit pas une certitude à 100 % que vos données sont sécurisées, mais elle améliore considérablement la sécurité des données, par exemple, dans Drupal.
Les méthodes les plus populaires de la seconde authentification à la connexion incluent :
- un code envoyé par message SMS,
- une liste de codes générés à utiliser,
- la génération de codes d'accès dans des applications externes telles que Google Authenticator.
Implémentation de l'authentification à deux facteurs dans Drupal
L'implémentation de la version de base de cette fonctionnalité revient à installer plusieurs modules et leur configuration.
La version de base inclut :
- la modification du processus de connexion dans Drupal,
- un nouveau bloc avec un formulaire de connexion,
- la génération de codes d'accès textuels.
Les questions étendues que nous décrirons dans cet article concerneront la génération de codes dans l'application Google Authenticator et de codes envoyés à une adresse email.
Modules
Pour construire l'authentification à deux facteurs présenté dans cet article, vous aurez besoin des modules suivants :
- Two-factor Authentication (TFA) - fonctionnalité principale,
- Key - module Drupal pour la gestion des clés,
- Encrypt - permet à d'autres modules de chiffrer et déchiffrer des données,
- Real AES ou un autre module ajoutant une méthode de chiffrement (une liste de ces modules est disponible sur le site du module Encrypt),
- GA_login - intégration avec Google Authenticator, une application mobile qui génère des codes.
Installation
La façon la plus rapide d'installer tous les modules dont vous avez besoin est d'utiliser Composer et d'exécuter la commande shell :
composer require drupal/tfa
et
composer require drupal/real_aes

Si vous n'utilisez pas Composer, téléchargez chacun de ces modules et décompressez-les dans le répertoire où le site est hébergé - /modules/contrib. Si vous n'avez pas de répertoire contrib, vous devrez en créer un.
Activez maintenant tous les modules.
Drush : drush en key real_aes encrypt tfa ga_login
Ou de manière conventionnelle sur le site /admin/modules

Processus de connexion après l'installation du module Two-Factor Authentication (TFA)
- L'utilisateur saisit ses informations de connexion (identifiant et mot de passe) dans le formulaire et les confirme.
- Si les données sont correctes, Drupal crée une session utilisateur, identifiant l'utilisateur comme authentifié.
- Le module TFA implémente hook_user_login.
- Le TFA vérifie si l'utilisateur connecté doit utiliser la seconde méthode d'authentification. Si oui, l'utilisateur est déconnecté et redirigé vers la seconde méthode d'authentification.
- Le processus d'authentification suit, par exemple, l'entrée d'un code reçu par message SMS.
- Si le code est correct, l'utilisateur est à nouveau connecté.
Configuration des modules
La première étape consiste à créer une clé pour le chiffrement. À cette fin, accédez à la configuration du module Key et ajoutez une nouvelle clé.
/admin/config/system/keys/add

Donnez un nom à la clé. Sélectionnez Encryption comme type de clé et définissez la Taille de la clé à 256 bits.
Dans les paramètres d'où la clé est prise, trois options sont disponibles. Cependant, pour des raisons de sécurité, je recommande de conserver la clé dans un fichier en dehors du répertoire principal du site web ou en tant que variable d'environnement (env).
Pour un fichier dans Emplacement du fichier, vous devez indiquer le chemin où le fichier se trouve. Il doit déjà exister car sinon, vous ne pourrez pas enregistrer de modifications. Voir ci-dessous comment générer un tel fichier.
Chemin du fichier
../keys/tfa.key
Où .. (deux points) signifie que vous quittez le répertoire actuel pour aller plus haut.
Une troisième option, qui n'est pas recommandée, est de conserver la clé dans les fichiers de configuration. Dans ce cas, vous devez être prudent car ils se trouvent dans le répertoire où le site est hébergé. Ils peuvent également être envoyés par erreur au dépôt.
Vous pouvez voir un exemple de structure de répertoire présentant l'emplacement des clés dans la capture d'écran ci-dessous.
- Web - répertoire avec Drupal,
- keys - répertoire avec les clés,
- tfa.key - fichier avec les clés.

Comment générer une clé de 256 bits ?
Le moyen le plus simple de le faire est d'utiliser la commande Linux :
openssl rand -base64 32 > tfa.key
ou
dd if=/dev/urandom of=keyfile bs=32 count=1 > tfa.key
Dans les deux cas, le résultat sera la création d'un fichier tfa.key avec la clé générée.
Après avoir enregistré les modifications, vous passez à la configuration du module Encrypt, où vous devrez ajouter un profil de chiffrement.
/admin/config/system/encryption/profiles
La configuration est simple, limitée à sélectionner la méthode de chiffrement, dans ce cas, fournie par le module Real AES, et à choisir la clé que vous venez de générer.

Après ces opérations, vous pouvez passer à la configuration du module TFA, qui peut être trouvée sur le site
/admin/config/people/tfa
À partir de là, vous gérez l'entièreté de la fonctionnalité. Vous activez et désactivez la 2FA (authentification à deux facteurs) pour notre site, par défaut, la 2FA est désactivée. Nous sélectionnons également les rôles pour lesquels la 2FA sera requise. Il est important que sur le site avec des permissions, le rôle sélectionné ait accès à la configuration de la 2FA.

Plugins d'authentification à deux facteurs
Après avoir installé les modules mentionnés ci-dessus, nous avons trois plugins à choisir. Deux d'entre eux sont basés sur l'application Google Authenticator.

- OTP basé sur le temps - l'application génère des codes temporels qui vous permettent de vous connecter au site.
- OTP basé sur Hmac - une clé de hachage est générée, et l'utilisateur peut se connecter s'il y a une correspondance.
Le troisième plugin est disponible directement depuis le module Two-factor Authentication.
- TFA Recovery codes - génère un nombre défini de codes pour l'utilisateur à utiliser lors de la connexion.
Nous pouvons créer nos propres plugins (nous en parlerons plus tard dans l'article) et introduire de nouvelles méthodes d'authentification, par exemple, via des codes SMS.
Dans les paramètres, vous pouvez également spécifier combien de fois un utilisateur peut sauter l'activation de la 2FA. Par défaut, ce nombre est de 3 connexions. Après la connexion, le message suivant apparaîtra.

Si les permissions pour le rôle sont définies correctement, l'onglet Sécurité apparaîtra sur le site de profil avec l'option de configurer chacune des méthodes d'authentification activées.
Adresse : /user/UID/security/tfa
Pour activer l'authentification à deux facteurs, vous n'avez besoin que de configurer une méthode. Si plus d'une méthode est configurée, l'utilisateur pourra choisir quelle méthode utiliser lors de la connexion, et l'utilisateur n'aura pas à passer par l'authentification en utilisant chaque méthode.

Nous activons les plugins TOTP et HOTP via l'application mobile de notre choix, à savoir :
- Google Authenticator (Android/iPhone/BlackBerry),
- Authy (seulement TOTP),
- FreeOTP (Android),
- GAuth Authenticator (desktop).
Vous devez également scanner un QR code généré dans l'application.

Après cette opération, des codes seront générés dans l'application mobile. Maintenant, générez le premier code et confirmez-le. S'il est correct, la méthode sélectionnée sera activée.

Pour les Codes de récupération, générez simplement et enregistrez les codes dans un endroit sûr.

Cette méthode sera activée en générant les codes et en les attribuant au compte de l'utilisateur - le bouton Enregistrer les codes sur le compte.
Votre propre plugin d'authentification
Le module TFA vous donne la possibilité d'ajouter vos propres plugins d'authentification à deux facteurs. Cela consiste à créer les classes appropriées avec des méthodes.
Comment encore authentifier un utilisateur qui se connecte ? Vous pouvez envoyer le code par SMS, email (il existe un module TFA Email module déjà prêt pour cela) ou sur Slack.
L'ensemble du code présenté ci-dessous n'est pas un plugin prêt à l'emploi mais seulement une description de ce dont il est composé.
Il est facile d'organiser votre propre module basé sur le code du module ga_login. Je recommande de le revoir et de l'analyser pour mieux le comprendre.
Supposons que notre module s'appelle tfa_code. Les deux principales classes devraient être situées dans les répertoires suivants.
Classe TfaCodeValidation (le nom peut être librement donné)
tfa_code/src/Plugin/TfaValidation/TfaCodeValidation.php
Classe TfaCodeSetup (le nom peut être librement donné)
tfa_code/src/Plugin/TfaValidation/TfaCodeSetup.php
La classe TfaCodeSetup est utilisée pour gérer le processus d'activation d'une méthode d'authentification donnée, et la classe TfaCodeValidation est responsable du processus d'authentification de l'utilisateur lors de la connexion en utilisant la méthode sélectionnée.
Classe TfaCodeSetup et ses éléments principaux
L'annotation dans le commentaire de la classe contient des informations selon lesquelles il s'agit du plugin TfaSetup et qu'il a un identifiant unique qui sera utilisé dans l'autre classe.
/**
* Setup pour 2FA en envoyant le code.
*
* @TfaSetup(
* id = "tfa_code_setup",
* label = @Translation("TFA Code Setup"),
* description = @Translation("TFA Code Setup Plugin"),
* setupMessages = {
* "saved" = @Translation("code enregistré."),
* "skipped" = @Translation("code non enregistré.")
* }
* )
*/
class TfaCodeSetup extends TfaCodeValidation implements TfaSetupInterface {
La classe hérite de la classe de validation et implémente l'interface contenue dans le module TFA.
Méthode
public function ready() {
Elle renvoie TRUE si la méthode d'authentification peut être activée dans le contexte donné. Quand peut-elle, d'un autre côté, retourner FALSE ? Par exemple, si vous implémentez l'envoi de codes par SMS, les utilisateurs doivent d'abord confirmer leur numéro de téléphone dans leur profil. Si l'utilisateur ne confirme pas d'abord son numéro de téléphone, il ne peut pas activer cette méthode d'authentification. La méthode ready() doit alors être écrite de manière à retourner FALSE.
Méthode
public function getOverview(array $params) {
Affiche des informations et des liens sur la façon d'activer la méthode d'authentification.
Méthode
public function getSetupForm(array $form, FormStateInterface $form_state, $reset = 0) {
Contient la définition du formulaire pour activer la méthode donnée. C'est ici que les exigences pour activer le plugin doivent être incluses, telles qu'une boîte du formulaire pour entrer le code qui sera envoyé à la personne qui souhaite activer cette méthode d'authentification.
Exemple:
$form['get_code'] = [
'#type' => 'button',
'#value' => t('Obtenir le code de validation),
'#ajax' => [
'callback' => [$this, 'get'],
'event' => 'click',
],
'#limit_validation_errors' => [],
'#prefix' => '<div id="tfa-validate-set-code">',
'#suffix' => '</div>',
];
Un bouton qui active la fonction get, définie dans le callback.
Dans la fonction get, vous devez programmer l'envoi du code à l'utilisateur, par exemple, par email ou SMS. Le nom de la fonction peut être donné librement ici.
Boîte pour entrer le code envoyé
$form['tfa_container']['set_tfa_code'] = [
'#type' => 'textfield',
'#size' => 30,
'#placeholder' => t('Tapez le code de validation ici'),
'#prefix' => '<div id="tfa-validate-set-code">',
'#suffix' => '</div>',
];
Le fait que les codes correspondent - celui envoyé avec celui entré - est vérifié dans cette méthode
public function validateSetupForm(array $form, FormStateInterface $form_state) {
Si tout est correct, la méthode
public function submitSetupForm(array $form, FormStateInterface $form_state) {
renvoie TRUE.
Classe TfaCodeValidation et ses éléments principaux
L'annotation de la classe est analogue à celle de TfaCodeSetup.
/**
* Classe de validation du code.
*
* @TfaValidation(
* id = "tfa_code_validation",
* label = @Translation("Validation du Code TFA"),
* description = @Translation("Plugin de Validation du Code TFA"),
* setupPluginId = "tfa_code_setup",
* )
*/
Méthode
public function ready() {
Ressemble analogiquement à la classe précédente.
Méthode
public function getForm(array $form, FormStateInterface $form_state) {
C'est ici que le formulaire pour la méthode est créé. L'utilisateur voit le formulaire lors de la connexion et de l'authentification. Comme dans la classe précédente, il devrait y avoir des boîtes pour envoyer et entrer le code. Le code est vérifié dans la méthode
public function validateForm(array $form, FormStateInterface $form_state) {
Cela conclut l'implémentation de notre propre plugin d'authentification à deux facteurs. Encore une fois, je recommande d'analyser le code du module ga_login, car vous créerez rapidement votre propre module fonctionnel à partir de cela.
Authentification à deux facteurs dans Drupal - résumé
Avec cet article étendu, nous voulions expliquer l'implémentation de l'authentification à deux facteurs pour un site Drupal aussi bien que possible. De nos jours, de plus en plus d'internautes sont conscients des risques de perte de données. Activer la 2FA rend leurs comptes sur les sites web plus sécurisés et plus difficiles à intercepter. L'authentification à deux facteurs n'est pas une garantie à 100 %, mais elle augmente certainement de manière significative à la fois la sécurité et le niveau de confiance pour le site sur lequel cette fonctionnalité est implémentée. Notre équipe de support Drupal peut vous aider à l'implémenter et fournir plus de conseils sur la sécurité de votre site.