Ceci est une ancienne révision du document !
Le principe de ce mod est assez sympa et couplé à IPTables il peut être vraiment efficace.
Il est permet de limiter la casse en cas d'attaque de type DDoS ou de brute force et tout autres attaques de ce type.
Ca mise en place est simple et il en est de même pour sa configuration.
Evasive n'est pas installé par défaut avec Apache, à nous de le compiler.
On télécharge les sources.
# wget http://www.zdziarski.com/projects/mod_evasive/mod_evasive_1.10.1.tar.gz
Une fois l'archive décompressée, on se place dans le répertoire obtenu puis on lance la compilation de celui-ci.
# apxs2 -cia mod_evasive20.c
Résultat :
3:08 root@serveur ~/mod_evasive# apxs2 -cia mod_evasive20.c /usr/bin/libtool --silent --mode=compile gcc -prefer-pic -pipe -I/usr/include/xmltok -I/usr/include/openssl -Wall -O2 -DAP_HAVE_DESIGNATED_INITIALIZER -DLINUX=2 -D_REENTRANT -D_XOPEN_SOURCE=500 -D_BSD_SOURCE -D_SVID_SOURCE -D_GNU_SOURCE -pipe -I/usr/include/xmltok -I/usr/include/openssl -Wall -O2 -pthread -I/usr/include/apache2 -I/usr/include/apr-0 -I/usr/include/apr-0 -I/usr/include -c -o mod_evasive20.lo mod_evasive20.c && touch mod_evasive20.slo mod_evasive20.c: In function `create_hit_list': mod_evasive20.c:118: warning: control reaches end of non-void function mod_evasive20.c: In function `access_checker': mod_evasive20.c:212: warning: implicit declaration of function `getpid' mod_evasive20.c:212: warning: long int format, int arg (arg 3) mod_evasive20.c: In function `destroy_hit_list': mod_evasive20.c:301: warning: control reaches end of non-void function /usr/bin/libtool --silent --mode=link gcc -o mod_evasive20.la -rpath /usr/lib/apache2/modules -module -avoid-version mod_evasive20.lo /usr/share/apache2/build/instdso.sh SH_LIBTOOL='/usr/bin/libtool' mod_evasive20.la /usr/lib/apache2/modules /usr/bin/libtool --mode=install cp mod_evasive20.la /usr/lib/apache2/modules/ cp .libs/mod_evasive20.so /usr/lib/apache2/modules/mod_evasive20.so cp .libs/mod_evasive20.lai /usr/lib/apache2/modules/mod_evasive20.la cp .libs/mod_evasive20.a /usr/lib/apache2/modules/mod_evasive20.a ranlib /usr/lib/apache2/modules/mod_evasive20.a chmod 644 /usr/lib/apache2/modules/mod_evasive20.a PATH="$PATH:/sbin" ldconfig -n /usr/lib/apache2/modules ---------------------------------------------------------------------- Libraries have been installed in: /usr/lib/apache2/modules If you ever happen to want to link against installed libraries in a given directory, LIBDIR, you must either use libtool, and specify the full pathname of the library, or use the `-LLIBDIR' flag during linking and do at least one of the following: - add LIBDIR to the `LD_LIBRARY_PATH' environment variable during execution - add LIBDIR to the `LD_RUN_PATH' environment variable during linking - use the `-Wl,--rpath -Wl,LIBDIR' linker flag - have your system administrator add LIBDIR to `/etc/ld.so.conf' See any operating system documentation about shared libraries for more information, such as the ld(1) and ld.so(8) manual pages. ---------------------------------------------------------------------- chmod 644 /usr/lib/apache2/modules/mod_evasive20.so [activating module `evasive20' in /etc/apache2/httpd.conf]
Voila, la compilation est terminée.
Maintenant nous allons créer un fichier mod_evasive.load dans /etc/apache2/mods-available/ pour y ajouter ceci :
LoadModule evasive20_module /usr/lib/apache2/modules/mod_evasive20.so
Dans /etc/apache2/httpd.conf la ligne suivant est à supprimer :
LoadModule evasive20_module /usr/lib/apache2/modules/mod_evasive20.so
Chargement du module Evasive.
# a2enmod mod_evasive
L'installation du module Evasive est terminée, c'était simple non ?
Dans /etc/apache2/conf.d/ nous allons créer un fichier evasive.conf contenant ceci :
<IfModule mod_evasive20.c> # Taille de la table. DOSHashTableSize 2048 # Nombre de même pages visibles par la même IP. DOSPageCount 2 # Nombre de même sites visibles par la même IP. DOSSiteCount 50 # Intervalle autorisant l'affichage de la même page par la même adresse. DOSPageInterval 1 # Intervalle autorisant l'affichage du même site par la même adresse. DOSSiteInterval 1 # Durée de blocage. DOSBlockingPeriod 10 # Adresse email de notification en cas d'attaque. DOSEmailNotify "adresse@email.com" # Destination du log. DOSLogDir "/var/log/evasive/" # Bannissement de l'IP en cas de bloquage. #DOSSystemCommand "/sbin/iptables -I INPUT -s %s -j DROP" # Liste blanche. DOSWhiteList 127.0.0.1 </IfModule>
Les valeurs données dans cette exemple sont à adapater selon votre serveur.
DOSSystemCommand "/sbin/iptables -I INPUT -s %s -j DROP"
Cette commande permet de bloquer une adresse IP à l'aide d'IPTable.
Cependant l'utilisation de DOSSystemCommand doit être prise au sérieux car en cas d'attaques massives l'instruction déterminée entre ““ sera répétée autant de fois qu'il faut.
Pour que l'adresse IP soit ajoutée à IPTables il est nécessaire que l'utilisateur “www-data” ait les droits pour manipuler IPTables (via sudo par exemple).
Explications :
Apache ne sait pas créer le répertoire /var/log/evasive/ tout seul, nous allons donc l'aider.
# mkdir /var/log/evasive
Il est nécessaire de placer les bons droits sur le répertoire qui vient d'être créé autrement Apache remplira le “syslog” du message suivant :
mod_evasive[17111]: Couldn't open logfile /var/log/evasive/dos-10.11.2.7: Permission denied
Application des doits :
# chown www-data:www-data /var/log/evasive
La configuration est terminée, il ne reste plus qu'à relancer Apache.
# /etc/init.d/apache2 reload
Un script écrit en Perl permet de tester votre installation. Il nous faut donc créer un fichier test-evasive.pl contanant ceci :
#!/usr/bin/perl # test.pl: small script to test mod_dosevasive's effectiveness use IO::Socket; use strict; for(0..100) { my($response); my($SOCKET) = new IO::Socket::INET( Proto => "tcp", PeerAddr=> "127.0.0.1:80"); if (! defined $SOCKET) { die $!; } print $SOCKET "GET /?$_ HTTP/1.0\n\n"; $response = <$SOCKET>; print $response; close($SOCKET); }
Source du code : http://tools.web4host.net/modevasive/test.txt
On le rend exécutable.
# chmod +x test-evasive.pl
Puis on commence le test (l'option DOSWhiteLt 127.0.0.1 doit être commentée).
# ./test-evasive.pl
Le résultat est visible sur cette page.