Très bien, assez de calage; voici ce que j'ai trouvé jusqu'ici
(désolé, long post à venir. Soyez courageux, mon ami, le voyage en vaudra la peine)
Combiner les méthodes 3 et 4 de la publication d'origine dans une sorte de liste blanche `` floue '' ou dynamique, puis - et voici l'astuce - ne pas bloquer les adresses IP non sur liste blanche, juste les étrangler en enfer et revenir .
Notez que cette mesure vise uniquement à contrecarrer ce type d'attaque très spécifique. En pratique, bien sûr, cela fonctionnerait en combinaison avec d'autres approches de bonnes pratiques d'authentification: limitation du nom d'utilisateur fixe, limitation par IP, stratégie de mot de passe fort appliquée par code, connexion de cookie non limitée, hachage de tous les équivalents de mot de passe avant de les enregistrer, jamais en utilisant des questions de sécurité, etc.
Hypothèses sur le scénario d'attaque
Si un attaquant cible des noms d'utilisateur variables, notre limitation de nom d'utilisateur ne se déclenche pas. Si l'attaquant utilise un botnet ou a accès à une large plage d'adresses IP, notre limitation IP est impuissante. Si l'attaquant a pré-gratté notre liste d'utilisateurs (généralement possible sur les services Web d'enregistrement ouvert), nous ne pouvons pas détecter une attaque en cours basée sur le nombre d'erreurs «utilisateur non trouvé». Et si nous imposons une limitation restrictive à l'échelle du système (tous les noms d'utilisateur, toutes les adresses IP), une telle attaque affectera l'ensemble de notre site pendant la durée de l'attaque plus la période de limitation.
Nous devons donc faire autre chose.
La première partie de la contre-mesure: la liste blanche
Ce dont nous pouvons être assez sûrs, c'est que l'attaquant n'est pas capable de détecter et d'usurper dynamiquement les adresses IP de plusieurs milliers de nos utilisateurs (+). Ce qui rend la liste blanche possible la mise en . En d'autres termes: pour chaque utilisateur, nous stockons une liste des adresses IP (hachées) à partir desquelles l'utilisateur s'est (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 de l'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, toutes les boîtes de nos utilisateurs, soit la connexion elle-même - et dans ces cas, nous n'avons plus de problème `` d'authentification '', nous avons un véritable pull-the de la taille d'une franchise -plug FUBAR situation
La deuxième partie de la contre-mesure: la limitation à l'échelle du système des adresses IP non reconnues
Afin de faire fonctionner une liste blanche pour un service Web d'enregistrement ouvert, où les utilisateurs changent fréquemment d'ordinateur et / ou se connectent à partir d'adresses IP dynamiques, nous devons garder une `` porte de chat '' ouverte pour les utilisateurs se connectant à partir d'adresses 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 le moins dérangés possible .
Dans mon schéma, cela est réalisé en définissant un nombre maximum très restrictif de tentatives de connexion infructueuses par des adresses IP non approuvées sur, par exemple, une période de 3 heures (il peut être plus sage d'utiliser une période plus courte ou plus longue selon le type de service), et rendre cette restriction globale , c.-à-d. pour tous les comptes utilisateurs.
Même une force brute lente (1 à 2 minutes entre les tentatives) serait détectée et contrecarrée rapidement et efficacement en utilisant cette méthode. Bien sûr, une force brute vraiment lente pourrait encore rester inaperçue, mais des vitesses trop lentes vont à l'encontre du but 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 de chat '' se ferme pendant un moment, mais notre porte d'entrée reste ouverte aux utilisateurs légitimes se connectant 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 lors d'une attaque - c'est-à-dire. pendant que la limitation était activée - seraient des utilisateurs sans cookies de connexion persistants qui se connectaient à partir d'un emplacement inconnu ou avec une adresse IP dynamique. Ces utilisateurs seraient incapables de se connecter jusqu'à ce que la limitation se dissipe (ce qui pourrait potentiellement prendre un certain temps, si l'attaquant maintenait son botnet en cours d'exécution malgré la limitation).
Pour permettre à ce petit sous-ensemble d'utilisateurs de se faufiler à travers la porte du chat autrement scellée, même si les robots la martelaient encore, j'utiliserais un formulaire de connexion `` de sauvegarde '' 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", incluez un lien indiquant " Connexion de sauvegarde sécurisée - HUMAINS UNIQUEMENT ( bots: pas de mensonge ) ". Blague à part, quand ils cliquent sur ce lien, donnez-leur un formulaire de connexion authentifié reCAPTCHA qui contourne la limitation à l'échelle du site. De cette façon, S'ils sont humains ET connaissent le bon login + mot de passe (et sont capables de lire les CAPTCHA), ils ne se verront jamais refuser le service, même s'ils se connectent depuis un hôte inconnu et n'utilisent pas le cookie de connexion automatique.
Oh, et juste pour préciser: Comme je ne considère captchas pour être généralement le mal, l'option de connexion « backup » serait seulement apparaît alors que la limitation était actif .
Il est indéniable qu'une attaque soutenue comme celle-ci 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 petit sous-ensemble d'utilisateurs, à savoir les personnes qui n'utilisent pas le "Souviens-toi de moi" et se connecte alors qu'une attaque se produit ET ne se connecte à aucune de leurs adresses IP habituelles ET qui ne peut pas lire les CAPTCHA. Seuls ceux qui peuvent dire non à TOUS ces critères - en particulier les robots et les personnes handicapées vraiment malchanceuses - seront refusés lors d'une attaque de bot.
EDIT: En fait, j'ai pensé à un moyen de laisser passer même les utilisateurs confrontés à CAPTCHA pendant un `` verrouillage '': au lieu ou en complément de la connexion de sauvegarde CAPTCHA, offrez à l'utilisateur la possibilité d'avoir un usage unique , code de verrouillage spécifique à l'utilisateur envoyé à son e-mail, qu'il peut ensuite utiliser pour contourner la limitation. Cela dépasse définitivement mon seuil de `` gêne '', mais comme il n'est utilisé qu'en dernier recours pour un petit sous-ensemble d'utilisateurs, et comme il bat toujours le verrouillage de votre compte, ce serait acceptable.
(Notez également que rien de tout cela ne se produit si l'attaque est moins sophistiquée que la mauvaise version distribuée que j'ai décrite ici. Si l'attaque provient de quelques adresses IP ou ne touche que quelques noms d'utilisateurs, elle sera contrecarrée beaucoup plus tôt , et sans conséquences à l'échelle du site)
Donc, c'est la contre-mesure que je vais mettre en œuvre dans ma bibliothèque d'authentification, une fois que je suis convaincu que c'est sain et qu'il n'y a pas de solution beaucoup plus simple que j'ai 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 de faire de fausses hypothèses ou d'une logique désespérément imparfaite. Alors s'il vous plaît, tous les commentaires, critiques et améliorations, subtilités, etc. sont très appréciés.