Aller au menu du forum Aller au contenu du forum Aller à la recherche dans le forum
Logo Khaganat
Menu principal

Bloquer les Bots

deed

Bonjour, je voudrais qu'on travail à un tuto pour le blocage des Bots !

On peut partir de ce tuto :
https://wiki.blablalinux.be/fr/securisation-npm-fail2ban-geoip2

Alors par contre , c'est Nginx simple à la place de NPM et sans Docker si possible.

Voila, pour commencer, vous en pensez quoi ? C'est trop ou pas assez ?

Merci

Zatalyz

Ha oui, en effet, c'est intéressant.

La logique s'adapte assez facilement avec d'autres techno, docker n'a rien de vital.
Je ne suis pas forcément fan de geoip, mais quand j'avais fait les stats sur mes ip bloquées, on avait clairement quelques zones qui se détachait. Là par exemple, il ne bloque pas les USA, alors qu'ils sont aussi pénibles que la Russie, la Chine et le Brésil. Et par ailleurs tous les serveurs de ces pays ne sont pas à bloquer. Il bloque l'Irlande, sans doute pour AWS, mais du coup sur un serveur qui reçoit des mails des commandes d'Amazon, ça risque d'être un souci. Ok, c'est une façon d'empêcher ses utilisatrices d'utiliser Amazon :D
Idéalement, il faudrait en réalité repérer les plages d'adresses problématiques (généralement toutes d'un même datacenter), ça c'est plus utile à bloquer, et il y a moins de risque de bloquer un utilisateur légitime. Dans le cas du mail, je sais que j'ajoute en liste autorisé les ip des fournisseurs mails (dont amazon, aliexpress, etc, quand quelqu'un me dit que le mail n'arrive pas).

Mon idée (pas mise en place) était d'avoir un domaine "honeypot" : si une ip le visite (au delà du robots.txt qui dira "allez au diable), vu qu'il ne fournit pas de contenu, n'est pas référencé, etc, l'ip est ajouté à une liste de ban. Un petit cron une fois par jour pour analyser toutes ses ip, en sortir la plage quand ça semble utile, puis l'info est relayée aux autres serveuers : "bloquez la plage d'ip X.X.*  pour un bon mois, c'est des fermes de bots !".

Note que le tuto utilise iptables et fail2ban, de mon côté je passe plutôt à nftables et reaction dans ce genre d'usage, la syntaxe est plus simple à gérer (pour reaction) et nftables est puissant.

deed

Context, il est auto-hébergé en vdsl avec des ordis de récup et en Belgique.

je suis pour nftables d'ailleurs il faut que je regarde si Proxmox à changer

Zatalyz

Entre ton message, et le fait qu'un bot (un très con, heureusement pour moi) a fait tomber Hexagora dernièrement, je me replonge dans les nouveautés de Reaction.

Il y a eu pas mal d'avancée ces derniers temps, et entre autre la prise en compte des masques des ip :
https://reaction.ppom.me/reference/pattern/#ipv4mask-and-ipv6mask, ce qui semble au top pour les bots qui changent les ip à chaque tentative. Je suis un peu incertaine des valeurs, mais je me dis : même si on ban des datacenters genre AWS, on s'en fout non ? Pas comme si on avait besoin que les gafams accèdent à nos serveurs.

Actuellement je suis partie sur des patterns de ce genre :

  patterns: {
    ip: {
    // IPv4 et IPv6, et masque des ipv6.
      type: 'ip',
      ipv6mask: 64,
      ignore: [
        '127.0.0.1',
        '::1',
      ],
    },
    ipmask: {
      // Uniquement utilisé pour les filtres les plus aggressifs, risque de trop ban sinon !
      type: 'ip',
      // ipv4 : 24 = tout le dernier bit, soit toute ip du type a.b.c.* (tout est dans le joker).
      ipv4mask: 24,
      // ipv6 : 48 = ban des datacenters. 56 est un peu moins excessif. 64 est une norme de particulier.
      ipv6mask: 56,
      ignore: [
        '127.0.0.1',
        '::1',
      ],
    },
  },

"ip" sera utilisée sur les filtres "softs" (du genre : un humain pourrait faire l'erreur, tant qu'il ne s'acharne pas), et "ipmask" sera utilisée pour les trucs qu'on a repéré comme étant de l'attaque pure et simple. Par exemple, dans mes regex apache qui déclenchent des bombes (ban d'un mois, et bientôt : de datacenter entiers !), j'ai ce genre de ligne :

@'^<ip> ☆ .*☆ .* ☆ 404 ☆ .* ☆ "(GET|POST) .*(wp-login|typo3|drupal|joomla|authDS_Store|cpanel|roundcube).*"', => là c'est forcément de l'attaque, puisque nous n'avons pas wordpress, typo3, drupal, etc. (ne vous focalisez pas sur les étoiles ; je reformate mes logs apaches pour faciliter les regex).

Il y a un risque que cela bannisse des gens qui utilisent un VPN ou un truc du genre dans le voisinage de méchants bots. Ou, comme moi qui suis chez OVH telecom => potentiellement collatérale de vrais serveurs ? Ou encore : si des téléphones sont infectés, ça va ban des antennes relais et donc pas mal de gens. Mais en réalité je ne sais pas à quel point ce risque est réel ; par ailleurs vu que jabberfr applique des politiques différentes, au "pire", suffit de dire sur xmpp "c'est normal que le site soit down ?" (nan, c'est qu'on t'a bannit, muhahahaha). Blague à part, il s'agit de voir le risque réel de dommages collatéraux, que j'estime très bas, mais je peux me planter, et on peut viser des plages plus réduites.

deed

dans mes 10 minutes où j'ai essayé de bannir des ip manuellement , c'est etat unis, chine, russie et allemangne (herzer)
A part le dernier, pour l'instant , ça me derange pas.

FrancoisA

Je te comprends Deed, car à priori les États-Unis, la Chine et la Russie ne sont pas des internautes francophones, donc pas la cible de Khaganat.
Ex Ingénieur système ayant travaillé plus de 20 ans pour une ESN (Entreprise de Service Numérique) nouvel acronyme pour désigner une SSII.
Système d'exploitation : Zorin OS 18.1 Core

deed

mise à jour du script

https://joplin.blablalinux.be/shares/SDdcZYIFiccbk7MSe807PE

si quelqu'un veut donner son avis ??

(c'est du home en vdsl)

Zatalyz

C'est dense, et hyper intéressant. Mais dense ! Merci pour le lien, c'est de bonnes bases, par contre je trouve cela difficile à exploiter "tel quel" : je ne saurais pas trop comment utiliser et mettre en place certains morceaux, certaines règles me semblent un peu légères (= peu durables dans le temps, vite contournées, comme avec les ip Tencent). Cependant comme il explique la logique, ça devrait permettre d'affiner.

Et là pour le coup c'est à la fois intéressant et... j'en veux plus (mais je vais regarder le reste de ce qu'il a partagé) : bien comprendre les patterns qu'il détecte.

Je ne pense pas l'utiliser tel quel, mais l'intégrer dans notre logique.

Je pense de mon côté qu'il y a trois niveaux :
- Un set d'ip identifiées comme problématiques, qu'on va bannir sur des temps longs (1 à 6 mois sans souci) et très certainement par plage d'ip ; ce genre de set devrait juste être partagé sur nos reseaux et bloqué au niveau des proxy (via nftables). La détection de ces ip pourrait passer par du honeypot, avec potentiellement greylisting sur certains acteurs (genre si on veut être référencé par certains moteurs de recherche pour ce qui concerne le web), ainsi que par l'analyse des logs de Reaction.
- Des comportements tellement problématiques que ça sera géré direct avec Reaction et donc bloqué ensuite via le pare-feu.
- Des comportements qui sont ok... suivant le flux, et là c'est avec nginx/apache qu'on commence à les gérer.

Exemple qui ne pose pas question : le bot qui scanne "bêtement" si on a un "wp-login" => c'est du pur badbot, ça je bannis 1 mois sans souci.
Exemple qui me pose plus question : les bots d'indexeurs. Dans l'absolu, on n'est pas contre se faire trouver par les moteurs de recherche. Et j'inclue dans ces derniers même les IA, puisque la recherche par LLM est en train de remplacer l'ancienne. Mais ces bots posent soucis à cause de leur fréquence de visite. Une fois par jour, avec une navigation tranquille sur nos pages ça va ; par contre scanner tout notre site non stop c'est juste une charge trop lourde. Donc on doit leur balancer une erreur 429 : Too Many Requests. Ça, c'est géré par nginx/apache.

Là où ça devient complexe, c'est que le bot qui reçoit une 429 et se calme dans la foulée est OK, mais il y en a qui vont continuer à frapper à la porte non-stop (ouais, les bots, c'est aussi cons que leurs concepteurs) et ces requêtes continuent de peser sur nginx. Donc à un moment : trop de 429 sur une ip = ban par le firewall. Pour le bot ce sera comme si le serveur était tombé. Là dessus, je serais d'avis de bannir 24h. Faut pas pousser. Mais aussi d'analyser si on a certains qui abusent toutes les 24h => ils passent dans la liste à virer.

Maiiiiis ça veut aussi dire, très certainement, questionner ce qu'on fait de Google et Bing (entre autre). Et vu ce que dit blablalinux, sans doute des instances Searx. Est-ce qu'on souhaite les bannir définitivement si elles se comportent mal ? Est-ce qu'on les met dans un set spécial "vous êtes des chieuses, mais on vous autorise à l'être entre minuit et 2h du matin pour alimenter vos index et qu'on nous trouve" ?

Concernant le partage des IP bannies à long terme, mon idée est la suivante :
- Sur chaque serveur, quand Reaction banni une ip, cela alimente un fichier de log avec la raison (et la durée).
- Ces logs sont envoyés à un serveur central (une fois par jour ?)
- Ils sont analysés avec un script bash, histoire de voir les ips qui reviennent, encore et encore, ou bien celles dont les "raisons" justifient un ban à long terme. Les ips sont amalgamé, si cela concerne des plages, on se contente de la plage. On publie alors sur ce serveur central notre liste d'ip bannies (en mode API idéalement, mais ce sera ptet plus basique) et nos autres serveurs viennent se servir pour alimenter leur set "banni à long terme".

C'est assez basique. Très probablement, je pourrais utiliser la même logique dans les deux cas : les logs accessibles en lecture via le web (oui, *peut-être* derrière une api, ou pas), et des processus internes pour en faire un truc. Avec mes connaissances actuelles, ça serait wget+bash mais les devs auront ptet plus pertinent à proposer.

pulkomandy

Salut!

Je peux donner quelques infos sur ce que je fais chez moi.

0. Les bases

- Pour Google, Bing et les moteurs de recherche classique: j'ai configuré un "Crawl-Delay" dans le fichier robots.txt. Cela leur demande de ne pas faire plus d'une requête toutes les quelques secondes (on choisit combien) et réduit leur traffic de façon acceptable. C'est bien respecté par les crawlers des moteurs de recherche.
- Pour les scrappers "honnêtes" (bot SEO par exemple, mais certains trucs de LLM aussi): blocage par une liste d'identifiants de bots dans le robots.txt avec une règle "Disallow /"

Là on a les bases pour les trucs implémentés correctement. Ensuite il faut lutter contre les trucs malveillants et/ou mal fichus.

1. Blocage des bots ne respectant pas le robots.txt

Dans mon robots.txt j'ai mis un Disallow /url-interdite.
L'URL en question est également présente dans les en-têtes ou en bas de page de mon site, avec un texte disant "si vous êtes un humain, ne cliquez pas ici vous allez vous faire bannir". Le lien est également en nofollow.

Si un bot accède à cette URL, c'est blocage direct.

Pour implémenter le blocage: règle spécifique dans le serveur web, qui retourne une erreur spécifique (j'ai choisi le code HTTP 429). J'ai ensuite une règle fail2ban qui scanne les logs de mon serveur HTTP pour trouver ces erreurs 429 et bloquer les IP correspondantes au niveau du pare-feu. Le même principe est utilisé dans les sections suivantes.

On peut aussi faire la même chose pour plein d'URLs "classiques" utilisés par des scanners de vulérabilités qui cherchent des wordpress, phpmyadmin, et autres nids à failles connus.

2. Filtrage par user agent

Pour certains bots ne respectant pas le robots.txt (typiquement, ne respectant pas le crawl-delay), mais qui s'identifient avec un user agent unique, filtrage des user agents "interdits" au niveau du serveur web.

3. Les bots "cachés"

Comme je ne suis pas le seul à mettre en place ce genre de mesures, il y a maintenant des bots qui se déclarent avec un user agent "classique" (typiquement une version de Chrome, mais il commence à y avoir aussi du Firefox). On peut tenter de bloquer les IPs "non résidentielles" quand on repère une plage d'IP (il y a eu Tencent et Alibaba il me semble, mais il y en a de nouvelles régulièrement).

Là, on peut au choix bannir ces IPs "préventivement" de façon statique dans le pare-feu, ou bien attendre la première requête sur le serveur web pour réagir.

4. Les proxys résidentiels

C'est la dernière nouveauté. Comme les IPs de datacenters sont de plus en plus mal vues par les sites internets, les robots utilisent maintenant des relais déployés via des applications sur des téléphones ou des télés connectées chez plein de gens.

J'ai lu un blog de quelqu'un indiquant que son site avait reçu des requêtes venant de un quart de l'espace d'addresage IP. En gros, quasiment toutes les IP possibles vont être utilisées, et ça devient très difficile de faire un blocage par IP (même les pare-feus ne suivent plus: il y a tellement d'IPs qu'il faut plusieurs Go de mémoire juste pour stocker la liste des IP bloquées...). Et chaque IP ne va typiquement faire qu'une seule requête, donc le blocage est peu efficace si on attend d'avoir plusieurs requêtes avant de bloquer.

Le blocage géographique peut être une solution (si vous acceptez de restreindre l'accès pour certains pays, mais il risque d'y en avoir de plus en plus tant qu'il n'y aura pas de législation pour interdire ces pratiques).

Chez moi, j'ai fini par bloquer toutes les versions un peu anciennes de Chrome et Firefox pour Windows. Comme ces robots ont tendance à utiliser des user agents ne correspondant pas à la toute dernière version, ça limite assez les problèmes. Et les gens utilisant un autre OS ou un autre navigateur ne sont pas impactés.

5. Pourquoi ces attaques?

Ce que j'observe, c'est que les interfaces web de dépôts git comportent une quasi infinité de liens (historique des versions, puis affichage de chaque fichier dans chaque version, etc). C'est le "tarpit" parfait pour un robot scrapper d'entraînement LLM, tout plein de contenu à lire!

Je pense qu'avec un site comportant moins de liens, il y a moins de problèmes, le robot va rapidement en faire le tour et aller voir ailleurs.

Dans certains cas j'ai fini par mettre mon interface web de dépôt Git accessible uniquement après login.

6. Conclusion

Je vous donne volontairement peu de détails spécifiques sur ma configuration.

Le déploiement de solutions "universelles" (Anubis, iocaine, ou de façon générale une config standardisée avec une liste de user agent connue) pousse les développeurs de bots à trouver un contournement spécifique pour la solution la plus populaire. Le seul moyen de leur rendre la vie impossible, c'est que chaque site web aie ses propres règles. Donc, adapter votre configuration à ce que vous observez est la bonne démarche. Et aussi choisir vos propres durées de ban, pour pas que tout le monde aie la même.

J'arrive à garder le traffic à un niveau acceptable chez moi (pour un serveur auto hébergé sur ma connexion fibre à la maison, sans que ça pénalise les autres utilisations du serveur et de la connexion internet), mais régulièrement (tous les quelques mois) je dois mettre à jour ma liste de bans suite à un nouvel user agent ou une nouvelle forme d'attaque. Donc il faut garder un oeuil sur les accès au serveur web, c'est pas vraiment un truc qu'on peut configurer une fois et laisser tourner tout seul :(

7. Bonus: le monitoring.

J'utilisais awstats pour surveiller le traffic sur mon site. ça marchait bien pour repérer les pics de traffic et autres trucs louches. Mais awstats sur mon serveur n'arrive plus à suivre quand il y a des millions de requêtes à scanner dans les logs.

Je l'ai remplacé par goaccess, il est moins bien, mais plus rapide.

Bon courage!

Zatalyz

Merci Pulkomandy pour ces infos :)

CitationDans mon robots.txt j'ai mis un Disallow /url-interdite.
L'URL en question est également présente dans les en-têtes ou en bas de page de mon site, avec un texte disant "si vous êtes un humain, ne cliquez pas ici vous allez vous faire bannir". Le lien est également en nofollow.

Ho, ça, c'est tout simple et génial. Aucun risque qu'un "légitime" suive, et c'est trop tentant pour un bot néfaste par contre, donc une chance de le chopper tout de suite. Je bloque déjà sur des mot-clés d'url régulièrement recherché, mais parfois le comportement des bots est étrange et ces mots-clés arrivent tard. Là, on leur ajoute un appât.

CitationLe seul moyen de leur rendre la vie impossible, c'est que chaque site web aie ses propres règles.
Pas faux... Il y a certains trucs qui peuvent se partager, mais d'autres où en effet, ça se fait dépasser. C'est toujours une course de toute façon. On peut se partager des trucs en privés aussi, mais... dans le fond, les grandes lignes sont là, et reste surtout à appliquer.

Licences Mentions légales Accueil du site Contact Inclusion