Limiter les attaques DOS par brute force

© Christian PAULUS. Document créé le 30 janvier 2012 , mis à jour le 9 février 2012.

L'Homme est une prison où l'Âme reste libre. Victor Hugo

Accueil du site > Astuces > Apache > Limiter les attaques DOS par brute force

Configuration mod_evasive / Apache 2 / FreeBSD

Besoin de limiter les attaques DOS sur votre serveur WEB ? Ras le bol de voir passer des dizaines, des centaines de requêtes sur des fichiers qui n’existent pas ?

Quelques modules pour Apache proposent de régler - un tant soit peu - ce problème qui gangrène Internet depuis plusieurs années.

mod_evasive pour limiter DOS brut force

mod_evasive est un module pour Apache qui permet de limiter les attaques DoS HTTP par force brute. Son scénario est d’une grande simplicité : lorsqu’il détecte une tentative nuisible (plusieurs connexions provenant de la même adresse IP dans un temps relativement court), il renvoie une réponse évasive (d’où son nom), non explicite donc : une erreur 403 HTTP (Forbidden, page non autorisée).

Installer mod_evasive sur FreeBSD

En moins d’une minute :

  • cd /usr/ports/www/mod_evasive/
  • make install
  • cd /usr/local/etc/apache22/
  • Editez le fichier httpd.conf et validez la ligne LoadModule evasive20_module libexec/apache22/mod_evasive20.so
  • Ajoutez à ce fichier httpd.conf la ligne Include etc/apache22/extra/httpd-evasive.conf
  • Recopiez le fichier de configuration dans /usr/local/etc/apache22/Includes

Ne pas oublier de redémarrer le serveur Apache.

Vous êtes plutôt Linux ? Allez donc consulter la page de tux-planet qui présente un guide d’installation du module mod_evasive sur une distribution de type Red Hat, centOS, Fedora...

Le fichier de configuration mod_evasive

Voici un exemple de fichier de configuration :

<IfModule mod_evasive20.c>

  # Taille de la table de hachage des adresses IP.
  DOSHashTableSize    3097

  # Nombre de pages autorisées par DOSPageInterva
  DOSPageCount        2

  # Temps en secondes utilisé par DOSPageCount
  DOSPageInterval     1

  # Nombre d'objets autorisés par DOSSiteInterval.
  # Objet: images, fichiers css, etc...
  DOSSiteCount        100

  # Temps en secondes utilisé par DOSSiteCount
  DOSSiteInterval     1

  # Temps en secondes où les adresses IP seront interdits.
  # Si une IP tente d'accéder au serveur dans ce délai,
  # le décompte sera redémarré.
  DOSBlockingPeriod   10

  # Facultatif. Répertoire pour stocker les journaux.
  # S'il n'est pas spécifié,
  # le répertoire tmp sera utilisé.
  #DOSLogDir                "/var/lock/mod_evasive"
  # Ne pas oublier de créer le dossier
  # et de lui donner les droits nécessaires.
  DOSLogDir                "/usr/local/var/mod_evasive"

  # Facultatif. Adresse de destination des notifications.
  DOSEmailNotify root@localhost
 
  # Facultatif. Commande executée en cas de détection
  # Exemple :
  #DOSSystemCommand        "su - someuser -c '/sbin/... %s ...'"
  # Autre exemple :
  #DOSSystemCommand "/sbin/iptables -I INPUT -p tcp --dport 80 -s %s -j DROP"

  # Falcutatif. Liste des adresses IP
  # qui ne seront pas bloquées
  DOSWhitelist 127.0.0.1

</IfModule>

Essayez différents réglages. La configuration par défaut ne correspond par forcement à votre besoin. Prenez le temps de consulter le fichier des erreurs HTTP pour affiner certaines valeurs, telles que - par exemple - DOSSiteCount.

Tester le module mod_evasive

Le script perl test.pl proposé dans la distribution permet de lancer une centaine de requêtes sur votre serveur, et de vérifier le bon fonctionnement du module.

Dans le fichier de configuration donné en exemple ci-dessus, le nombre de requêtes acceptées est de 100. Il est donc nécessaire d’adapter le script de test à ce réglage. Exemple :

#!/usr/bin/perl

# test.pl: small script to test mod_dosevasive's effectiveness

use IO::Socket;
use strict;

for(0..150) {
 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);
}

Lancez le script est surveillez le journal /var/log/messages. La ligne suivante doit apparaître :

Jan 30 21:00:04 server mod_evasive[65216]: Blacklisting address 127.0.0.1: possible DoS attack.

Attention, dans cet exemple, il faut dévalider DOSWhitelist 127.0.0.1 dans le fichier de config, ou lancer la requête à partir d’une machine distante.

Plussoyez !

Les forums sont fermés.