Résistance aux bots

Allez, je lance le sujet/débat.

Comment gérez-vous le nombre tjrs + délirant de bots qui scannent nos sites ?

Pour ma part, cloudflare quand c'est possible, protection contre les bots, managed challenge pour tout ce qui ne vient pas d'Europe ou des USA, blocage de toute une série d'user agent.

Sinon, Crowdsec, avec notamment un scénario qui ban directement un bon nombre d'user agent.

J'ai vu passer anubis, un genre de challenge sans cloudflare, jamais testé, ça à l'air pas mal.

On rajoute le rate limit à l'échelle d'un serveur complet (déployé uniquement chez un client) face aux bots IA via NGinx.

J'essaie de convertir mes clients aux sites statiques quand c'est possible, très long combat pour bcp qui ont été biberonnés à wordpress. Mais wordpress, avec la masse de bots qui passent son temps à scanner tt le site, ça devient un vrai problème côté charge serveur.

Et vous, comment gérez-vous cela ?

Vaste sujet vraiment.
Je suis bousculé ces derniers temps dans ma petite stack hosting qui fonctionne pas trop mal depuis une vingtaine d'années...

J'ai vu passer anubis, un genre de challenge sans cloudflare, jamais testé, ça à l'air pas mal.

https://anubis.techaro.lol ?

A vrai dire j'ai plusieurs type de problèmes :

  • Les bots légitimes qui font n'importe quoi (facebook, claudebot...)
  • Les bot légitimes qui avant se comportait bien mais tu sens que ça devient compliqué (Google..)
  • Les bots / scrapers agressif clairement destiné à mettre off line le site (proxy résidentiel comportant parfois plusieurs millions d'adresses IP) ou a faire exploser les coûts d'hébergement si tu es sur un cloud avec du scale automatique.

Dans ces 3 cas, pour moi Crowdsec ne sert à rien.

Je détaille un peu le 3eme cas, celui pour lequel Cloudflare peut devenir indispensable.

L'ajout de Ngnix m'a permis de ne plus craindre l’épuisement des workers apache quand tu te retrouves à gérer 5000 nouvelles connexions en une minute.
Je sais, c'est un standard depuis de nombreuses années mais, pourquoi bouger quand ça marche... Je suis en cours de migrations sur presque toutes mes machines.

Ensuite, il va y avoir le problème des workers PHP et des requêtes BDD -> épuisement des ressources CPU.
et là, je joue en fonction du profil du bot le plus problématiques, l'agressif.

Celui qui te balance 5 req / sec sur une page de listing avec tous un tas de filtre et affiche max du nombre de produits.
Chaque requête faite avec une adresses IP unique que tu revois 3 semaines plus tard... pour une nouvelle requête du mếme genre.
Bien sur ce ne sont que des IP résidentiels (Orange SFR etc...) Sinon c'est pas drôle tu peux ban l'AS complet.

Le user agent change également (c'est évident, sinon, encore une fois ce n'est pas drôle).

exemple de stat sur une minute :

ASN ORGANISATION PAYS IPS_UNIQUES REQUETES
7018 ATT-INTERNET4 - AT&T Enterp... US - Etats-Unis 429 447
21928 T-MOBILE-AS21928 - T-Mobile... US - Etats-Unis 188 193
22773 ASN-CXA-ALL-CCI-22773-RDC -... US - Etats-Unis 130 136
20001 TWC-20001-PACWEST - Charter... US - Etats-Unis 124 132
20115 CHARTER-20115 - Charter Com... US - Etats-Unis 124 128
6167 CELLCO-PART - Verizon Busin... US - Etats-Unis 103 109
5650 FRONTIER-FRTR - Frontier Co... US - Etats-Unis 91 97
11426 TWC-11426-CAROLINAS - Chart... US - Etats-Unis 70 73
5089 NTL, GB GB - Royaume-Uni 66 72
6128 CABLE-NET-1 - Cablevision S... US - Etats-Unis 69 71
10796 TWC-10796-MIDWEST - Charter... US - Etats-Unis 64 65
33363 BHN-33363 - Charter Communi... US - Etats-Unis 62 64
14593 SPACEX-STARLINK - Space Exp... US - Etats-Unis 44 48
2856 BT-UK-AS BTnet UK Regional ... GB - Royaume-Uni 42 43
5607 BSKYB-BROADBAND-AS, GB GB - Royaume-Uni 38 42
209 CENTURYLINK-US-LEGACY-QWEST... US - Etats-Unis 39 39
[...]

Ce n'est pas idéal mais j'ai pour le moment 2 stratégies :

Firewall netfilter
L'avantage c'est que la requêtes n’atteint jamais Nginx / apache / PHP / site web
Je suis passé l'année dernière à nftables en remplacement de Iptables. incroyablement plus performant et fonctionnel. un impératif quand tu commences à jouer avec des grands volumes d'IP / CIDR. Mais cela demande un vrai effort d'adaptation quand tu connais bien Iptables.

Conf Apache suivant le bot
La l'IA est une grande aide pour faire une sorte de profil du bot et faire un conf apache spécifiques pour que dans certaines conditions (URL, longueur de chaîne, User Agent, référer etc.) apache réponde par une 429.
Du coup très peu de ressources CPU et la plupart du temps le bot croit que l'attaque réussit et se calme.

Je cherche encore à faire un truc 100% auto, car j'en ai marre de recevoir des alertes. J'ai vu que Nginx offrait énormément de possibilités par rapport a apache sur pas mal d'aspect (et notament intercaler des demande de preuve d'humanité) mais pas eu le temps de creuser encore.

Tiens pendant que je rédigeais ça recommence sur un client :

Stats sur la derniere minutes :

3106 IP uniques, 761 AS distincts, 3163 requetes

Chaque minutes plus de 3000 nouvelles IP qui bombardent une requête chacune.
Sur 761 AS différents... C'est vraiment relou.

Mais t'as des gens qui t'aiment pas toi !

Crowdsec, même avec les listes communautaires, ça ne limite pas le problème ?
Tu as pu identifier un pattern dans les requêtes ? Ou c'est vraiment du legit mais en masse ?
Sinon, je ne sais pas comment fonctionnent tes sites, mais tu as tenté de mettre un nginx en front, en reverse proxy, qui met en cache les réponses ? Ça soulage bcp Apache ça. Mais, il faut prévoir un mécanisme de purge du cache si nécessaire, et bien évidemment, toutes les exclusions qui vont bien.

Là, à part cloudflare pour bloquer en amont (protection contre les bots, managed challenge) ou éventuellement anubis pour filtrer avant d'arriver sur Apache. Je ne vois pas trop ce que tu peux faire.

L'objectif principal étant de solliciter le - possible apache.

Mais t'as des gens qui t'aiment pas toi !

Oui t'a vus hein :smiley: :smiley:
C'est un site Prestashop qui vends des armes.... J'ai aussi un client qui vend de l’alcool qui est bien embêté aussi...

Cette machine à déjà un Nginx en reverse proxy (mais je pense que je peux améliorer j'en suis au début avec lui).
je mitigue avec le FW et le type des requête... Pour cette vague la, l'attaquant à visiblement compris dans quel situation que lui répondais par des 429 et il c'est adapté...

J'ai joué avec le FW un peu agressivement. Ça ira bien pour ce soir et cette nuit j'affinerai demain.

857 IP uniques, 349 AS distincts, 901 requetes

Le serveur peut largement encaisser ce genre de charge :

Mais le métier devient juste chiant en fait.

Là concrètement tu dois bloquer en amont...
Donc soit cloudflare + crowdsec avec le bouncer crowdsec.
Ou alors directement crowdsec en local + listes communautaires qui bloque sur le parefeu, éventuellement tester anubis (je ne l'ai jamais testé lui, mais à priori c'est de ça dont tu as besoin si tu n'utilises pas CF).

Avec prestashop, tu ne peux quasiment rien mettre en cache au niveau du cdn/reverse proxy, vu que cet idiot balance des cookies à tt le monde. Et si chaque IP ne "ping" qu'une fois, Crowdsec ne fera de toute façon pas de miracles, sauf aider un peu via les listes communautaires qui peuvent "pré bannir" 30k ip facilement.

j'aimerai éviter CF autant que possible le client s'en plaignait.

Tu parles de https://anubis.techaro.lol ?

oui, je parle bien de ça.

Je n'ai jamais testé perso, mais ça pourrait t'aider.

A tester sur un autre serveur pour te faire le main.

https://github.com/TecharoHQ/anubis

Effectivement 20K étoiles on peut mettre des proof Of Work sur certaines pages uniquement ça a vraiment l'air chouette je vas regarder !

Tu me feras un retour ? Je n'ai jamais testé, vu que j'utilise généralement cloudflare.

Merci pour ce sujet.

Pour le cas où ça pourrait intéresser quelqu'un, en ce qui me concerne, petit blog amateur, autrefois sous Wordpress, que j'ai passé en Mediawiki récemment. Ça m'a causé beaucoup de soucis avec les bots IA qui faisaient exploser le nombre de requêtes en crawlant tous les liens techniques, notamment en demandant tous les diffs entre toutes les versions précédentes de toutes les pages!

Après avoir pas mal galéré, je crois que j'ai finalement réussi à m'en sortir avec:

Cloudflare free: (managed chalenge sur toutes les pages spéciales)

  • Extension:CrawlerProtection (blocage de la plupart des pages "techniques" pour les anonymes)

C'était juste mes deux sous de contrib pour le cas où ça pourrait servir à quelqu'un.

Oui, Cloudflare fait un excellent job et c'est gratuit.
Mais certains sites ne peuvent pas utiliser CF en fonction de leur activité, d'autres ne veulent pas utiliser CF (c'est limite au niveau RGPD, ou tout simplement une solution US).
Perso, j'essaie de rester sur des solutions européennes, mais Cloudflare est vraiment trop bon.

Oui ok mais Il faut quand même parfois payer (et c'est normal) :

  • Si tu veux des log détaillés de ce qui se passe en entrée
  • Si tu veux mettre plus de 5 règles
  • ...

J'ai eu un cas ou CF balançait des 502 incompréhensibles aléatoirement, ils ont aussi des incidents.
Le proof of work ou le mode under attaque par exemple constitue quand même une friction pour un site ecommerce par ex.
Il y a aussi tout un tas de good bot qui peuvent se trouver exclus.

Quand ton client est derrière un CloudFlare le firewall de ton serveur ne sert plus à rien (car il ne voit que le IP de CF qui sont en liste blanche), tu peux avoir de grosses surprise du coup car Crowdsec / F2ban / etc. ne servent plus à rien.

oui, tout à fait, après, tu as un bouncer Cloudflare pour Crowdsec, qui va détecter les IPs et les bloquer directement sur Cloudflare (ce qui est impossible avec le CDN Infra OVH).
Et si ton serveur ne voit que les IPs Cloudflare, c'est qu'il est mal configuré :wink:

Et si ton serveur ne voit que les IPs Cloudflare, c'est qu'il est mal configuré

Tu m’intéresses là, j'ai bien les IP dans les log apache ou nginx mais netfilter ne les voit pas et j'ai cru comprendre que ce n’était pas possible.
Une sombre histoire de couche L7 (ou l'ip source est transmise par CF) mais quei ne peut être accédé par le Kernel (cette partie n'est pas mon fort).

Ha mais tu ne pourras pas filtrer au niveau du parefeu, c'est impossible ça.
Mais tu dois voir les bonnes IPs dans les logs apache/nginx.

Ensuite, si tu veux bloquer directement sur CF avec crowdsec, tu dois utiliser le bouncer crowdsec, ou en programmer un toi-même.
C'est ce bouncer : https://docs.crowdsec.net/u/bouncers/cloudflare-workers/

Il y avait le bouncer nginx aussi, pour bloquer au niveau de NGinx, lui doit fonctionner par contre : https://docs.crowdsec.net/u/bouncers/nginx/

Sinon le bouncer Apache, que je n'ai jamais testé : https://docs.crowdsec.net/u/bouncers/apache_bouncer/

Donc soit tu bloques sur CF directement, soit tu bloques via nginx/apache.
Mais tu ne pourras jamais bloquer au niveau du parefeu.

toujours pour mon client vendeur d'armes, stats de minuit à 11h00 :

196280 IP uniques, 4269 AS distincts, 507216 requetes

plus de 42 000 AS différents... sans déconner les gars :downcast_face_with_sweat:

Et encore ça pourrait être pire car :
Liste des pays DROP par le firewall :

AE Emirats arabes unis
AR Argentine
AZ Azerbaidjan
BD Bangladesh
BO Bolivie
BR Bresil
BY Bielorussie
CL Chili
CO Colombie
DZ Algerie
EG Egypte
ET Ethiopie
HU Hongrie
IQ Irak
IR Iran
JO Jordanie
KE Kenya
KP Coree du Nord
KZ Kazakhstan
MA Maroc
MX Mexique
OM Oman
PA Panama
PK Pakistan
PS Palestine
PY Paraguay
SC Seychelles
SN Senegal
SY Syrie
UA Ukraine
UY Uruguay
UZ Ouzbekistan
VE Venezuela
VN Vietnam
ZA Afrique du Sud

Liste des AS drop par le FW :

AS701 601 IPv4 12 IPv6 UUNET - Verizon Business, US (US)
AS4837 553 IPv4 295 IPv6 CHINA169-BACKBONE CHINA UNICOM China169 Backbone, CN (CN)
AS5089 101 IPv4 2 IPv6 NTL, GB (GB)
AS5607 34 IPv4 6 IPv6 BSKYB-BROADBAND-AS, GB (GB)
AS5650 568 IPv4 7 IPv6 FRONTIER-FRTR - Frontier Communications of America, Inc., US (US)
AS6128 45 IPv4 2 IPv6 CABLE-NET-1 - Cablevision Systems Corp., US (US)
AS6167 556 IPv4 887 IPv6 CELLCO-PART - Verizon Business, US (US)
AS7018 546 IPv4 15 IPv6 ATT-INTERNET4 - AT&T Enterprises, LLC, US (US)
AS7922 273 IPv4 5 IPv6 COMCAST-7922 - Comcast Cable Communications, LLC, US (US)
AS7979 336 IPv4 17 IPv6 SERVERS-COM - Servers.com, Inc., US (US)
AS10796 304 IPv4 11 IPv6 TWC-10796-MIDWEST - Charter Communications Inc, US (US)
AS11426 191 IPv4 8 IPv6 TWC-11426-CAROLINAS - Charter Communications Inc, US (US)
AS11798 137 IPv4 1 IPv6 ACEDATACENTERS-AS-1 - Ace Data Centers, Inc., US (US)
AS14593 229 IPv4 222 IPv6 SPACEX-STARLINK - Space Exploration Technologies Corporation, US (US)
AS20001 406 IPv4 12 IPv6 TWC-20001-PACWEST - Charter Communications Inc, US (US)
AS20115 638 IPv4 109 IPv6 CHARTER-20115 - Charter Communications LLC, US (US)
AS21928 16 IPv4 3 IPv6 T-MOBILE-AS21928 - T-Mobile USA, Inc., US (US)
AS22773 365 IPv4 16 IPv6 ASN-CXA-ALL-CCI-22773-RDC - Cox Communications Inc., US (US)
AS33363 206 IPv4 19 IPv6 BHN-33363 - Charter Communications, Inc, US (US)
AS36352 916 IPv4 16 IPv6 AS-COLOCROSSING - HostPapa, US (US)
AS36924 25 IPv4 14 IPv6 GVA-Canalbox, CI (CI)
AS39798 9 IPv4 5 IPv6 MIVOCLOUD, MD (MD)
AS41564 141 IPv4 7 IPv6 AS41564, GB (GB)
AS44382 7 IPv4 3 IPv6 WHITELABEL, US (US)
AS45102 183 IPv4 27 IPv6 ALIBABA-CN-NET Alibaba US Technology Co., Ltd., CN (CN)
AS46635 4 IPv4 ? IPv6 NET3-AI - Contact Consumers, US (US)
AS55286 232 IPv4 4 IPv6 SERVER-MANIA - B2 Net Solutions Inc., CA (CA)
AS60729 3 IPv4 3 IPv6 TORSERVERS-NET, DE (DE)
AS62874 59 IPv4 6 IPv6 WEB2OBJECTS - Web2Objects LLC, US (US)
AS64267 196 IPv4 1 IPv6 AS-SPRIOUS - Sprious LLC, US (US)
AS134450 26 IPv4 2 IPv6 HOSTROYALETECHNOLOGIES-AS-AP HostRoyale Technologies Pvt Ltd, IN (IN)
AS136907 180 IPv4 33 IPv6 HWCLOUDS-AS-AP HUAWEI CLOUDS, HK (HK)
AS137409 264 IPv4 505 IPv6 GSLNETWORKS-AS-AP GSL Networks Pty LTD, AU (AU)
AS152194 117 IPv4 2 IPv6 CTGSERVERLIMITED-AS-AP CTG Server Limited, HK (HK)
AS198953 3 IPv4 ? IPv6 PROTON66, RU (RU)
AS200593 3 IPv4 ? IPv6 PROSPERO-AS, RU (RU)
AS200651 17 IPv4 3 IPv6 FLOKINET, IS (IS)
AS203020 830 IPv4 52 IPv6 HOSTROYALE, IN (IN)
AS204957 123 IPv4 13 IPv6 GREENFLOID-AS, US (US)
AS206092 107 IPv4 ? IPv6 SECFIREWALLAS, CY (CY)
AS208091 ? IPv4 ? IPv6 WOLFSEC-AS3, CH (CH)
AS208323 1 IPv4 1 IPv6 APPLIEDPRIVACY-AS, AT (AT)
AS209605 6 IPv4 ? IPv6 HOSTBALTIC, LT (LT)
AS210644 155 IPv4 21 IPv6 AEZA-AS, RU (RU)
AS210906 63 IPv4 ? IPv6 BITE-US, LT (LT)
AS211298 4 IPv4 2 IPv6 DRIFTNET, GB (GB)
AS212286 25 IPv4 1 IPv6 LONCONNECT, GB (GB)
AS213412 5 IPv4 ? IPv6 ONYPHE, FR (FR)
AS213790 5 IPv4 ? IPv6 LIMITEDNETWORK-AS, GB (GB)
AS214940 2 IPv4 1 IPv6 KPRONET, US (US)
AS215125 1 IPv4 1 IPv6 CYBEROLOGY-AS, NL (NL)
AS216071 75 IPv4 4 IPv6 VDSINA, AE (AE)
AS329166 3 IPv4 1 IPv6 Absolute-Hosting-PTY-LTD-AS, ZA (ZA)
AS396319 29 IPv4 1 IPv6 US-INTERNET-396319 - Oxylabs, US (US)
AS396356 455 IPv4 113 IPv6 LATITUDE-SH - Latitude.sh, US (US)
AS398324 13 IPv4 4 IPv6 CENSYS-ARIN-01 - Censys, Inc., US (US)
AS398705 2 IPv4 2 IPv6 CENSYS-ARIN-02 - Censys, Inc., US (US)
AS398722 1 IPv4 2 IPv6 CENSYS-ARIN-03 - Censys, Inc., US (US)
AS400463 3 IPv4 ? IPv6 DYNANODE-ASN-01 - DynaNode LLC, US (US)
AS401152 114 IPv4 ? IPv6 ADCIL-ASN-01 - Ace Data Centers II, L.L.C., US (US)

Cette attaque par vague dure depuis juin 2025.

J'avais jamais vu ça, je suis quand même en face de quelqu'un de très motivé.

boudiou, en effet, quelqu'un n'aime pas ton client !

Je sais que tu ne veux pas de cloudflare, mais je ne vois pas trop comment t'en passer dans ces conditions.
Eventuellement déployer Anubis, mais pas dit que ça fasse le job.

Pour le moment avec de la puissance et de la RAM.... Pas encore eu de temps de regarder sérieusement Anubis.

Sinon, tu as étudié la question pour imposer un "challenge" à tous les visiteurs (délicat sur une boutique) ?
Du genre hcaptcha. Attention à bien le paramétrer pour autoriser les bots "legit" et pour ne pas bloquer le ping back du process de paiement.