Attaque en DDoS : mod_evasive à la rescousse
Les attaques en déni de service ou DDoS sur mon site Extime ont commencé après que j’ai écrit cet article sur les 630 millions reçus par Kylian MBappé. L’œuvre d’un supporter ? Le 26 octobre 2022, je me suis pris 3465 requêtes en quelques minutes. Mal configuré, mon serveur n’a pas tenu la charge. Il s’est effondré très rapidement. Depuis, j’ai multiplié par 4 l’espace mémoire alloué à l’exécution des scripts PHP ! J’avais toujours, jusqu’à présent, fait le choix d’absorber les attaques en déni de service.
Le 3 novembre 2022, comme vous pouvez l’observer sur les données ci-dessus issues de Awstats, l’attaque de type DDoS est venue d’une machine hébergée en Malaisie : 14 requêtes à la seconde sur 13 minutes 30. Sachant que les pages du site Extime comprennent en moyenne 15 composants en moyenne, mon site a absorbé plus de 160000 requêtes. Une broutille, me direz-vous ? En effet, le serveur n’a pas bougé d’un iota. Pour autant, je me suis décidé, en plus du mod_security, qui protège les accès aux commentaires et surtout aux pages de login, à ajouter le mod_evasive que je m’étais toujours refusé à installer jusqu’à présent. A tort, sans doute. Je craignais que les bots des principaux moteurs de recherche – en l’occurrence GoogleBot et BingBot – finissent par être bloqués au moment où ils crawlent mes sites. Mon référencent naturel en aurait été profondément affecté.
Installation du module Apache mod_evasive
Étant sous Fedora, j’ai donc eu recours au gestionnaire de paquets dnf pour installer le module Apache mod_evasive :
dnf install mod_evasive
Configuration de mod_evasive
J’ai décidé de configurer mod_evasive de manière à absorber 10 requêtes à la seconde émanant de la même machine. Compte tenu du fait que mes pages de sites contiennent entre 15 et 40 composants (images png, jpg, feuilles de styles css, javascript js), j’ai décidé de totaliser, pour une machine, 400 requêtes au total par seconde. Le bannissement est fait pour une durée de 1 seconde. Cela permettra de diminuer l’impact de l’attaque en DDoS. J’ai mis en whitelist toutes les adresses IPv4 et IPv6 du serveur. J’ai multiplié par 4 la valeur du paramètre de la table de hachage, DOSHashTableSize pour des raisons de performance. J’ai également créé le répertoire /var/log/httpd/mod_evasive pour y consigner les logs, sur lequel j’ai rendu l’utilisateur apache propriétaire afin de permettre les écritures :
mkdir /var/log/httpd/mod_evasive chown apache:apache /var/log/httpd/mod_evasive -R
Sous Fedora, Red Hat, CentOS, AlmaLinux et Rocky Linux, éditez le fichier /etc/httpd/conf.d/mod_evasive.conf et modifiez-le comme suit :
LoadModule evasive20_module modules/mod_evasive24.so <IfModule mod_evasive24.c> DOSHashTableSize 16384 DOSPageCount 10 DOSSiteCount 400 DOSPageInterval 1 DOSSiteInterval 1 DOSBlockingPeriod 1 DOSLogDir "/var/log/http/mod_evasive" DOSWhitelist 127.0.0.1 DOSWhitelist 192.168.1.* DOSWhitelist fe80::* DOSWhitelist ::1 </IfModule>
Pensez à recharger votre configuration après modification des valeurs des directives de ce fichier de configuration :
systemctl reload httpd
Autre attaque en déni de service
Le 29 avril 2023, la machine dont l’adresse Ip est 2a01:cb10:8550:b900:74f8:6d5a:fb94:8a2a a envoyé 64 requêtes sur mon serveur entre 16:28:41 et 16:28:42. Elle a été bloquée par le module Apache mod_evasive. Et j’en ai trouvé trace dans mon dossier /var/log/httpd/mod_evasive :
[root@enfinauchaud httpd]# ls -al /var/log/httpd/mod_evasive/ total 24 drwxr-xr-x 2 apache apache 57 30 avril 14:41 . drwx------ 4 apache apache 16384 30 avril 00:00 .. -rw-r--r-- 1 apache apache 8 29 avril 16:28 dos-2a01:cb10:8550:b900:74f8:6d5a:fb94:8a2a [root@enfinauchaud httpd]#
Pour rappel, le préfixe de l’adresse IPv6 de cette machine appartenant au réseau Orange est unique au monde. En publiant l’adresse IP, je tiens à alerter son propriétaire. J’ose croire que l’attaque de la part de cette machine s’est faite à l’insu de son utilisateur.
1