Journal Bloquer les bots avec Nginx de façon simple avec Nginx botcheck

7
2
sept.
2026

Disclaimer : ce journal est une republication de l’article de présentation de Nginx botcheck sur mon blog.

Avec l’explosion de l’IA, on a de plus en plus de bots qui viennent sur nos sites pour, grosso modo, tout pomper pour entraîner des modèles IA (souvent en tapant comme des connards sur toutes les pages qu’ils peuvent sans réfléchir à une manière plus propre de faire) ou pour essayer de trouver des vulnérabilités avec des agents IA.

Et ça peut mettre nos sites en péril. Chez Framasoft, par exemple, Framagit est régulièrement ralenti, voir inutilisable à cause d’un trafic de bots complètement dingue. Ça peut toucher n’importe qui, vraiment.

Et malheureusement, des outils comme Fail2ban et reaction sont impuissants contre un tel fléau : les bots utilisent une adresse IP pour quelques requêtes et passent à une autre IP.

On peut bloquer des AS, pour par exemple bloquer du trafic venant d’hébergeurs, mais pour un site fédéré (comme mon blog, mon nextcloud, un serveur Mastodon ou PeerTube), avec un flux RSS (c’est très le bien, les flux RSS, utilisez-les !) ou une forge logicielle comme Framagit sur laquelle on vient cloner un dépôt git pour installer un truc sur son serveur, c’est inenvisageable.

Il y a aussi le blocage par pays, mais on ne sait jamais d’où peuvent venir les usages légitimes. Chez Framasoft, j’ai déjà banni des pays de certains services pour cause de vagues de spam, en nous disant que c’était pas trop grave parce que le pays n’était pas francophone, mais il peut toujours y avoir un·e utilisateur·ice en voyage, ou expatrié·e qui a besoin d’accéder au service. Donc bof. En tout dernier recours.

Bref.

Alors oui, bien sûr, y a Anubis, Iocaine et consorts. Mais ça demande un service supplémentaire sur sa machine, et de les configurer finement, ce qui n’est pas forcément une mince affaire (croyez-moi : j’ai mis Anubis sur Framagit, ça demande une connaissance très fine des routes de Gitlab et de bien comprendre les possibilités des expressions de configuration d’Anubis).

Par contre, le créateur de DokuWiki, @splitbrain@fedi.splitbrain.org, a créé un système de blocage tout simple à base de redirection Apache et un tout petit programme en Go, appelé par Apache (donc ce n’est pas un service qui tourne à côté) : botcheck. Côté client·e, c’est un simple bouton à cliquer pour accéder à la page désirée, et vous êtes tranquille pendant un temps.

Sebsauvage a aussi développé un système un peu similaire.

J’ai été séduit par la simplicité de ces solutions, mais insatisfait car je suis plus du côté Nginx de la force. Qu’à cela ne tienne, je me suis retroussé les manches et j’ai développé ma solution : Nginx botcheck.

Point de service externe, j’utilise le module Lua de Nginx pour tout mettre dans la configuration Nginx. Une fois installé sur le serveur selon les instructions données, la protection d’un virtualhost est aussi simple que l’ajout de include botcheck/botcheck.conf; dans sa configuration.

Le code de Nginx botcheck est très simple à lire et à adapter (au contraire des règles de réécritures du botcheck Apache 😅). On peut ainsi ajouter autant de conditions pour forcer ou contourner la page anti-bot que l’on souhaite, en ajoutant une map Nginx pour définir une variable et un bout de code aussi simple que celui-ci :

--  No botcheck for custom map
if ngx.var.my_var == "yes" then
    return "yes"
end

Je trouve que Nginx botcheck constitue une solution simple et élégante aux problèmes de bots, et je vous encourage fortement à le tester en cas de besoin !

Notez bien qu’il ne s’agit que d’une première ligne de défense, mais en attendant, je regarde mes logs, et je me dis que c’est déjà pas si mal 🙂

Envoyer un commentaire

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.