Name : BETA-TESTERS
Project name : ZW3B-API-BETA-TESTERS
Authorized. - 200 - Client API Name and Origin Wildcard OK
Le module mod_evasive permet de détecter les floods et les tentatives de déni de service ou Deny of Service (DOS).
Le serveur Apache peut être configuré pour limiter les impacts d'une attaque DoS. Le module mod_evasive
existe pour cela. Il crée une table dynamique des IP clients et des URL demandées. Par défaut, il blacklist et renvoie une erreur 403 si l'IP :
Il est éventuellement possible de configurer mod_evasive
pour qu'il communique avec un firewall.
Script avec 2 lignes
001apt-get install libapache2-mod-evasive 002a2enmod mod-evasive
vi /etc/apache2/httpd.conf
Script avec 22 lignes
001# taille de la table de surveillance, a augmenter pour les DDoS 002DOSHashTableSize 3097 003# Nb maximum de refresh d'une uri par periode 004DOSPageCount 5 005# Nb maximum de requete sur le site par periode 006DOSSiteCount 150 007# Duree de la periode pour la uri 008DOSPageInterval 1 009# Duree de la periode pour le site 010DOSSiteInterval 1 011# Duree du blacklistage de l'IP reconduite si retentative 012DOSBlockingPeriod 10 013# envoie de mail quant une IP est bloquee 014DOSEmailNotify "xxx@xxxxx.xxx" 015# repertoire des logs 016DOSLogDir "/var/log/mod_evasive/" 017# Execute une action quand une IP est bloquee 018DOSSystemCommand "/sbin/iptables -I INPUT -s %s -j DROP" 019DOSSystemCommand "/bin/echo %s >> /var/log/mod_evasive/dos_evasive.log && /bin/date >> /var/log/mod_evasive/dos_evasive.log" 020# Whitelist non surveillee 021DOSWhiteList 127.0.0.1 022DOSWhiteList 192.168.1.*
DOSHashTableSize
est la taille de la table de hachage. Plus cette valeur sera grande, moins il faudra d'itérations pour identifier un enregistrement. En revanche, la consommation de mémoire sera plus importante. Sur des serveurs Web à forte charge il est recommandé d'augmenter cette valeur.
DOSPageCount
définie le nombre de fois qu'une page peut être appelée par la même adresse IP avant que celle-ci ne soit bloquée.
DOSSiteCount
définie le nombre de fois qu'un site peut être demandé par la même adresse IP avant que celle-ci ne soit bloquée.
DOSPageInterval
détermine un intervalle en seconde qui autorise l'affichage d'une même page avant blocage.
DOSSiteInterval
détermine un intervalle en seconde qui autorise l'affichage d'un même site avant blocage.
DOSBlockingPeriod
détermine la durée du blocage.
DOSEmailNotify
permet l'envoi d'un email à chaque blocage d'adresse IP.
DOSSystemCommand
permet de définir une commande bien précise en cas d'attaque (bannissement de l'adresse IP dans IPTables par exemple).
DOSLogDir
détermine le chemin ou seront stockés les logs d'attaques.
DOSWhiteList
définie une liste blanche d'adresses IP.
Vous pouvez maintenant tester le résultat. Tout d'abord un test depuis le réseau local dans la whitelist, il ne doit y avoir aucune erreur :
Script avec 14 lignes
001ab -n 1000 -c 100 http://localhost/ 002This is ApacheBench, Version 2.3 <$Revision: 655654 $> 003Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ 004Licensed to The Apache Software Foundation, http://www.apache.org/ 005Benchmarking www.webstrat.fr (be patient).....done 006Server Software: Apache/2.2.11 007Server Hostname: localhost 008Server Port: 80 009Document Path: / 010Document Length: 27229 bytes 011Concurrency Level: 100 012Time taken for tests: 0.146 seconds 013Complete requests: 1000 014Failed requests: 0
Script avec 14 lignes
001# ab -n 1000 -c 100 http://mon-ip-publique/ 002This is ApacheBench, Version 2.3 <$Revision: 655654 $> 003Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ 004Licensed to The Apache Software Foundation, http://www.apache.org/ 005Benchmarking www.webstrat.fr (be patient).....done 006Server Software: Apache/2.2.11 007Server Hostname: mon-ip-publique 008Server Port: 80 009Document Path: / 010Document Length: 27229 bytes 011Concurrency Level: 100 012Time taken for tests: 4.614 seconds 013Complete requests: 1000 014Failed requests: 832
On va maintenant tester la configuration à l'aide d'un petit script perl livré avec le module mais il faut avant tout commenter temporairement la ligne DOSWhiteList 127.0.0.1 et redémarrer apache pour prendre en compte la configuration du module.
On crée un fichier vi test.pl
Script avec 13 lignes
001#!/usr/bin/perl 002# test.pl: small script to test mod_dosevasive's effectiveness 003use IO::Socket; 004use strict; 005for(0..100) { 006 my($response); 007 my($SOCKET) = new IO::Socket::INET( Proto => "tcp", PeerAddr=> "127.0.0.1:80"); 008 if (! defined $SOCKET) { die $!; } 009 print $SOCKET "GET /?$_ HTTP/1.0nn"; 010 $response = <$SOCKET>; 011 print $response; 012 close($SOCKET); 013}
netstat
Script avec 1 ligne
001netstat -an | grep SYN
Contre les attaques DoS de haut niveau, l'usage d'un firewall est le plus efficace.
iptables
permet de limiter le nombre de connexions simultanées provenant d'une adresse IP ou d'un réseau, le nombre de connexions depuis une source, le tout sur une période donnée. Les règles suivantes permettent de limiter le nombre de connexion depuis une source à 50 hits pendant 10 secondes sur le port 80, paramètre à ajuster en fonction de vos besoins :
Script avec 2 lignes
001iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW -m recent --set --name WEB 002iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW -m recent --update --seconds 10 --hitcount 50 --rttl --name WEB -j DROP
Cela évite les attaques DoS simples mais reste peu efficace face aux attaques massivement distribuées. On parle alors d'attaque par déni de service distribuée ou de Distributed Denial of Service attacks ou DDoS.
Des centaines voir des milliers d'ordinateurs, souvent infectés par un virus, sont alors utilisés pour envoyer simultanément des requêtes à votre serveur. Dans ce cas, la capacité du hardware de votre infrastructure, routeur et serveur, à traiter les requêtes est prédominante.
Sportivement... :/
Sources :