ZW3B :-: API Client * Contents * Docs by LAB3W.ORJ

Translate this page

Name : BETA-TESTERS

Project name : ZW3B-API-BETA-TESTERS

Authorized. - 200 - Client API Name and Origin Wildcard OK

¿Comment? 'Ou' ¿Que faire?, OS GNU/Linux, Serveurs, Howto Apache2 - Module evasive

Le module mod_evasive permet de détecter les floods et les tentatives de déni de service ou Deny of Service (DOS).

Author : O.Romain.Jaillet-ramey

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.

Installer le module Apache dédié à la prévention des attaques DoS

Script avec 2 lignes

001apt-get install libapache2-mod-evasive
002a2enmod mod-evasive
Retirer les numéros de lignes

Configurer 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.*
Retirer les numéros de lignes

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.

Tester le module evasive

Avec ApacheBench

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
Retirer les numéros de lignes

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
Retirer les numéros de lignes
Avec un script perl

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}
Retirer les numéros de lignes

Pour vérifier si vous êtes victime d'une attaque DoS, utilisez l'outil netstat

Script avec 1 ligne

001netstat -an | grep SYN
Retirer les numéros de lignes

Firewall contre les attaques DoS

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
Retirer les numéros de lignes

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 :