Protéger Koha contre les bots avec Anubis
Protéger une instance Koha contre les LLMs et autres bots, en utilisant Anubis
"Protéger Koha contre les bots avec Anubis" on https://aligot-death.space, available at https://aligot-death.space/txt/koha-anubis-fr
Une instance Koha constitue un stock de données structurées important: du pain béni pour les LLMs et autres scrapers.
Problème, les entreprises derrière ces bots emploient des méthodes toujours plus vicieuses pour contourner les protections en place. De plus en plus, les techniques classiques (Robots.txt, fail2ban, bloquage d'ASN) ne suffisent plus. Les scrapers exploitent les machines des utilisateurices, génèrent de faux User-Agent, et changent de technique quand elles détectent la mise en place d'une protection.
Face à ce fléau, deux choix possibles : * passer par un CDN comme Cloudflare, ce qui peut-être coûteux et réduit l'indépendance ; * mettre en place une détection "heuristique", basée sur le comportement de la connexion.
J'ai donc après trois jours à suer, fini par me rabattre sur la deuxième, en particulier Anubis.
J'écris principalement cet article pour partager une config de vhost apache2 pour protéger Koha avec Anubis. Vous la trouverez en bas de la page. Mais si ça vous intéresse, j'ai écrit toute la procédure d'installation et de configuration.
Installer Anubis#
Anubis va, pour expliquer très rapidement, donner un "challenge" lors de la connexion (via le javascript). En fonction du comportement (typiquement, le nombre de connexions), le challenge sera plus ou moins simple.
Si ça vous intéresse, il y a une explication plus détaillée dans la doc ici.
La doc de Anubis est assez bien foutu : vous la trouverez ici. Mais la configuration apache de Koha présentant quelques spécificités, j'ai préféré coucher la procédure sur papier (façon de parler), et en profiter pour en faire une en français. Mais le déroulé est grosso-modo celui présenté dans la doc, à quelques exceptions près.
Commençons donc par télécharger Anubis, en allant sur la page des releases sur Github. Après la liste des changement, il y a les fichiers. Trouvez celui qui correspond à votre système (pensez à cliquer sur "Show 24 assets" si vous voyez pas le vôtre). Dans mon cas, c'est un Debian sous architecture amd64. On fait donc clic-droit sur anubis_1.18.0_amd64.deb, "copier le lien".
Arrivé sur le serveur, on télécharge le paquet dans un répertoire, par exemple avec wget et en mettant l'adresse qu'on a copié :
sudo wget https://github.com/TecharoHQ/anubis/releases/download/v1.18.0/anubis_1.18.0_amd64.deb
Une fois le fichier téléchargé, on peut l'installer en faisant :
sudo apt install ./anubis_1.18.0_amd64.deb
Ensuite, comme indiqué dans la doc, on copie le fichier de config par défaut en lui donnant un nom. Ici, j'ai pris "koha" :
sudo cp /etc/anubis/default.env /etc/anubis/koha.env
Ensuite pareil pour la "Bot Policies", qui définit le comportement de Anubis face aux bots :
sudo cp /usr/share/doc/anubis/botPolicies.yaml /etc/anubis/koha.botPolicies.yaml
Ensuite on modifie le fichier koha.env qu'on a créé, comme ça :
1 BIND=[::1]:8239 2 BIND_NETWORK=tcp 3 DIFFICULTY=4 4 METRICS_BIND=[::1]:8240 5 METRICS_BIND_NETWORK=tcp 6 POLICY_FNAME=/etc/anubis/koha.botPolicies.yaml 7 TARGET=http://localhost:3000
Je recommanderai d'utiliser d'autres ports, afin d'éviter que toutes les installations Anubis se ressemblent. Prenez un port juste à côté par exemple.
On a donc trois ports, que je vous conseille de noter pour pouvoir vous y retrouver pendant l'installation :
- 8239 : Le port sur lequel écoute Anubis, comme un service normal
- 3000 : Le port vers lequel il renverra une fois le challenge passé (où on mettra Koha)
- 8240 : Le port pour le service de metrics, qui n'est pas essentiel
On peut maintenant lancer le service Anubis (adaptez la commande si vous l'avez appelé autrement que "koha") :
sudo systemctl enable --now anubis@koha.service
Et vérifier qu'il marche en lançant une requête sur le service de metrics:
curl http://localhost:8240/metrics
Qui devrait vous retourner des stats.
Au besoin, vous pouvez consulter la doc pour customiser le comportement face aux bots. Contrairement à ce que dit actuellement la doc, la configuration par défaut est déjà bien fournie, et laisse passer le Crawler de Google ou encore la Web Archive.
Protéger Koha#
Maintenant que Anubis tourne, il faut rediriger le trafic sensé aller vers Koha d'abord vers Anubis.
À noter que Anubis se fout du "Host" : vous pouvez tout à fait avoir plusieurs vhost/domaines différents derrière Anubis (par exemple, l'OPAC et l'intra), tant qu'ils sont sur le port 3000 (dans notre cas). Anubis s'occupe de tout.
On va donc à partir de maintenant plus ou mois suivre la page de doc sur la configuration de apache.
Contrairement à ce que dit la doc, pas besoin d'installer le paquet pour mod_proxy_html. Il est déjà intégré depuis longtemps dans apache.
Donc pour les dépendances, on fait juste :
sudo apt install -y libxml2-dev
Et vous pouvez vous assurer que le module proxy_html est bien actif en faisant :
a2enmod proxy_html
Ensuite, on va dire à apache d'écouter sur un nouveau port. Sur une debian classique, on trouve ça dans ports.conf. Mais si vous avez un doute, vous pouvez aller dans le dossier de apache /etc/apache2, et faire un grep -rn Listen pour voir quel fichier contient cette configuration.
On ajoute donc cette ligne dans le fichier /etc/apache2/ports.conf:
Listen 127.0.0.1:3000
Contrairement aux lignes possiblement déjà présentes, on a un 127.0.0.1: cela indique à apache d'écouter seulement en local. Il faut pas qu'on puisse se connecter au service depuis l'extérieur, sinon ça permet de contourner Anubis.
On vérifie que apache est toujours content de la configuration en faisant :
sudo apache2ctl configtest
Et on applique la configuration en rechargeant :
systemctl reload apache2
La config#
Enfin, le gros morceau, la configuration du vhost. Koha faisant appel à des fichiers de config externes, ça peut parfois être confus d'appliquer ce genre d'outils. On va pas se mentir, cet article sert à 95% à partager cette configuration.
J'ai pris le parti, vu que sur mon Koha les inscriptions sont fermées, de ne protéger que l'OPAC, pas l'intra. Mais comme évoqué, Anubis peut gérer plusieurs services sans problème si vous souhaitez adapter la config. Aussi, la config typique qui redirige le http vers le https est dans un autre fichier.
Je propose ce fichier principalement pour que vous puissiez comparer si vous tentez également l'install. Mais si vous suivez ce guide comme un tutoriel et que vous copiez ce fichier, pensez à le modifier en conséquence.
Le bouzin :
1 <IfModule mod_ssl.c> 2 <VirtualHost *:443> 3 # <IfVersion >= 2.4> 4 # Define instance "instance" 5 # </IfVersion> 6 7 ServerName instance.example.com 8 9 ErrorLog ${APACHE_LOG_DIR}/instance-anubis_error.log 10 CustomLog ${APACHE_LOG_DIR}/instance-anubis_access.log combined 11 12 SSLCertificateFile /etc/letsencrypt/live/instance.example.com/fullchain.pem 13 SSLCertificateKeyFile /etc/letsencrypt/live/instance.example.com/privkey.pem 14 Include /etc/letsencrypt/options-ssl-apache.conf 15 16 RequestHeader set "X-Real-Ip" expr=%{REMOTE_ADDR} 17 RequestHeader set X-Forwarded-Proto "https" 18 ProxyPreserveHost On 19 ProxyRequests Off 20 ProxyVia Off 21 22 # Replace 9000 with the port Anubis listens on 23 ProxyPass / http://[::1]:8239/ 24 ProxyPassReverse / http://[::1]:8239/ 25 </VirtualHost> 26 <VirtualHost *:3000> 27 <IfVersion >= 2.4> 28 Define instance "instance" 29 </IfVersion> 30 Include /etc/koha/apache-shared.conf 31 # Include /etc/koha/apache-shared-disable.conf 32 Include /etc/koha/apache-shared-opac-plack.conf 33 Include /etc/koha/apache-shared-opac.conf 34 35 ServerName instance.example.com 36 SetEnv KOHA_CONF "/etc/koha/sites/instance/koha-conf.xml" 37 AssignUserID instance-koha instance-koha 38 39 ErrorLog /var/log/koha/instance/opac-error.log 40 CustomLog ${APACHE_LOG_DIR}/instance_access.log combined 41 </VirtualHost> 42 </IfModule> 43 <IfModule mod_ssl.c> 44 <VirtualHost *:443> 45 <IfVersion >= 2.4> 46 Define instance "instance" 47 </IfVersion> 48 Include /etc/koha/apache-shared.conf 49 # Include /etc/koha/apache-shared-disable.conf 50 Include /etc/koha/apache-shared-intranet-plack.conf 51 Include /etc/koha/apache-shared-intranet.conf 52 53 ServerName instance-intra.example.com 54 SetEnv KOHA_CONF "/etc/koha/sites/instance/koha-conf.xml" 55 AssignUserID instance-koha instance-koha 56 57 ErrorLog /var/log/koha/instance/intranet-error.log 58 # TransferLog /var/log/koha/instance/intranet-access.log 59 60 SSLCertificateFile /etc/letsencrypt/live/instance.example.com/fullchain.pem 61 SSLCertificateKeyFile /etc/letsencrypt/live/instance.example.com/privkey.pem 62 Include /etc/letsencrypt/options-ssl-apache.conf 63 64 </VirtualHost> 65 </IfModule>