Nginx : gérer les connexions des bots

Dans ce tutoriel, je vais vous expliquer comment gérer les bots et limiter leur impact sur vos sites Internet avec Nginx, notamment quand vous l’utilisez comme reverse proxy.

Aujourd’hui, il est de plus en plus de Bot aussi appelé Crawler présent sur Internet, qui passe sur les sites Internet :

  • Indexation (Google, Bing)
  • IA (OpenIA, Claude …)
  • Collecte de données

Généralement les robots d’indexation sont optimise leur passage sur votre site Internet et ne consomme par trop de ressource, par contre d’autres Bots sont très peu optimisé comme Amazon et leur Bot IA qui peuvent consommer beaucoup de ressource et voir dans certain cas consommer beaucoup de ressource et rendre votre site indisponible.

Il faut aussi prendre en compte pour certain hébergement l’utilisation de ressource comme la bande passante qui est consommé et engendrer un surcout.

Sur la plupart des rebots sont censés lire le fichier robots.txt qui se trouve à la racine de votre site où vous allez pouvoir donner des instructions pour limiter leur impact, dans les faits, on se rend compte que certain crawler ne reste pas les directives, on se retrouve donc à devoir utiliser les configurations des serveurs Web (Nginx) pour les bloquer.

Dans ce tutoriel, on va voir deux approches, la limitation des requêtes et le blocage.

Limiter le nombre de requêtes avec Nginx

La première limitation que l’on peut mettre en place est la limitation du nombre de requêtes par seconde ou minutes que le robot va pouvoir effectuer.

Pour cela on va utiliser les paramètres suivant :

  • limit_req_zone : déclaration des bots et de la limite
  • limit_req : déclaration de la zone
  • limit_req_status : code de retour

Documentation officiel : https://nginx.org/en/docs/http/ngx_http_limit_req_module.html

Dans le fichier de configuration de votre virtualhost, on va commencer par déclarer les bots avec leur agent et la limitation, qui est à mettre avant le bloc server{ ... }.

map $http_user_agent $bad_crawlers_rdritcom {
    ~*.*(bytespider|amazonbot|claudebot|DotBot|petalbot).* $http_user_agent;
    default "";
}
limit_req_zone $bad_crawlers_rdritcom zone=badcrawlerrdritcom:10m rate=1r/m;

Ici tous les robots contenant bytespider, amazonbot … seront limités à 1 requête par minute.

Maintenant dans le bloc server{ … }, on va appliquer la limitation

limit_req zone=badcrawlerrdritcom;
limit_req_status 429;

On indique la zone déclarée précédemment et le code de retour.

Tester la configuration de nginx :

sudo nginx -t

Si vous n’avez pas d’erreur, recharger la configuration :

sudo systemctl reload nginx

Avec cette configuration, vous allez pouvoir limiter le nombre de requête et réduire l’impact des robots.

Bloquer les robots avec Nginx

Une autre approche un peu plus agressive est de bloquer simplement les requêtes avec code de retour 403.

Voici un exemple de configuration qui doit être mise dans le bloc server{ ... }.

if ($http_user_agent ~* (bytespider)) {
    return 403;
}

if ($http_user_agent ~* (claudebot)) {
    return 403;
}

if ($http_user_agent ~* (amazonbot)) {
    return 403;
}

Cette configuration va bloquer les robots bytespider, claudebot et amazonbot en leur retournant un code d’erreur 403.

Vérifier la configuration de Nginx :

sudo nginx -t

Recharger la configuration :

sudo systemctl reload nginx

Vous savez comment bloquer les Bots depuis Nginx.

Fichier robots.txt depuis la configuration

Dernière solution, qui est possible est de générer le fichier robots.txt directement depuis la configuration du virtualhost si vous n’avez pas la possibilité de créer un fichier robots.txt sur le serveur Web. Ceci peut être le cas avec certaine application métier ou portail propriétaire.

Voici le code à mettre dans la bloc server{ ... } du virtualhost.

location /robots.txt {
    add_header Content-Type text/plain;
    return 200 "User-agent: AhrefsBot\nCrawl-delay: 10\nUser-agent: Amazonbot\nCrawl-delay: 10";
}

Dans cette directive, on déclare des informations pour les robots AhrefsBot et Amazonbot

Vérifier la configuration de Nginx :

sudo nginx -t

Recharger la configuration :

sudo systemctl reload nginx

Bloquer les User Agent depuis la liste de mitchellkrogza

Pour continuer dans la protection contre les robots (Bot), on va utiliser la liste mise à disposition par mitchellkrogza qui est l’auteur de nginx-ultimate-bas-bot-blocker.

Pour ce faire, on va utiliser cette liste : raw.githubusercontent.com/mitchellkrogza/nginx-ultimate-bad-bot-blocker/master/_generator_lists/bad-user-agents.list

Pour cela j’ai fait un script qui permet de télécharger la liste et créer un fichier de configuration pour Nginx.

Voici le script :

Copier le script sur le serveur Nginx et exécuter le, cela va créer un fichier de configuration que va être charger par Nginx.

Ensuite, dans les virtualhosts où vous souhaitez bloquer les Bots ajouter ceci dans le block server{ ... }.

if ($bad_ua) {
    return 444;
}

Tester la configuration de Nginx :

sudo nginx -t

Recharger pour la prise en compte :

sudo systemctl reload nginx

Si vous souhaitez pouvoir analyser facilement les blocages des bots, il est possible d’avoir un fichier de log séparé.

Dans le fichier nginx.conf dans la section http{ ... } ajouter :

log_format bad_ua '$remote_addr - $remote_user [$time_local] '
                  '"$request" $status $body_bytes_sent '
                  '"$http_user_agent" "$host"';

Pour finir, dans le fichier du virtualhost, ajouter :

access_log /var/log/nginx/bad_ua.log bad_ua if=$bad_ua;

Vous savez comment gérer les robots (Bots) directement depuis la configuration de Nginx et limiter leur impact sur votre serveurs Web.

Romain Drouche
Architecte Système | MCSE: Core Infrastructure
Expert en infrastructures IT avec plus de 15 ans d’expérience sur le terrain. Actuellement Chef de projet Systèmes et Réseaux et Référent SSI (Sécurité des Systèmes d’Information), je mets mon expertise au service de la fiabilité et de la sécurité des environnements technologiques.

Laisser un commentaire