Sécurité Apache 2 : mod_evasive
Apache mod_evasive
Mod_evasive est un module du serveur Web Apache qui permet de limiter, dans une certaine mesure, la portée des attaques de type DOS, DDOS et force brute.
Il fonctionne de manière classique pour ce genre de soft, c'est-à-dire en analysant les requêtes à destination du serveur Web, en vérifiant leur fréquence et en appliquant des règles spécifiques lorsque certaines conditions sont remplies. Il peut vous avertir des abus par e-mail, les enregistrer dans un journal ou exécuter des commandes système lors de la détection d'une attaque.
Utilisé seul ce module n'est pas pour autant une protection suffisante ; il convient donc de l'utiliser en conjonction avec d'autres outils (Fail2Ban, mod_security, iptables, etc...). Cependant c'est un outil facile à utiliser et dont il serait dommage de se priver.
Installation
Comme pour chaque billet que vous trouverez sur ce blog, je parts du principe que vous travaillez dans un environnement Debian GNU/Linux. Ceux d'entre vous qui utilisent d'autres distributions devront se débrouiller a transposer les commandes d'installation fournies afin qu'elles correspondent à leur système de paquetage.
La première chose à faire est de vérifier que le module mod_evasive n'est pas déjà chargé par le serveur ; la commande suivante liste les modules chargés par Apache vous permet de le vérifier :
# apache2ctl -M
Si le module n'est pas présent dans la liste, il ne vous reste plus qu'à l'installer, sinon vous pouvez directement passer à sa configuration. Sous Debian l'installation se fait de manière classique :
# apt-get install libapache2-mod-evasive
Configuration
Comme tous les modules Apache, les fichiers de configuration de mod_evasive sont situés dans le répertoire /etc/apache2/mods-available/. Ces fichiers sont au nombre de deux : /etc/apache2/mods-available/mod-evasive.load, qui indique à apache où trouver le module en question dans le système de fichiers, et /etc/apache2/mods-available/mod-evasive.conf qui contient les directives de configuration à passer au module.
Si vous venez tout juste d'installer mod_evasive, vous constaterez que le fichier mod-evasive.conf n'existe pas encore ; il vous incombe donc de le créer à l'aide des commandes suivantes :
# touch /etc/apache2/mods-available/mod-evasive.conf
et :
# ln -s /etc/apache2/mods-available/mod-evasive.conf /etc/apache2/mods-enabled/mod-evasive.conf
Pour ceux qui trouvent ça obscure : la première commande crée un fichier vide à l'emplacement désiré, et la deuxième crée un lien symbolique (un alias) de notre fichier dans le répertoire contenant les informations sur les modules apache activés.
Tant que nous y sommes nous allons également créer un répertoire qui nous servira à stocker les logs du module, sans oublier de lui donner les droits d'Apache afin qu'il puisse y écrire :
# mkdir /var/log/mod_evasive
# chown www-data:www-data /var/log/mod_evasive
Important : le fichier /etc/apache2/mods-available/mod-evasive.conf concerne la configuration globale de mod_evasive ; les directives qu'il contient seront donc appliquées à tous les sites gérés par Apache. Si vous désirez personnaliser mod_evasive pour un site en particulier, il vous faudra placer ses directives dans le fichier de configuration du site en question (ex.: /etc/apache2/sites-available/mon-site), entre les balises
L'étape suivante consiste à éditer notre fichier afin d'y enregistrer nos premières directives ; puis nous demanderons à Apache de prendre en compte notre configuration.
# nano /etc/apache2/mods-available/mod-evasive.conf
##
# mod_evasive configuration
##
<IfModule mod_evasive20.c>
DOSLogDir "/var/log/mod_evasive"
DOSEmailNotify "vous@votredomaine.com"
DOSHashTableSize 1024
DOSPageInterval 1
DOSPageCount 15
DOSSiteInterval 1
DOSSiteCount 150
DOSBlockingPeriod 300
#DOSSystemCommand ""
DOSWhitelist 127.0.0.1
</IfModule>
Voici la signification des directives utilisées :
-
DOSLogDir
Chemin du répertoire contenant les fichiers logs.
-
DOSEmailNotify
Adresse email à laquelle il faut envoyer un message lorsqu'un blocage d'IP survient.
-
DOSHashTableSize
Taille de la table de hachage ; augmenter ce nombre améliore les performances mais consomme beaucoup de mémoire. A ne modifier que sur les serveurs bien équipés et/ou ayants un gros trafic.
-
DOSPageInterval
Intervalle de contrôle, en secondes, durant laquelle une adresse IP peut demander à accéder à une même page. Peut être un nombre réel.
-
DOSPageCount
Nombre maximal de fois qu'une IP peut accéder à une page du site durant DOSPageInterval secondes. Une fois ce nombre atteint l'IP est bloquée.
-
DOSSiteInterval
Intervalle de contrôle, en secondes, durant laquelle une adresse IP peut accéder au site. Peut être un nombre réel.
-
DOSSiteCount
Nombre maximal de fois qu'une IP peut accéder au site durant DOSSiteInterval secondes. Une fois ce nombre atteint l'IP est bloquée.
-
DOSBlockingPeriod
Période de temps en seconde durant laquelle une adresse IP doit être bloquée lorsqu'une attaque est détectée.
-
DOSSystemCommand
Commande système a exécuter lorsqu'une adresse IP est bloquée.
-
DOSWhitelist
Liste d'adresses IP qui ne devront jamais être bloquées. Pour ajouter plusieurs IPs il suffit d'ajouter autant de fois cette directive et il est possible d'utiliser un jocker () pour masquer les 3 derniers octets (par exemple : DOSWhitelist 192.168.0. autorise les requêtes provenant des machine d'un réseau privé).
Nota bene : La configuration que je vous propose ici est à personnaliser avec vos propres paramètres, il s'agit d'une configuration basique. Dans cet exemple nous demandons à mod_evasive de ne jamais bloquer les requêtes de l'hôte local, ce qui est généralement une bonne idée. Si votre site utilise un système de requêtes asynchrone (par ex. AJAX) faites attention, car ce genre de technique peut rapidement exécuter plusieurs requêtes par secondes, comme par exemple dans le cas d'un champ de recherche auto-complété. Il faudra donc penser à adapter les valeurs des directives DOSSiteCount et DOSPageCount de façon à ce qu'elles prennent en compte ce paramètre.
Une fois les modifications effectuées, vous pouvez utiliser la commande apache2ctl pour tester la validité syntaxique des fichiers de configuration d'Apache, puis recharger la configuration du serveur :
# apache2ctl -t
Syntax OK
# /etc/init.d/apache2 reload
Limites
Au début de ce billet j'écris que mod_evasive n'est pas une solution de protection suffisante, la raison en est toute simple : faire de la détection d'attaques et du filtrage sur IP n'est pas le travail normal d'un serveur Web tel qu'Apache.
Pour avoir une véritable efficacité, un travail de détection/filtrage devrait s'effectuer à un niveau beaucoup plus proche de la couche réseau, voir même au niveau du matériel ; en conséquence, il ne faut pas perdre de vu que l'utilisation de mod_evasive n'est envisageable que comme un verrou supplémentaire dans votre système et non comme une solution de protection standalone idéale.