2>&1

Protéger Koha contre les bots avec Anubis

Protéger une instance Koha contre les LLMs et autres bots, en utilisant Anubis

🚧🏗️🚚HTML WORK AHEAD (i) play pause stop 🚧

"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 :

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>

contact

contact

Support

Ko-fi