RESUME

Cet article montre comment se prémunir des attaques DOS contre un serveur web APACHE installé dans un environnement CentOS-7. On verra comment:

  • vérifier que le module de protection n’existe pas encore
  • simuler des attaques sans ce module de protection
  • installer le module de protection contre de telles attaques
  • vérifier que lemodule de protection joue bien son rôle

VERIFIER LA (non)PRESENCE DU MODULE MOD_EVASIVE

Le module Apache de protection est le module « mod_evasive ».

Vérifions qu’il n’et pas encore installé sous Apache:

httpd -M

Le programme de simulation des attaques est fourni dans le même package que le mod_evasive. On va donc commencer par installer mod_evasive mais sans l’activer.

INSTALLATION DE MOD_EVASIVE

rpm -ivh http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-9.noarch.rpm

si il y a conflit avec la version 7.6, laisser la version 7.6 car la version minimale nécessaire est la 7.5

Vérifier avec « yum repolist » que le repository « epel » est bien enregistré.

Pour éviter que des packages de certains repositories soient modifiés en upgrade par des packages de types analogues provenant d’autres repositories, installer la protection de la base de repositories:

yum install yum-plugin-protectbase.noarch -y

 

Et finalement, installer le package mod_evasive:

yum install mod_evasive -y

SIMULER UNE PREMIERE ATTAQUE

le script d’attaque est:

/usr/share/doc/mod_evasive-1.10.1/test.pl

 

Dans le script, on trouve une boucle pour multiplier les attaques et une adresse. Il est conseillé d’écrire l’adresse dans son format IP véritable (192.168.1.xxx par exemple) et non en 127.0.0.1.

 

Tester le script et vérifier que les réponses arrivent (status OK) et qu’aucune n’est bloquée.

Le principe avec mod_evasive est que si trop de requêtes arrivent trop rapidement depuis la même adresse, elles sont rejetées.

CONFIGURATION DE MOD_EVASIVE

 

Le fichier de configuration est:

/etc/httpd/conf.d/mod_evasive.conf

Repérer au début du module l’instruction proprement dite de chargement du module:

LoadModule evasive20_module modules/mod_evasive24.so

Vérifier que le module est bien compris par Apache (il sera pris en compte au prochain redémarrage de Apache)

httpd -M | grep evasive
evasive20_module (shared)

Si vous souhaitez envoyer des e-mails pour prévenir l’administrateur en cas d’attaques DOS, décommenter et adapter la ligne DosEmailNotify. Par exemple:

DOSEmailNotify   dominique.m@gmail.com

Bien sûr, il faut disposer d’un serveur de mails car mod_evasive utilise la commande /bin/mail. Si vous voulez savoir comment faire pour installer simplement un serveur de mails, reportez-vous à cette documentation:

https://www.digitalocean.com/community/tutorials/how-to-send-e-mail-alerts-on-a-centos-vps-for-system-monitoring

Pour ne pas bloquer certaines adresses qui effectueraient des tests avec beaucoup de requêtes, on utilise les directives (examples) ci dessous qui doivent être positionnées dans le fichir de configuration:

DOSWhitelist    111.111.111.111
DOSWhitelist    222.222.222.222

 

DOSPageCount

ce paramètre indique le nombre de requêtes d’une page maximum par « DosPageInterval » secondes qu’on accepte d’une adresse. Si le nombre de requêtes provenant de cette adresse est supérieur à DOSPageCount alors l’ip qui est à l’origine de ces requêtes est bloquée.

DOSSiteCount

ce paramètre indique le nombre de requêtes maximum faites sur le site par « DosSiteInterval » secondes qu’on accepte d’une adresse. Si le nombre de requêtes provenant de cette adresse est supérieur à DOSSiteCount alors l’IP d’origine de ce requêtes est bloquée.

Noter que DOSSiteCount est supérieur à DosPageCount car une seul page peut contenir plusieurs images, javascripts, css etc qui font que les requêtes se multiplient.

Une fois qu’une IP est bloquée, le bocage dure pendant:

DOSBlockingPeriod

(secondes)

Enfin,

DOSLogDir 

estle répertoire des logs qui doit être inscriptible par le user « apache ».

REDEMARRAGE ET TESTS

systemctl httpd restart

poser un DOSPageCount à 1 et un DOSPageINterval à 10 et relancer le script de test. Vous verrez très rapidement un « forbidden »

Leave a Comment