Sur l'échange de pile de révision de code, en réponse au code qui informe l'utilisateur lorsque leur tentative de connexion a échoué en raison d'un trop grand nombre de tentatives de connexion à partir d'une IP, on m'a dit
"Absolument ne pas envoyer un message à l'utilisateur final lui expliquant pourquoi la connexion a échoué. Vous donnez à un attaquant potentiel des informations essentielles pour l'aider à attaquer votre application. Ici, vous donnez un attaquant des informations très précises pour contourner votre restriction IP. "
https://codereview.stackexchange.com/a/164608/93616
Suis-je en train de pratiquer une mauvaise sécurité? Dois-je expliquer en termes plus vagues comme "Trop de tentatives de connexion" ou "Vous ne pouvez pas être connecté"?
Mise à jour : En cas d'ambiguïté, la logique et le message de tentatives trop nombreuses ne se soucient pas si les tentatives ont réussi ou non.
N'envoyez absolument pas de message à l'utilisateur final pour lui expliquer pourquoi la connexion a échoué. Vous donnez à un attaquant potentiel des informations critiques pour l'aider à attaquer votre application.
D'un autre côté, ne pas dire à un utilisateur pourquoi sa connexion a échoué est un désastre potentiel d'utilisation.
Si vous ne précisez pas si l'adresse IP de l'utilisateur a été interdite ou si l'utilisateur a utilisé un mauvais mot de passe, il pourrait paniquer car il lui semble que quelqu'un a accédé à son compte et a changé le mot de passe pour le verrouiller. Si ma connexion avec un mot de passe pré-rempli échoue, la première chose à laquelle je pense est un cambriolage plutôt qu'un bloc IP.
En outre, un mécanisme de blocage IP naïf pourrait être inefficace et introduire des problèmes supplémentaires. C'est potentiellement trivial à contourner pour un attaquant avec des ressources suffisantes et quelqu'un qui partage une adresse IP avec d'autres utilisateurs pourrait abuser de l'interdiction IP pour verrouiller les autres. Au lieu de cela, un CAPTCHA après n tentatives infructueuses par IP pourrait être une solution plus souple et plus appropriée pour votre application.
Regarde aussi:
Il y a un avantage de sécurité à fournir des messages génériques qui n'ont pas été mentionnés.
Alice tente de forcer brutalement un compte sur le serveur de Bob. Pour les premières tentatives, Alice récupère le message "Echec de la tentative de connexion". Lors de la prochaine tentative, elle obtient "Trop de tentatives de connexion à partir de cette adresse IP". Elle est maintenant consciente que (a) toutes les informations d'identification qu'elle a essayées jusqu'à ce point étaient invalides, et (b) qu'elle doit faire quelque chose de différent avant de faire plus de tentatives.
Mais qu'en est-il si Bob ne change pas le message? Alice continuera avec la force brute et continuera à obtenir la "tentative de connexion échouée" générique à chaque tentative même si les informations d'identification sont correctes . S'il lui arrive d'essayer les informations d'identification correctes, Bob rejettera la tentative car la limite IP a été dépassée, mais Alice ne saura pas que c'est la raison et devra la traiter comme une tentative incorrecte (sauf si elle en a d'autres manière de savoir qui dépasse le cadre de cette question). Sa seule option est de poursuivre la recherche, sans savoir si elle a déjà localisé et dépassé les informations d'identification correctes.
Notez que cet avantage est la sécurité par l'obscurité car il repose sur Alice ne connaissant pas la politique de blocage IP de Bob. Selon la configuration, ces informations peuvent être triviales à obtenir. Par exemple, si Alice a accès à un autre compte sur le système (facile si elle accepte l'enregistrement du compte public), elle peut alors utiliser l'essai et l'erreur pour voir si une tentative correcte est finalement rejetée après trop de tentatives incorrectes.
D'autres réponses ont expliqué le compromis sécurité/convivialité, donc je ne vais pas prendre la peine de répéter cela.
Oui, techniquement, vous renvoyez des informations qui pourraient être utilisées par un attaquant pour affiner un botnet de force brute. De plus, je ne suis pas sûr de l'utilité du message d'erreur "To many login tentatives from this IP" pour un utilisateur standard. Il convient également de noter que tout attaquant chevronné commencera à remarquer soit un type de réponse changeant, soit une différence de temps, et comprendra probablement ce qui se passe, de toute façon.
Vous pouvez envisager d'utiliser un service tel que CloudFlare. Ils ont une API scriptable qui peut insérer dynamiquement une page interstitielle ou mettre à jour une règle WAF dans certains scénarios. Troy Hunt a un bon tutoriel où il le fait pour Windows Azure en utilisant Azure Functions.
Dans ce cas, la sécurité et la convivialité sont des objectifs contraires. Bien que la mise en œuvre la plus sécurisée n'offre aucune rétroaction, elle serait également la moins conviviale. Vous devez déterminer dans quelle mesure votre système est sensible à la brutalisation des connexions, quelles autres mesures d'atténuation sont en place et quelle est l'efficacité des mesures d'atténuation spécifiques lorsqu'elles sont évaluées contre les inconvénients pour l'utilisateur.
Par exemple, si je concevais la connexion pour un appareil grand public, je la rendrais aussi conviviale que possible en ayant des commentaires détaillés et en introduisant des atténuations supplémentaires pour compenser. Si je concevais la connexion HSM, je n'offrirais aucune rétroaction et des délais d'attente onéreux à l'échelle de l'appareil.
Tout dépend de ce que vous construisez. S'il s'agit d'un blog ou de tout autre site sophistiqué où il n'est pas vraiment important de rejeter les tentatives légitimes et où vous ne faites pas vraiment confiance à la robustesse de l'application, vous devez vraiment la protéger de tout ce qui pourrait être une attaque et ne jamais dire pourquoi. vous refusez une connexion.
Si vous créez une application professionnelle et que vous vous attendez à ce que les accès professionnels ne limitent pas les accès à partir d'une seule adresse IP si votre application est suffisamment robuste. Si vous le faites, assurez-vous d'informer l'utilisateur de la raison et de mettre en place un service raisonnablement réactif hot line (au plus 1 jour ouvrable pour lire et comprendre un message, et pour lancer une action corrective si nécessaire ). Parce qu'il est courant pour les grandes organisations de configurer un seul proxy sortant pour tous leurs accès HTTP et HTTPS. Vous pouvez avoir des milliers d'employés dans différents endroits d'un pays, tous utilisant apparemment la même adresse IP. Une liste blanche permettant des connexions illimitées à partir de mandataires connus suffit, mais vous devez être prêt à la changer rapidement si l'un de vos clients fait évoluer son réseau et change son adresse proxy.