Libapache2-mod-evasive

De Le Wiki du Forum-Debian.fr
Aller à la navigation Aller à la recherche

mod_evasive? Qu'est-ce c'est?

mod_evasive est un module pour Apache permettant d'éviter les "manœuvres évasives": déni de service, attaque DDoS HTTP, ou encore une attaque par force brute.

Il est également conçu pour être un outil de détection, et peut être facilement configuré pour dialoguer avec ipchains, les firewalls, routeurs, etc.

La détection est réalisée par la création d'une table dynamique interne de hachage, et permet de détecter les action suivantes:

- Demander la même page plusieurs fois par seconde

- Faire plus de 50 requêtes simultanées par seconde

- ...

Les demandes légitimes sont rarement bloquées même pour un utilisateur qui rechargera une page à plusieurs reprises.

Installation

# apt-get install libapache2-mod-evasive

Il est en principe automatiquement chargé, mais pour vérifier, vous pouvez lancer les commandes suivantes:

# a2enmod mod-evasive
Module mod-evasive already enabled

  1. apachectl -M

Loaded Modules:

...
evasive20_module (shared)
...

Syntax OK

Configuration basique de Mod_evasive

Le fichier /usr/share/doc/libapache2-mod-evasive/README.gz contient un exemple de configuration basique:

APACHE v2.0
-----------
<IfModule mod_evasive20.c>
    DOSHashTableSize    3097
    DOSPageCount        2
    DOSSiteCount        50
    DOSPageInterval     1
    DOSSiteInterval     1
    DOSBlockingPeriod   10
</IfModule>

Vous pouvez ajouter les directives suivantes (à adapter...)

DOSEmailNotify      you@yourdomain.com
DOSSystemCommand    "su - someuser -c '/sbin/... %s ...'"
DOSLogDir           "/var/lock/mod_evasive"

Quelques explications:

  1. DOSHashTableSize Taille de la table hash. Plus elle est grande, plus le traitement est rapide, mais plus ça consomme de ressources...
  2. DOSPageCount définit le nombre de fois ou une page peut être appelée par la même adresse IP avant que celle-ci ne soit bloquée.
  3. DOSSiteCount définit le nombre de fois ou un site peut être demandé par la même adresse IP avant que celle-ci ne soit bloquée.
  4. DOSPageInterval détermine un intervalle en secondes qui autorise l’affichage de la même page avant un blocage.
  5. DOSSiteInterval détermine un intervalle en secondes qui autorise l’affichage d’un même site avant un blocage.
  6. DOSBlockingPeriod détermine la durée de blocage (en secondes).
  7. DOSEmailNotify permet qu’un email soit envoyé à chaque blocage d’adresses IP.
  8. DOSSystemCommand permet de définir une commande bien précise en cas d’attaque (bannissement de l’adresse IP dans IPTables par exemple).DOSSystemCommand "/sbin/iptables -I INPUT -s %s -j DROP"Ou encoreDOSSystemCommand "/sbin/iptables -I INPUT -p tcp --dport 80 -s %s -j DROP" Vous pouvez passer n'importe quelle commande du moment que www-data est autorisé à le faire. A ce sujet, plutôt que d'autoriser www-data à manipuler Iptables, utilisez fail2ban... Voir ci-dessous le lien.
  9. DOSLogDir détermine le chemin ou seront stockés les logs d’attaques.
  10. DOSWhiteLt définie une liste blanche d’adresse IP.


Il faut mettre en place le dossier qui va stocker les adresses IP blacklistées :

mkdir -p /var/lock/mod_evasive
chown -R www-data:www-data /var/lock/mod_evasive

Et on relance le serveur Apache:

/etc/init.d/apache2 restart

Remarque sur DOSEmailNotify

Pour que la commande fonctionne, il faut créer un lien symbolique de /usr/sbin/mail vers /bin/mail

En effet, le module cherche l'exécutable /bin/mail; Or celui-ci n'est pas à cet endroit...

ln -s /usr/bin/mail /bin/mail

Remarque sur Iptables

Pour que le ban par mod-evasive fonctionne, il faut que www-data ait le droit de modifier iptables. Or, cela peut s'avérer TRèS DANGEREUX...

Il est donc conseillé de se servir à la place de fail2ban qui prendra le relais...

Fail2ban avec mod-evasive

test

  1. cd /usr/share/doc/libapache2-mod-evasive/examples
  2. perl test.pl

HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden HTTP/1.1 403 Forbidden

L'IP est bien bloquée:

# cat /var/log/syslog | grep evasive
Nov  2 11:03:35 nas mod_evasive[13422]: Blacklisting address 127.0.0.1: possible DoS attack.
# ls /var/lock/mod_evasive/
dos-127.0.0.1

Recommençons en mettant l'IP en liste blanche (DOSWhitelist)

# rm /var/lock/mod_evasive/*
# nano /etc/apache2/apache2.conf
...
<IfModule mod_evasive20.c>
...
   DOSWhitelist 127.0.0.1
   DOSWhitelist 127.0.0.*
</IfModule>
...
# service apache2 restart
Restarting web server: apache2 ... waiting .

  1. perl test.pl

HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK

# ls /var/lock/mod_evasive/
#

crontab

Pour finir, on peut mettre en place la crontab suivante pour purger le dossier de blacklist de temps en temps (commande pas encore testée):

# Menage mod_evasive
00 5 * * * www-data find /var/lock/mod_evasive -mtime +1 -type f -exec rm -f '{}' \;

Sources


Lol 2 novembre 2011 à 04:02 (CDT)