Authentification à deux facteurs avec Duo-Security

Dans mon dernier article sur l’authentification à deux facteurs, j’ai créé un screencast qui expliquait comment utiliser le système d’authentification à deux facteurs Authy pour améliorer facilement la sécurité de la connexion de votre site Web. Cette fois-ci, nous allons examiner un autre service de Duo Security qui propose une API de sécurité solide, des guides et des bibliothèques prédéfinies qui facilitent la mise en route rapide..

Tout comme Authy, vous aurez besoin d’un serveur d’application pour implémenter Duo car certains aspects, notamment les clés secrètes, doivent être définis dans un emplacement non accessible. Pour ce tutoriel, j'utilise la bibliothèque ColdFusion de Duo, mais ils proposent également des bibliothèques pour:

  • Python
  • Rubis
  • ASP classique
  • ASP.Net
  • Java
  • PHP
  • Node.js
  • Perl

Du point de vue du serveur, ils ont certainement une bonne couverture.


Préparer votre application sur Duo

La première chose à faire est de créer un compte. Je ne vais pas vous guider à travers ces étapes car cela devrait être explicite, mais je dirai que c'était cool de voir une option gratuite disponible pour que je puisse créer ce tutoriel gratuitement. Oui, Duo facture son service et honnêtement, c'est une bonne chose. Vous voulez vous assurer qu'un service qui vous aide à sécuriser votre site dispose des fonds nécessaires pour rester en affaires un peu.

Une fois que vous êtes inscrit, vous serez invité à configurer une nouvelle intégration. Cela signifie simplement que vous devez configurer les détails de ce que vous souhaitez sécuriser. Et vous verrez pourquoi je dis "ce que vous souhaitez sécuriser" en cliquant sur le bouton Type d'intégration menu déroulant. Duo vous permet de configurer diverses options de sécurité, pas seulement un site Web..


Pour nos besoins, nous utiliserons le SDK Web"option. Le Nom de l'intégration est un nom sémantique que vous souhaitez utiliser pour identifier votre site avec.


Après avoir enregistré ces informations, une page de paramètres vous est présentée pour votre intégration. C'est ici que vous ajusterez le mode de fonctionnement de l'authentification et que vous obtiendrez un accès à votre intégration, à vos clés secrètes et à votre nom d'hôte d'API. Celles-ci sont essentielles au bon fonctionnement de Duo et ne doivent pas être partagées..


En outre, vous devrez créer votre propre clé d'application alphanumérique de 40 caractères, que Duo ne connaîtra pas et qui assurera un meilleur contrôle de votre compte et de votre application. Par exemple, j'ai généré la clé aléatoire suivante pour mon application de démonstration:

gQNU4CYYu3z5YvVuBamA7ZUvQ2cbe98jjI8G6rkL

Notez simplement qu'il doit comporter 40 caractères. Sinon, vous recevrez une erreur lorsque vous essayez de l'utiliser.

Lorsque vous parcourez les paramètres, la plupart s’expliquent d'eux-mêmes, mais une section intitulée Politique qui vous permet de définir quand un utilisateur sera invité à s'authentifier à deux facteurs. Il est important de choisir la meilleure option pour votre application. D'après mon expérience, la plupart des sites ont tendance à demander à leurs utilisateurs s'ils souhaitent adhérer à la sécurité renforcée. L'authentification à deux facteurs peut être lourde et certains utilisateurs ne veulent tout simplement pas l'utiliser. Pour ce scénario, je vais aller avec le Exiger une inscription stratégie (qui garantit que le processus d’inscription Duo n’est pas contourné) et définition d’un indicateur dans l’enregistrement de la base de données de l’utilisateur lorsqu’ils se sont inscrits.

En réalité, c'est tout ce dont j'avais besoin pour configurer le panneau d'administration Duo afin de rendre le service disponible pour mon application. Commençons donc par ajouter du code.


Ajout de Duo à mon application

Je tiens à répéter que vous aurez besoin de créer du code côté serveur pour que cela fonctionne réellement et Duo a fourni une large gamme de bibliothèques que vous pourrez utiliser..

Le code que j'écris est CFML et j'utiliserai leur composant ColdFusion qui gère toutes les complexités de la signature et du cryptage de ma demande, ainsi que la vérification de la valeur de retour de l'API Duo..

Comme je l'ai mentionné plus tôt, la plupart des activations à deux facteurs sont optionnelles, ce qui signifie qu'un utilisateur accédera aux paramètres de son compte, cliquera sur un lien pour activer le service et effectuera un processus de saisie des informations pertinentes pour que tout fonctionne. Cela implique généralement de fournir au service un numéro de téléphone portable et de valider les paramètres sur la base d'un numéro unique envoyé soit par SMS, soit par un appel téléphonique. Duo peut offrir aux utilisateurs l'une ou l'autre option et fournit également leur propre application mobile pouvant générer le code d'authentification pour les utilisateurs via leur téléphone..

Si vous regardez la capture d'écran ci-dessous, vous pouvez voir comment j'ai essayé de répliquer un simple écran de compte avec un bouton visible en dessous, comme une incitation à l'action pour activer l'authentification:


Lorsque l'utilisateur clique dessus, le composant Duo est appelé pour signer la demande via le signRequest () méthode.

 

Pour comprendre ce que cette méthode fait, j'aimerais utiliser une citation du site Duo:

sign_request () effectue un HMAC-SHA1 du nom d'utilisateur, de la clé d'intégration et un horodatage d'expiration, en utilisant la clé secrète de l'intégration en tant que clé HMAC. En générant cette authentification côté serveur et après l’authentification principale, Duo est assuré que l’utilisateur est effectivement autorisé à passer à la deuxième étape de l’authentification..

Fondamentalement, il crée une demande chiffrée basée sur toutes les clés de votre intégration, la clé d'application unique à 40 caractères que vous avez créée et le nom d'utilisateur unique de l'utilisateur. Le résultat final ressemble à ceci:

TX | cmV5YmFuZ29AZ21haWwuY29tfERJVzJNWDNQUDVOV0wxOVk0SVJPfDEzNzE4NDk1MTc = | 2ec4457684ad00419cfa04f833f5e99f29d20935: APP | cmV5YmFuZ29AZ21haWwuY29tfERJVzJNWDNQUDVOV0wxOVk0SVJPfDEzNzE4NTI4MTc = | d53e0565ab8d632ccac40097dfedc4356dd79209

La signature est stockée dans la variable session.sigReq qui est une variable de session persistante à laquelle je peux faire référence plus tard. Je vérifie sa valeur pour m'assurer qu'une signature valide a été transmise et, le cas échéant, je peux passer à la page suivante du processus..


Le duo IFRAME

La signature est transmise à l'IFRAME de Duo, qui gère à la fois l'ajout de nouveaux utilisateurs au service et la validation des utilisateurs existants. Duo propose une bibliothèque JavaScript qui interagit avec IFRAME pour fournir l'interface utilisateur permettant de configurer les utilisateurs. En regardant le code ci-dessous, nous pouvons voir l'IFRAME, la référence à la librairie Duo JS et l'appel à la méthode pour tout initialiser:

  

L'appel de méthode est simple et prend trois options:

  • Le nom d'hôte de l'API défini pour votre intégration.
  • La demande de signature que nous avons générée.
  • URL que Duo publiera les résultats une fois le traitement terminé.

Si vous êtes confus par ceci, # session.sigReq #, ne soyez pas. C'est simplement la façon de ColdFusion de remplacer une variable par sa valeur.

À ce stade, l’utilisateur se verra présenter l’écran de configuration Duo:


L'utilisateur devra entrer un numéro de téléphone, puis choisir s'il souhaite recevoir son code de validation à six chiffres par message vocal ou texte. J'ai essayé les deux et ils ont fonctionné aussi bien. Duo vérifie de son côté pour s'assurer que le code saisi est valide.

Ensuite, un écran apparaîtra à l'utilisateur pour télécharger l'application mobile Duo:


C’est une bonne chose, car avoir l’application mobile permettra à l’utilisateur d’obtenir un code même s’il n’a pas de service cellulaire..

Une fois inscrits avec succès, ils recevront la page ci-dessous et seront invités à se valider une fois de plus:


À toutes fins utiles, tout ce processus est entre les mains de Duo; vous attendez juste des commentaires.

Ce retour d’information déterminera si l’utilisateur a été correctement configuré et vous devrez utiliser le verifyResponse () méthode pour cela.

Comme auparavant, il prend toutes les variables clés et, dans ce cas, reçoit une réponse de Duo sous la forme d'une variable publiée appelée sig_response. Je l'ai référencé comme form.sig_response car c’est ainsi que ColdFusion autorise l’accès aux variables postées.

le verifyResponse () méthode prendra la réponse signée renvoyée par Duo et si tout va bien, renverra le nom d'utilisateur de l'utilisateur que vous pourrez valider par rapport à votre base de données. Donc, dans mon cas, je m'attendrais à ce que "[email protected]" soit renvoyé. Une fois que je l'ai validé, je mets l'indicateur dans l'enregistrement de la base de données de l'utilisateur qui me permet de savoir qu'il a opté pour l'authentification à deux facteurs..

C'est tout. C'est tout ce que vous devez faire pour configurer les utilisateurs afin qu'ils activent l'authentification à deux facteurs. Passons maintenant à l'expérience de connexion.


Se connecter avec Duo

Vous pouvez vous attendre à quelque chose de magique d'ici, mais il est intéressant de noter que vous pouvez presque réutiliser le même code créé pour activer un utilisateur afin de lui permettre de se connecter. Je suis allé de l'avant et j'ai créé une page de connexion très basique:


La page elle-même n'est qu'un balisage HTML. La partie importante est d’abord de déterminer si l’utilisateur a choisi de participer et cela se produit lorsque vous validez ses informations de connexion au site habituelles. Oui, vous devez toujours effectuer votre validation de connexion habituelle du nom d'utilisateur et du mot de passe. Le service de Duo est complémentaire à cela, pas un remplacement.

En vérifiant l'enregistrement de la base de données, vous devriez pouvoir déterminer s'ils ont choisi de participer. Si ce n'est pas le cas, vous ne les authentifieriez qu'avec votre combinaison nom d'utilisateur / mot de passe habituelle. S'ils ont, alors vous allez appeler le signRequest () méthode, la même que nous avons utilisé lors de l'activation d'un nouvel utilisateur:

Encore une fois, nous créons une signature chiffrée à envoyer à l'API de Duo via sa bibliothèque IFRAME et JavaScript. L'essentiel est que, dans ce scénario, nous ne devons appliquer une authentification à deux facteurs que si l'utilisateur s'est abonné. C'est pourquoi il est important de définir la bonne politique pour votre intégration. En mettant le mien à Exiger une inscription et en utilisant un indicateur d'enregistrement de base de données, je peux toujours autoriser l'utilisateur à accéder à mon site même s'il n'a pas encore choisi l'authentification à deux facteurs. Si l'utilisateur a choisi de se connecter, il lui sera demandé de saisir un code Duo pour valider son compte..


Emballer

Augmenter la sécurité de son site est toujours une bonne chose. Vous voulez vous assurer de protéger vos utilisateurs autant que possible et utiliser une authentification à deux facteurs est un grand pas dans la bonne direction..

Duo offre un service solide avec une facilité et une flexibilité incroyables. Bien que je ne vous ai montré que leur SDK Web, ils ont également une API beaucoup plus flexible qui vous donne un contrôle très granulaire sur la plupart des aspects du processus. Bien que je recommande d’utiliser le SDK Web, il est bon de savoir que vous disposez de ce pouvoir. Chapeau à Duo pour la création d'un excellent service.