Tout d'abord, présentons le Mod_evasive ! Celui-ci est un module pour Apache2 qui à pour but de contrer des attaques de déni de service (DoS : Denial of Service), (certains) DDOS et de Brute force. Il cherche va chercher a détecter les demandes trop importantes, depuis une source, qui sollicitent une page sur un site web en un délai de temps très court.
Bien évidemment, il convient d'utiliser mod_evasive conjointement à d'autres outils complémentaires comme mod_security et Fail2Ban mais surtout rappelez-vous que n'est pas suffisant pour une bonne sécurité. Le travail de détection et de filtrage doit s'effectuer au plus près de la couche réseau, voire, à un niveau matériel même si ce module, facile à utiliser, vous aidera tout de même vous à améliorer la sécurité de votre serveur.
La détection d'attaques et le filtrage IP n'est pas la l'activité première d'un serveur Web comme Apache et une charge trop importante de filtrage pourrait faire tomber votre serveur. C'est d'ailleurs notre sujet du jour.
Comment faire en sorte de filtrer efficacement avec le Mod_evasive sans impacter trop fortement la charge du serveur web et également sans bloquer les utilisateurs. A savoir qu'un utilisateur considéré comme un attaquant se verra bloquer des requêtes durant une période définie en configuration. Cela peut donc se traduire par des erreurs 403/404 avant d'être de nouveau fonctionnel la seconde suivante.
Exemple de logs rencontrés :
[Thu Oct 14 23:47:29.391748 2021] [:error] [pid 3896328:tid 47085383829248] [client 93.x.y.135:60013] client denied by server configuration: /home/user_example/public_html/wp-content/uploads/2021/10/Documentaires-150x148.png, referer: https://usersiteweb.fr/wp-admin/post.php?post=136&action=edit
[Thu Oct 14 23:47:29.392125 2021] [:error] [pid 3896328:tid 47085373323008] [client 93.x.y.135:60013] client denied by server configuration: /home/user_example/public_html/wp-includes/js/wp-emoji-release.min.js, referer: https://usersiteweb.fr/wp-admin/post.php?post=136&action=edit
[Thu Oct 14 23:47:29.448280 2021] [:error] [pid 3896328:tid 47085537875712] [client 93.x.y.135:60013] client denied by server configuration: /home/user_example/public_html/wp-content/plugins/elementor/assets/lib/eicons/fonts/eicons.woff2, referer: https://usersiteweb.fr/wp-content/plugins/elementor/assets/lib/eicons/css/elementor-icons.min.css?ver=5.12.0
[Thu Oct 14 23:47:30.237934 2021] [:error] [pid 3896328:tid 47085383829248] [client 93.x.y.135:60013] client denied by server configuration: /home/user_example/public_html/wp-admin/admin-ajax.php, referer: https://usersiteweb.fr/wp-admin/post.php?post=136&action=edit
[Thu Oct 14 23:47:30.240967 2021] [:error] [pid 3896328:tid 47085373323008] [client 93.x.y.135:60013] client denied by server configuration: /home/user_example/public_html/wp-admin/admin-ajax.php, referer: https://usersiteweb.fr/wp-admin/post.php?post=136&action=edit
[Thu Oct 14 23:47:30.246685 2021] [:error] [pid 3896328:tid 47085537875712] [client 93.x.y.135:60013] client denied by server configuration: /home/user_example/public_html/wp-includes/js/thickbox/loadingAnimation.gif, referer: https://usersiteweb.fr/wp-admin/post.php?post=136&action=edit
En regardant les logs du mod_evasive et en filtrant par l'IP concernée, on peut voir que cet utilisateur fait partie des IPs filtrées:
[11:03:52 mutu01 root@94373610 ~]cPs# ls -alh /var/log/apache2/mod_evasive/ | grep 93.x.y.135
-rw-r--r-- 1 nobody nobody 7 Jul 5 16:05 dos-93.x.y.135
On peut d'ailleurs voir que le filtrage en a pris énormément dans ses filets :
[11:13:17 mutu01 root@94373610 ~]cPs# ls -lh /var/log/apache2/mod_evasive/ | wc -l
30679
Le module Apache mod_evasive est connu pour causer des problèmes comme celui-ci si trop de requêtes sont envoyées au serveur à la fois ; par exemple, si une page Web nécessite plusieurs connexions au serveur pour télécharger tous les actifs d'un site Web tels que le CSS, les images, etc., mod_evasive peut détecter cela de manière incorrecte comme une attaque DDOS et tenter de bloquer les demandes.
Deux recommandations dans ce cas :
- supprimer mod_evasive de votre serveur et voir si cela résout votre problème. voir le tutoriel officiel
- affiner mod_evasive pour empêcher ces faux positifs de se produire en augmentant les seuils, voici le tutoriel officiel que nous tenterons d'enrichir ci-dessus
D'ailleurs, sous Cpanel, nous créerons/modifierons ce fichier via vi/nano :
/etc/apache2/conf.d/300-mod_evasive.conf
En cas de modification, n'oubliez pas de redémarrer le service httpd
/scripts/restartsrv_httpd
Plusieurs valeurs peuvent nous intéresser pour éviter tout faux positif et/ou tout travail superflux :
DOSHashTableSize - par défaut à 3097
- Taille de la table de hachage.
- Augmenter ce nombre améliore les performances mais consomme d'avantage de mémoire.
- Nous laisserons la valeur par défaut à votre place, au moins dans un premier temps
DOSPageCount - par défaut à 2
- Nombre de requête pour une même page dans l’intervalle DOSPageInvernal, au delà, l'adresse IP est bloquée.
- Une augmentation vers une valeur autour de 4-8 semble éviter de nombreux faux-positifs sans exclure un cas réel de DOS.
DOSSiteCount - par défaut à 100
- Nombre de requête pour un même site dans l’intervalle DOSPageInvernal, au delà, l'adresse IP est bloquée.
- Tout dépendra de votre site web et de son nombre de requêtes moyen (voir par exemple via GTMetrix) cependant, un site web peut vite arriver à 100 requêtes. Nous recommandons ~250.
DOSPageInterval - par défaut à 1
- Nombre de requête pour une même page en secondes.
- Vous pouvez également agir sur l'intervalle plutôt que sur le compteur
DOSSiteInterval - par défaut à 1
- Nombre de requête pour un même site en secondes.
- Comme pour la valeur ci-dessous, vous pouvez tenter d'élargir l'intervalle à 2 secondes.
DOSBlockingPeriod - par défaut à 10s
- Période en seconde pendant laquelle l'adresse IP sera bloquée (Un forbidden 403 est retourné pour toutes les demandes ultérieures du client.)
- Étant donné que le temporisateur est réinitialisé pour chaque demande ultérieure, il n'est pas nécessaire d'avoir une longue période de blocage ; en cas d'attaque DoS, cette minuterie continuera à être réinitialisée en permanence..
- Aucun intérêt d'étendre cette valeur limitante puisque mod_evasive est conçu contre le DOS et non le DDoS.
DOSWhitelist
- Permet de mettre des adresses IP en liste blanche.
- DOSWhitelist 192.168.0.* autorise les requêtes provenant des machine d'un réseau local privé.
DOSEmailNotify
- Activer cette fonction le temps d'affiner vos réglages peut être bénéfique afin de continuer le travail.
Nous avons opté pour ces valeurs :
DOSPageCount="12" DOSSiteCount="400" DOSPageInterval="2" DOSSiteInterval="2"
Rappelez-vous bien que le mod_evasive est
- inefficace contre les attaques de la couche réseau
- Les attaques hautement distribuées peuvent ne pas déclencher de configurations de seuils mod_evasive. (Attaque par le nombre de source, pas par le nombre de requêtes provenant d'une seule source)
- Les attaques Low-and-slow (faibles et lentes) ne déclencheront pas de réponse de mod_evasive. (considéré comme du traffic légitime)
- Parce que le trafic est bloqué sur la base de critères rudimentaires, mod_evasive est très sujet aux faux positifs.
Pour ces raisons, mod_evasive est souvent considéré comme un instrument complémentaire plutôt que comme une solution complète de sécurité de site Web. Malgré sa gratuité et sa relative facilité d'utilisation, mod_evasive n'a pas les capacités de bloquer la couche réseau et les attaques DDoS.