J’ai un utilisateur qui est la cible d’attaques répétées, soit par une personne, soit par un script, qui sollicite l’endpoint forgot_password de nombreuses fois par jour en utilisant son adresse e-mail. Cela dure depuis plusieurs jours. Comme cela déclenche l’envoi d’e-mails, cela peut également constituer un abus pour le système. À partir du fichier d’accès nginx (access.log), j’ai pu identifier l’adresse IP responsable pendant une partie de cette période et l’associer à un autre utilisateur du système, auquel j’ai envoyé un message d’avertissement, mais cela pourrait ne pas suffire. J’ai également ajouté cette adresse IP dans Admin > Logs > IP filtrées ; cependant, je ne suis pas certain de l’effet réel de cette action, au-delà d’une éventuelle interdiction temporaire de connexion. L’adresse IP peut changer et a déjà changé ; il s’agit probablement d’une adresse dynamique, mais quelqu’un pourrait aussi activer un VPN et recommencer.
Avez-vous des suggestions pour gérer cette situation ?
Bonjour Dan, quelques questions d’abord, si cela ne vous dérange pas.
Avez-vous suspendu l’utilisateur ?
Autorisez-vous tout le monde à créer un compte ou approuvez-vous tous les nouveaux comptes ?
Vous pouvez suspendre l’utilisateur en allant sur admin/users/list/active et en cliquant sur le nom de l’utilisateur fautif. Une fois sur sa page d’informations, descendez jusqu’à Permissions et cliquez sur Suspendre. Assurez-vous que l’utilisateur est déconnecté, car la suspension pourrait ne prendre effet qu’après sa déconnexion. S’il est toujours connecté, en haut à droite de cette même page, vous trouverez une boîte bleue pour le déconnecter vous-même. Une fois déconnecté, il ne pourra plus se reconnecter avec ses anciennes identifiants.
Si vous approuvez les nouveaux comptes – et que le « coupable » persiste dans son comportement (et que vous êtes certain de son identité) – l’utilisateur devra attendre que vous approuviez son compte. Comme vous avez déjà un (ou plusieurs ?) adresses IP qu’il a utilisées, si un nouvel utilisateur apparaît avec cette adresse IP, vous savez quoi faire.
Vous pouvez également consulter les préférences de l’utilisateur et, sous Compte, voir ses appareils récemment utilisés, ce qui devrait également vous donner les adresses IP utilisées pour se connecter. Cela pourrait vous fournir des adresses IP supplémentaires à filtrer.
C’est là que l’approbation des comptes devient utile.
Comment cette personne a-t-elle pu accéder au profil d’un autre utilisateur pour demander une réinitialisation de mot de passe dès le départ ? C’est la question importante.
Évidemment, cette recherche ne permet pas de filtrer les requêtes légitimes. J’ai examiné manuellement les requêtes d’aujourd’hui et d’hier et j’ai repéré quelques requêtes légitimes (qui ne provenaient pas de l’adresse IP répétée). La grande majorité provient d’une adresse IP répétée qui change tous les quelques jours. Cela n’est pas très grave pour le système, mais cela l’est pour l’utilisateur qui en est la cible. Je pense que la seule chose que je puisse faire est de configurer nginx pour bloquer par adresse IP, mais comme celle-ci change… peut-être que si je vérifie et mets à jour manuellement pendant une semaine ou deux, la personne arrêtera d’essayer, mais probablement seulement pendant un court moment. La victime indique que cela lui est arrivé pour la première fois il y a environ 1,5 an.
C’est vraiment énervant si quelqu’un décide de déclencher le lien « mot de passe oublié » encore et encore à votre place… mais nous ne pouvons pas bloquer l’utilisateur pour les réinitialisations de mot de passe sur cette base, car empêcher quelqu’un de réinitialiser son mot de passe est aussi une forme de harcèlement.
Je pense que nous avons une limite de débit ici de l’ordre de plusieurs fois par minute. Pouvez-vous examiner ce chemin de code @riking et confirmer qu’il fonctionne toujours ? Nous pourrions l’augmenter, mais cela ne peut pas couvrir de manière sûre « quelques fois par jour ».
De plus, bannir une adresse IP via Admin, Journaux, IP filtrées devrait empêcher cette adresse IP de demander une réinitialisation de mot de passe, je pense, et nous devrions également vérifier que cela fonctionne comme prévu @riking.
Il n’existe aucune option pour éviter de recevoir un e-mail de réinitialisation de mot de passe, même si j’ai activé l’authentification à deux facteurs (2FA) avec des clés de réinitialisation.
Certains sites que j’ai visités affichent votre adresse IP avant même que vous ne demandiez une réinitialisation de mot de passe, en précisant qu’elle sera envoyée à votre adresse e-mail.
Tout cela n’est qu’une très légère nuisance, car je consulte rarement cette adresse e-mail pour autre chose. Tous les e-mails sont filtrés et configurés pour « marquer le message comme lu », afin qu’ils n’apparaissent pas comme des messages à lire. J’ai configuré ce filtre en janvier et je viens de regarder le dossier (libellé dans Gmail) aujourd’hui.
L’image que je n’ai pas pu inclure dans la 1re réponse.
Lorsque Gmail reçoit plusieurs messages ayant le même objet, il les regroupe.
Je suppose qu’après 100 messages identiques, il passe simplement aux 100 messages suivants.
Une solution de contournement simple consiste à modifier votre adresse e-mail de test@gmail.com en test+UNSECRETSEULVOUSLESAVEZ@gmail.com.
Les e-mails de Discourse seront acheminés vers votre Gmail habituel, mais personne ne pourra vous envoyer de demande de réinitialisation de mot de passe, et personne ne pourra deviner un hachage sécurisé.
Je pense que, dans la pratique, c’est la meilleure chose à faire dans ce cas.
Nous pourrions limiter le taux de ces demandes à une fois par semaine, et cela resterait tout de même ennuyeux. En utilisant l’adressage avec +, vous éliminerez complètement votre problème.
Nous pouvons limiter le taux de requêtes pour un utilisateur donné, en plus des requêtes en provenance d’un lieu spécifique (une limite qui fonctionne très bien actuellement). Pourquoi ne pas offrir aux utilisateurs jusqu’à 2 jetons de réinitialisation non expirés avant de leur dire : « veuillez simplement attendre l’e-mail » ?
Une autre approche consiste à limiter dans le temps les e-mails de réinitialisation de mot de passe, par exemple à 3 heures entre les jetons. Si une demande d’e-mail de réinitialisation de mot de passe est effectuée avant la fin de la période de refroidissement, un message simple peut être affiché : « Nous avons déjà envoyé un e-mail de réinitialisation de mot de passe, veuillez vérifier votre boîte de réception. Si l’e-mail n’arrive pas dans les 2 heures suivantes, contactez l’administrateur du site pour obtenir de l’aide à l’adresse %contact_email%. »
J’ai modifié l’e-mail sur le forum en « email+quelquechose@gmail.com » et j’ai effectué un test en navigation privée sur un autre navigateur. Cela a quand même fonctionné. Peut-être parce que la demande est toujours faite uniquement avec le nom d’utilisateur et jamais avec l’adresse e-mail réelle.
Pour le moment, toutes les fausses demandes ont cessé, car Dan a probablement résolu le problème soit en privé avec la personne concernée, soit par d’autres moyens.
Si vous aviez une option de question de sécurité (à activer au niveau de l’utilisateur), je suis sûr que cela réduirait considérablement le nombre de demandes, car le troll ne connaîtrait tout simplement pas la réponse. « Quel est votre film préféré ? » ou « Quel est votre restaurant préféré ? ».
Merci à tous pour vos réponses rapides dans la tentative de résoudre ce problème, qui, malheureusement, semble être le premier, et espérons-le, le dernier.
Je suppose que le problème vient du fait qu’on peut simplement scraper un forum pour récupérer les noms d’utilisateurs, puis déclencher une tempête de demandes de réinitialisation de mot de passe.
Peut-être devrions-nous ajouter un mode où l’email doit être saisi exactement pour déclencher la réinitialisation de mot de passe ? Réinitialisation stricte du mot de passe, désactivée par défaut ?
Je pense que même être harcelé une fois par semaine est déjà trop ; nous ne pouvons pas résoudre ce problème en appliquant une limitation de débit.
Existe-t-il un moyen d’offrir une ou deux « réinitialisations gratuites » d’abord, avant d’imposer la saisie exacte, dans un certain laps de temps ? Ou peut-être d’ajouter la saisie exacte uniquement pour un compte individuel après un certain nombre de réinitialisations, mais automatiquement au niveau global ?
Certains d’entre nous littéralement ne savent même pas quel jour nous sommes, encore moins se souvenir sans faille de notre e-mail exact facilement.
@Chinaski, j’espère que cela sera résolu rapidement et enfin pour vous.
Merci à tous pour vos réponses. J’espère que la solution ci-dessus fonctionnera, car elle semble être le remède le plus direct pour le moment, mais je ne l’ai pas testée depuis que les sollicitations ont diminué. (L’utilisateur potentiellement malveillant affirme avoir désactivé les invités sur son Wi-Fi, mais nous ne pouvons pas être certains que cela en était la source.)
Avec des milliers d’utilisateurs actifs (nous sommes toujours en cours de migration vers Discourse), je comprends votre douleur. Ce problème revient constamment, avec des gens qui oublient quelle adresse e-mail ils ont utilisée, etc. C’est sans aucun doute l’une de nos demandes de support les plus fréquentes au fil des ans, c’est fou.
Exiger la saisie d’une adresse e-mail pour la fonctionnalité « Mot de passe oublié » ne sera certainement jamais une option par défaut de ce type.
Cependant, si un forum est assiégé comme dans le cas de l’OP, cela pourrait être un simple interrupteur que vous activeriez pendant quelques semaines pour mettre fin à cette astuce ennuyeuse.
J’ai resserré les règles afin que, dans le pire des cas, un utilisateur ne puisse obtenir que 6 réinitialisations par jour. Cela devrait limiter les e-mails dans une certaine mesure.
J’ai également suivi le conseil de @riking ici : nous respectons désormais les adresses e-mail filtrées. Ainsi, si vous bloquez une IP en tant qu’administrateur, cette IP ne peut plus participer à cette « fête ».
Une omission majeure ici, @riking, qui pourrait aider à l’autogestion un peu : l’e-mail de « réinitialisation du mot de passe » n’inclut pas l’adresse IP de la personne qui l’a initiée :
@codinghorror, que pensez-vous d’ajouter l’adresse IP de l’initiateur dans les e-mails de réinitialisation du mot de passe (nous pourrions même la masquer un peu) ? Cela permettrait une bien meilleure autogestion.
Jane est attaquée
Jane notifie l'administrateur du site que 12.12.12.12 continue de réinitialiser les mots de passe
L'administrateur bloque 12.12.12.12
Les gens ont accès à de nombreuses adresses IP, donc cela peut encore devenir un jeu du chat et de la souris, mais c’est au moins mieux qu’avant et les limites sont plus strictes.
Facebook utilise cette astuce, que je soutiens en partie d’implémenter :
Cela leur permet d’éviter d’inclure les adresses IP dans les e-mails ; ils les suivent simplement côté serveur et le lien contient un identifiant dans la base de données. Cela signifie donc que cela peut devenir une opération en un clic pour bloquer un abus.
Pour contexte, Facebook exige une adresse e-mail pour la réinitialisation du mot de passe (ils n’ont même pas de réinitialisation de mot de passe au sens traditionnel ; il s’agit simplement d’une connexion via e-mail).
J’ai examiné 100 requêtes fictives et j’ai décelé un motif, une utilisation possible d’un script.
Ce motif est cohérent dans l’ensemble des 100 requêtes fictives d’un même groupe dans Gmail.