Authentification à deux facteurs
Tout ce que vous avez lu dans la première partie concernait une identification basée sur ce que sait le demandeur . Il connaît son adresse e-mail, sait comment y accéder (c'est-à-dire connaît son mot de passe e-mail) et connaît les réponses aux questions de sécurité.
La «connaissance» compte comme un facteur d'authentification; deux autres facteurs communs sont ce que vous avez , par exemple, un appareil physique, et qui vous êtes , par exemple, les empreintes digitales ou la rétine.
Dans la plupart des cas, la réalisation d'une identification biologique est difficilement réalisable, surtout lorsque nous parlons de la sécurité des applications Web, donc l'authentification à deux facteurs (2FA) utilise généralement le deuxième attribut - «ce que vous avez». Une variante populaire de ce deuxième facteur est un jeton physique tel que RSA SecurID :
Le jeton physique est souvent utilisé pour l'authentification dans les VPN d'entreprise et les services financiers. Pour l'authentification dans le service, vous devez utiliser à la fois le mot de passe et le code du jeton (qui change fréquemment) en combinaison avec le code PIN. En théorie, pour s'identifier, l'attaquant doit connaître le mot de passe, posséder un token et également connaître le code PIN du token. Dans un scénario de réinitialisation de mot de passe, le mot de passe lui-même est évidemment inconnu, mais la possession d'un jeton peut être utilisée pour confirmer la propriété d'un compte. Bien sûr, comme pour toute implémentation de sécurité, cela ne fournit pas une solution "infaillible" , mais cela soulève définitivement la barrière à l'entrée.
L'un des principaux problèmes de cette approche est le coût et la logistique de la mise en œuvre; nous parlons de remettre des appareils physiques à chaque client et de leur enseigner un nouveau processus. De plus, les utilisateurs doivent avoir un appareil avec eux, ce qui n'est pas toujours le cas avec un jeton physique. Une autre option consiste à implémenter le deuxième facteur d'authentification par SMS, qui dans le cas de 2FA peut servir de confirmation que la personne effectuant le processus de réinitialisation possède le téléphone mobile du titulaire du compte. Voici comment Google procède:
Vous devez également activer la vérification en deux étapes , mais cela signifie que la prochaine fois que vous réinitialisez votre mot de passe, votre téléphone mobile peut devenir le deuxième facteur d'authentification. Permettez-moi de le démontrer avec mon iPhone pour des raisons qui deviendront bientôt claires:
Après avoir identifié l'adresse e-mail du compte, Google détermine que 2FA a été activé et nous pouvons réinitialiser le compte à l'aide de la vérification, qui est envoyée par SMS sur le téléphone mobile du titulaire du compte:
Nous devons maintenant sélectionner le début du processus de réinitialisation:
Cette action entraîne l'envoi d'un e-mail à l'adresse enregistrée:
Cet e-mail contient l'URL de réinitialisation:
Lors de l'accès à l'URL de réinitialisation, un SMS est envoyé et le site Web lui demande de saisir:
Voici le SMS:
Après l'avoir entré dans le navigateur, nous revenons sur le territoire de la réinitialisation du mot de passe classique:
Cela semble probablement un peu verbeux, et c'est le cas, mais le formulaire confirme que la personne effectuant la réinitialisation a accès à l'adresse e-mail et au téléphone portable du titulaire du compte. Mais cela peut être neuf fois plus sûr que de réinitialiser votre mot de passe uniquement par e-mail. Cependant, il y a des problèmes ...
Le problème vient des smartphones. L'appareil illustré ci-dessous ne peut authentifier qu'un seul facteur d'authentification - il peut recevoir des SMS mais pas des e-mails:
Cependant, cet appareil peut recevoir des SMS et recevoir des e-mails de réinitialisation de mot de passe:
Le problème est que nous considérons le courrier électronique comme le premier facteur d'authentification et le SMS (ou même une application génératrice de jetons) comme le second, mais aujourd'hui ils sont combinés dans un seul appareil. Bien sûr, cela signifie que si quelqu'un accède à votre smartphone, toute cette commodité se résume au fait que nous sommes de retour sur le même canal; ce deuxième facteur, «ce que vous avez» signifie que vous avez également le premier facteur. Et tout cela est protégé par un code PIN à quatre chiffres ... si le téléphone a un code PIN et qu'il a été bloqué.
Oui, la fonctionnalité 2FA de Google offre certes une protection supplémentaire, mais elle n'est pas infaillible, et elle ne dépend certainement pas de deux canaux complètement autonomes.
Réinitialiser par nom d'utilisateur vs réinitialiser par e-mail
Dois-je autoriser uniquement la réinitialisation de l'adresse e-mail? Ou l'utilisateur devrait-il également être en mesure de réinitialiser par nom? Le problème avec la réinitialisation par nom d'utilisateur est qu'il n'y a aucun moyen d'avertir l'utilisateur d'un nom d'utilisateur incorrect sans révéler que quelqu'un d'autre pourrait avoir un compte avec ce nom d'utilisateur. Dans la section précédente, la réinitialisation par e-mail garantissait que le propriétaire légitime de cet e-mail recevrait toujours des commentaires sans divulguer publiquement son existence dans le système. Cela ne peut pas être fait en utilisant uniquement le nom d'utilisateur.
La réponse est donc courte: uniquement le courrier électronique. Si vous essayez de réinitialiser en utilisant uniquement le nom d'utilisateur, il y aura des moments où l'utilisateur se demandera ce qui s'est passé.ou vous divulguerez l'existence de comptes. Oui, ce n'est qu'un nom d'utilisateur, pas une adresse e-mail, et oui, n'importe qui peut choisir n'importe quel nom d'utilisateur (disponible), mais il y a toujours une forte probabilité que vous divulguiez indirectement les propriétaires de compte en raison de la tendance des utilisateurs à réutiliser. Nom.
Alors, que se passe-t-il lorsque quelqu'un oublie son nom d'utilisateur? Si nous acceptons que le nom d'utilisateur ne soit pas immédiatement une adresse e-mail (et cela arrive souvent), alors le processus est similaire à la façon dont une réinitialisation de mot de passe commence - nous entrons une adresse e-mail puis envoyons un message à cette adresse sans révéler son existence. La seule différence est que cette fois, le message ne contient que le nom d'utilisateur et non l'URL de réinitialisation du mot de passe. Soit cela, soit l'e-mail indiquera qu'il n'y a pas de compte pour cette adresse.
Vérification d'identité et exactitude des adresses e-mail
Un aspect clé de la réinitialisation du mot de passe, et peut-être même l' aspect le plus important, consiste à vérifier l'identité de la personne qui tente d'effectuer la réinitialisation. Est-ce vraiment le propriétaire légitime du compte, ou quelqu'un essaie-t-il de le pirater ou de déranger le propriétaire?
De toute évidence, le courrier électronique est le moyen le plus pratique et le plus courant de vérifier votre identité. Il n'est pas protégé contre les erreurs de manipulation ("de l'imbécile"), et il existe de nombreux cas où la simple capacité de recevoir des lettres à l'adresse du titulaire du compte ne suffit pas si un degré élevé de confiance dans l'identification est requis (c'est pourquoi 2FA est utilisé), mais c'est presque toujours le point de départ processus de réinitialisation.
Si l'e-mail doit jouer un rôle dans la confiance, la première étape consiste à s'assurer que l'adresse e-mail est réellement correcte. Si quelqu'un se trompe avec un symbole, la réinitialisation ne commencera évidemment pas. Le processus de vérification des e-mails au moment de l'inscription est un moyen fiable de vérifier l'exactitude de l'adresse. Nous avons tous vu cela en pratique: vous vous inscrivez, ils vous envoient un email avec une URL unique sur laquelle cliquer, ce qui confirme que vous êtes bien le propriétaire de ce compte email. Le fait de ne pas se connecter avant de terminer ce processus garantit qu'il existe une motivation pour vérifier l'adresse.
Comme pour de nombreux autres aspects de la sécurité, un tel modèle réduit la convivialité en échange de fournir un degré accru de sécurité par rapport à l'identité de l'utilisateur. Cela peut être acceptable pour un site, enregistrement sur lequel l'utilisateur apprécie fortement et ajoutera volontiers une autre étape du processus (services payants, banque, etc.), mais de telles choses peuvent aliéner l'utilisateur s'il perçoit le compte comme "jetable" et utilise , par exemple, simplement comme un moyen de commenter un message.
Identifier qui a lancé le processus de réinitialisation
Il existe clairement des raisons pour une utilisation malveillante de la fonction de réinitialisation et les attaquants peuvent l'utiliser de différentes manières. Une astuce simple que nous pouvons utiliser pour vérifier l'origine de la demande (cette astuce fonctionne généralement ) consiste à ajouter la réinitialisation de l'adresse IP du demandeur à l'e-mail. Cela fournit au destinataire des informations pour identifier la source de la demande.
Voici un exemple de la fonction de réinitialisation que j'intègre actuellement dans ASafaWeb:
Le lien "en savoir plus" dirige l'utilisateur vers ip-adress.com , fournissant des informations telles que l'emplacement et l'organisation de la personne demandant la réinitialisation:
Bien sûr, toute personne qui souhaite cacher son identité a de nombreuses façons de masquer sa véritable adresse IP, mais c'est un moyen pratique d'ajouter une identité partielle du demandeur, et dans la plupart des cas, cela vous donnera une bonne idée de qui effectuera une demande de réinitialisation de mot de passe.
Modifier la notification par e-mail
Cet article est imprégné d'un sujet: la communication; communiquer autant que possible au propriétaire du compte ce qui se passe à chaque étape du processus, sans révéler quoi que ce soit qui pourrait être utilisé avec une intention malveillante. La même chose s'applique lorsque le mot de passe a réellement changé - informez-en le propriétaire!
Il y a deux sources de raisons pour changer un mot de passe:
- Changer le mot de passe après la connexion car l'utilisateur veut un nouveau mot de passe
- Réinitialiser un mot de passe sans se connecter car l'utilisateur l'a oublié
Bien que ce message concerne principalement la réinitialisation, la notification dans le premier cas réduit le risque que quelqu'un modifie le mot de passe à l'insu du propriétaire légitime. Comment cela peut-il arriver? Un scénario très courant consiste à obtenir le mot de passe du propriétaire légitime (un mot de passe réutilisé provenant d'une autre source; un mot de passe obtenu par keylogging; un mot de passe facilement deviné, etc.), après quoi l'attaquant décide de le changer, bloquant ainsi le propriétaire. Sans notification par e-mail, le propriétaire actuel ne sera pas informé du changement de mot de passe.
Bien sûr, dans le cas d'une réinitialisation de mot de passe, le propriétaire devait déjà lancer le processus (ou contourner les outils de vérification d'identification décrits ci-dessus), le changement ne devrait donc pasvenez comme une surprise pour lui, cependant, un e-mail de confirmation sera un retour positif et une vérification supplémentaire. De plus, il assure la cohérence avec le scénario ci-dessus.
Oh, et au cas où ce ne serait pas encore évident , n'envoyez pas le nouveau mot de passe! Cela peut faire rire, mais cela se produit :
Journaux, journaux, journaux et quelques autres journaux
La fonction de réinitialisation du mot de passe est intéressante pour les attaquants: un attaquant souhaite soit accéder au compte d'une autre personne, soit simplement déranger le propriétaire du compte / système. Bon nombre des pratiques décrites ci-dessus peuvent réduire la probabilité d'abus, mais elles ne l'empêchent pas et elles n'empêcheront certainement pas les gens d'essayer d'utiliser la fonction de manière involontaire.
La journalisation est une pratique absolument inestimable pour reconnaître les comportements malveillants, et je veux dire une journalisation très détaillée . Enregistrez les tentatives de connexion infructueuses, réinitialisez les mots de passe, changez les mots de passe (c'est-à-dire lorsque l'utilisateur est déjà connecté) et presque tout ce qui peut vous aider à comprendre ce qui se passe; ce sera très utile à l'avenir. Enregistrez même des pièces séparées dans les journauxprocessus, par exemple, une bonne fonction de réinitialisation devrait inclure le lancement d'une réinitialisation via le site Web (capturez la demande et les tentatives de connexion pour réinitialiser avec le mauvais nom d'utilisateur ou le mauvais e-mail), enregistrez la visite du site Web par l'URL de réinitialisation (y compris les tentatives d'utilisation du mauvais token), puis enregistrez le succès ou l'échec de la réponse à la question de sécurité.
Quand je parle de journalisation, je veux dire non seulement enregistrer le fait de charger une page, mais aussi collecter autant d'informations que possible si elles ne sont pas confidentielles . Les gars, veuillez ne pas enregistrer les mots de passe! Dans les journaux, vous devez enregistrer l'identité de l'utilisateur autorisé (il sera autorisé s'il changemot de passe existant ou en essayant de réinitialiser le mot de passe de quelqu'un d'autre après la connexion), tous les noms d'utilisateur ou adresses e-mail essayés, ainsi que tous les jetons de réinitialisation qu'il tente d'utiliser. Mais cela vaut également la peine de consigner des aspects tels que les adresses IP et, si possible, même les en-têtes de demande. Cela vous permet de recréer non seulement ce que l' utilisateur (ou l'attaquant) tente de faire, mais également qui il est.
Délégation de responsabilité à d'autres artistes interprètes ou exécutants
Si vous pensez que c'est une énorme quantité de travail, vous n'êtes pas seul. En fait, créer un système de gestion de compte robuste n'est pas une tâche facile. Ce n'est pas que c'est techniquement lourd, c'est juste qu'il a beaucoup de fonctionnalités. Il ne s'agit pas seulement de réinitialiser, il y a tout un processus d'enregistrement, un stockage sécurisé des mots de passe, la gestion de plusieurs tentatives de connexion invalides, etc., etc. Bien que je promeuve l'idée d'utiliser des fonctionnalités prêtes à l'emploi comme le fournisseur d'adhésion ASP.NET , il reste encore beaucoup à faire au-delà.
Il existe aujourd'hui de nombreux fournisseurs tiers qui simplifient la tâche et résument tout cela dans un seul service géré. Ces services incluent OpenID, OAuth et même Facebook. Certaines personnesIl n'y a pas de limite à croire ce modèle (OpenID a en effet été très réussi sur Stack Overflow), mais d'autres le voient littéralement comme un cauchemar .
Sans aucun doute, un service comme OpenID résout beaucoup de problèmes de développement, mais il est également indéniable qu'il en ajoute de nouveaux. Ont-ils un rôle à jouer? Oui, mais nous ne constatons évidemment pas une utilisation massive des fournisseurs de services d'authentification. Les banques, les compagnies aériennes et même les magasins mettent tous en œuvre leur propre mécanisme d'authentification, et il y a évidemment de très bonnes raisons à cela.
Décharge malveillante
Un aspect important de chacun des exemples ci-dessus est que l'ancien mot de passe est considéré comme inutile seulement après que l'identité du propriétaire du compte a été vérifiée . Ceci est important car si le compte pouvait être réinitialisé avant la vérification d'identité, il ouvrirait toutes sortes d'activités malveillantes.
Voici un exemple: quelqu'un enchérit sur un site d'enchères, et vers la fin du processus d'enchères, ils bloquent les concurrents en lançant un processus de réinitialisation, les retirant ainsi de l'enchère. De toute évidence, si une fonction de réinitialisation mal conçue peut être mal utilisée, cela peut entraîner de graves résultats négatifs. Il convient de noter que le blocage des comptes par des tentatives de connexion incorrectes est une situation similaire, mais c'est un sujet pour un autre article.
Comme je l'ai dit ci-dessus, donner aux utilisateurs anonymes la possibilité de réinitialiser le mot de passe de n'importe quel compte simplement en connaissant son adresse e-mail est une situation toute faite pour une attaque par déni de service. Ce n'est peut-être pas le même DoS, dont nous avons l'habitude de parler, mais il n'y a pas de moyen plus rapide de bloquer l'accès à votre compte qu'avec une fonction de réinitialisation de mot de passe mal pensée.
Lien le plus faible
Du point de vue de la protection d'un compte, tout ce qui est écrit ci-dessus est excellent, cependant, vous devez toujours garder à l'esprit l'écosystème entourant le compte que vous protégez. Laissez-moi vous donner un exemple:
ASafaWeb est hébergé par un service incroyable fourni par AppHarbor. Le processus de réinitialisation d'un compte d'hébergement est le suivant:
Étape 1:
Étape 2:
Étape 3:
Étape 4:
Après avoir lu toutes les informations précédentes, il est déjà facile de comprendre quels aspects dans un monde idéal nous implémenterions un peu différemment. Ce que je veux dire ici, cependant, c'est que si je publie un site comme ASafaWeb sur AppHarbor, puis que je propose d'excellentes questions et réponses de sécurité, que j'ajoute un deuxième facteur d'authentification et que je fais le reste selon les règles, cela n'annule pas le fait que le lien le plus faible de tout le processus sera capable de tout casser. Si quelqu'un s'authentifie avec succès dans AppHarbor en utilisant mes informations, il peut remplacer le mot de passe de n'importe quel compte ASafaWeb par celui dont il a besoin!
Le fait est que la robustesse de la mise en œuvre de la protection doit être considérée de manière holistique: vous devez simuler les menaces sur chaque point d'entrée du système, même s'il s'agit d'un processus superficiel, par exemple, entrant dans le système AppHarbor. Cela devrait me donner une bonne idée de l'effort que je dois déployer dans le processus de réinitialisation du mot de passe ASafaWeb.
Mettre tous ensemble
Cet article contient beaucoup d'informations, je veux donc le concentrer dans un simple aperçu visuel:
N'oubliez pas de vous connecter aussi détaillé que possible pour chacun de ces éléments. Ca y est, c'est simple!
Résultat
Mon message semble être complet, mais il y a beaucoup de matériel supplémentaire que je pourrais inclure, mais j'ai décidé de le laisser de côté par souci de brièveté: le rôle de l'adresse e-mail de secours, la situation dans laquelle vous perdez l'accès à l'e-mail associé au compte (par exemple, vous avez quitté votre emploi) et ainsi de suite. Comme je l'ai dit plus tôt, la fonction de réinitialisation n'est pas si difficile, seulement il y a de nombreux points de vue à ce sujet.
Même si la réinitialisation n'est pas si difficile, elle n'est souvent pas mise en œuvre correctement. Nous avons vu quelques exemples ci-dessus où la mise en œuvre peut entraîner des problèmes, et il existe de nombreux autres cas d'utilisation où une réinitialisation incorrecte a en fait causé des problèmes. Il a été récemment révélé queLa réinitialisation du mot de passe a été utilisée pour voler 87 000 $ de bitcoins . C'est un résultat négatif sérieux!
Par conséquent, soyez prudent avec vos fonctions de réinitialisation, simulez des menaces à différents points et lors de la conception d'une fonction, n'enlevez pas votre chapeau noir, car il y a de fortes chances que quelqu'un d'autre le porte!
La publicité
VDSina propose des serveurs bon marché à la location avec paiement quotidien, chaque serveur est connecté à un canal Internet de 500 Mégabits et est protégé des attaques DDoS gratuitement!