Très bien, assez d'hésitation, voici ce que j'ai trouvé jusqu'à présent.
(désolé, long post à venir. Soyez courageux, mon ami, le voyage en vaut la peine)
En combinant les méthodes 3 et 4 de l'article original, on obtient une sorte de liste blanche "floue" ou dynamique, puis - et c'est là que réside l'astuce ne bloque pas les IP qui ne sont pas sur liste blanche, mais les étrangle jusqu'en enfer .
Notez que cette mesure est uniquement destiné à contrecarrer ce type d'attaque très spécifique. En pratique, bien sûr, cela fonctionnerait en combinaison avec d'autres approches de meilleures pratiques d'authentification : étranglement par nom d'utilisateur fixe, étranglement par IP, politique de mot de passe fort renforcée par le code, connexion par cookie non accélérée, hachage de tous les équivalents de mot de passe avant de les enregistrer, ne jamais utiliser de questions de sécurité, etc.
Hypothèses sur le scénario d'attaque
Si un attaquant cible des noms d'utilisateur variables, notre contrôle des noms d'utilisateur ne fonctionne pas. Si l'attaquant utilise un botnet ou a accès à une large plage d'adresses IP, notre étranglement des adresses IP est impuissant. Si l'attaquant a récupéré à l'avance notre liste d'utilisateurs (ce qui est généralement possible avec les services Web d'enregistrement ouvert), nous ne pouvons pas détecter une attaque en cours en nous basant sur le nombre d'erreurs "utilisateur non trouvé". Et si nous appliquons une limitation restrictive à l'échelle du système (tous les noms d'utilisateur, toutes les adresses IP), toute attaque de ce type entraînera un déni de service de l'ensemble de notre site pendant la durée de l'attaque et la période de limitation.
Donc nous devons faire autre chose.
La première partie de la contre-mesure : la mise en liste blanche.
Ce dont nous pouvons être sûrs, c'est que l'attaquant n'est pas en mesure de détecter et d'usurper dynamiquement les adresses IP de plusieurs milliers de nos utilisateurs(+). Ce qui fait que liste blanche faisable. En d'autres termes : pour chaque utilisateur, nous stockons une liste des IP (hachées) à partir desquelles l'utilisateur s'est précédemment (récemment) connecté.
Ainsi, notre système de liste blanche fonctionnera comme une "porte d'entrée" verrouillée, où un utilisateur doit être connecté à partir d'une de ses "bonnes" IP reconnues pour pouvoir se connecter. Une attaque par force brute sur cette "porte d'entrée" serait pratiquement impossible(+).
(+) à moins que l'attaquant ne "possède" soit le serveur, soit toutes les boîtes de nos utilisateurs, soit la connexion elle-même - et dans ce cas, il ne s'agit plus d'un problème d'"authentification", mais d'une véritable situation d'effondrement de la franchise.
La deuxième partie de la contre-mesure : l'étranglement à l'échelle du système. de PI non reconnues
Pour qu'une liste blanche fonctionne dans le cas d'un service web à enregistrement ouvert, où les utilisateurs changent fréquemment d'ordinateur et/ou se connectent à partir d'adresses IP dynamiques, nous devons laisser une "porte de chat" ouverte pour les utilisateurs se connectant à partir d'IP non reconnues. L'astuce consiste à concevoir cette porte de manière à ce que les botnets restent bloqués et que les utilisateurs légitimes soient dérangés. le moins possible .
Dans mon schéma, ceci est réalisé en fixant une valeur de très un nombre maximal restrictif de tentatives de connexion échouées par des IP non approuvées sur une période de 3 heures, par exemple (il peut être plus judicieux d'utiliser une période plus courte ou plus longue en fonction du type de service), et en imposant cette restriction mondial c'est-à-dire pour tous les comptes d'utilisateurs.
Même une force brute lente (1 à 2 minutes entre les tentatives) serait détectée et contrecarrée rapidement et efficacement par cette méthode. Bien entendu, une vraiment lent La force brute pourrait encore passer inaperçue, mais des vitesses trop lentes vont à l'encontre de l'objectif même de l'attaque par force brute.
Ce que j'espère accomplir avec ce mécanisme d'étranglement, c'est que si la limite maximale est atteinte, notre "porte des chats" se ferme pour un moment, mais notre porte d'entrée reste ouverte aux utilisateurs légitimes qui se connectent par les moyens habituels :
- Soit en se connectant depuis l'une de leurs IP reconnues
- Ou en utilisant un cookie de connexion persistant (de n'importe où)
Les seuls utilisateurs légitimes qui seraient affectés au cours d'une attaque - c'est-à-dire pendant que l'étranglement est activé - seraient les utilisateurs sans cookies de connexion persistants qui se connectent depuis un lieu inconnu ou avec une IP dynamique. Ces utilisateurs seraient dans l'impossibilité de se connecter jusqu'à ce que l'étranglement se dissipe (ce qui pourrait prendre un certain temps si l'attaquant continuait à faire fonctionner son botnet malgré l'étranglement).
Pour permettre à ce petit sous-ensemble d'utilisateurs de se faufiler par la porte autrement scellée du chat, même si les robots continuent de la marteler, j'utiliserais un formulaire de connexion "de secours" avec un CAPTCHA. Ainsi, lorsque vous affichez le message "Désolé, mais vous ne pouvez pas vous connecter à partir de cette adresse IP pour le moment", vous incluez un lien qui dit " connexion de sauvegarde sécurisée - HUMANS ONLY ( bots : pas de mensonge ) ". Blague à part, lorsqu'ils cliquent sur ce lien, donnez-leur un formulaire de connexion authentifié par reCAPTCHA qui contourne l'étranglement du site. De cette façon, s'ils sont humains et connaissent le bon login+mot de passe (et sont capables de lire les CAPTCHAs), ils pourront jamais se voient refuser le service, même s'ils se connectent depuis un hôte inconnu et n'utilisent pas le cookie d'authentification.
Oh, et juste pour clarifier : puisque je considère que les CAPTCHAs sont généralement maléfiques, l'option de connexion "de secours" serait la suivante uniquement apparaître pendant que l'étranglement était actif .
Il est indéniable qu'une attaque soutenue de ce type constituerait toujours une forme d'attaque DoS, mais avec le système décrit en place, elle n'affecterait que ce que je soupçonne être un minuscule sous-ensemble d'utilisateurs, à savoir les personnes qui n'utilisent pas le cookie "remember me" ET qui se connectent pendant qu'une attaque se produit ET qui ne se connectent pas à partir de leurs IP habituelles ET qui ne peuvent pas lire les CAPTCHAs. Seuls ceux qui peuvent dire non à TOUS ces critères - en particulier les bots et les vraiment malchanceux les personnes handicapées - seront refoulées lors d'une attaque de bot.
EDIT : En fait, j'ai pensé à un moyen de laisser passer même les utilisateurs qui ne sont pas capables d'utiliser le CAPTCHA pendant un "verrouillage" : à la place, ou en complément, de l'ouverture de session CAPTCHA de secours, offrir à l'utilisateur la possibilité d'obtenir un code de verrouillage à usage unique, spécifique à l'utilisateur, envoyé à son courrier électronique, qu'il peut ensuite utiliser pour contourner l'étranglement. Cela dépasse définitivement mon seuil d'ennui, mais puisque ce n'est utilisé qu'en tant qu'outil d'aide à la décision, je pense que c'est une bonne idée. dernier recours pour un minuscule sous-ensemble d'utilisateurs, et puisque c'est toujours mieux que d'être bloqué de son compte, ce serait acceptable.
(Notez également que aucun de cela se produit si l'attaque est moins sophistiquée que la méchante version distribuée que j'ai décrite ici. Si l'attaque ne provient que de quelques adresses IP ou ne touche que quelques noms d'utilisateur, elle sera déjouée beaucoup plus tôt, et ce avec pas de conséquences à l'échelle du site)
C'est donc la contre-mesure que je mettrai en œuvre dans ma bibliothèque d'authentification, une fois que je serai convaincu de son bien-fondé et qu'il n'existe pas de solution beaucoup plus simple que j'aurais manquée. Le fait est qu'il y a tellement de façons subtiles de faire les choses mal en matière de sécurité, et je ne suis pas au-dessus des fausses hypothèses ou des logiques désespérément erronées. Alors, s'il vous plaît, tout retour d'information, toute critique et toute amélioration, toute subtilité, etc. sont très appréciés.