Comment se protéger contre DoS et DDoS avec mod_evasive pour Apache sur CentOS 7

introduction

Le module Apache mod_evasive, anciennement connu sous le nom de mod_dosevasive, aide à protéger contre les attaques par déni de service (DoS), DDoS (Distributed Denial of Service) et les attaques en force sur le serveur Web Apache. Il peut fournir une action évasive lors d'attaques et signaler des abus via des installations de messagerie et de syslog. Le module fonctionne en créant un tableau dynamique interne d'adresses IP et d'URI, ainsi qu'en refusant toute adresse IP parmi les suivantes:

  • Demander la même page plus de quelques fois par seconde

  • Faire plus de 50 demandes simultanées sur le même enfant par seconde

  • Faire des demandes tout en étant temporairement sur la liste noire

Si l'une des conditions ci-dessus est remplie, une réponse 403 est envoyée et l'adresse IP est enregistrée. Facultativement, une notification par courrier électronique peut être envoyée au propriétaire du serveur ou une commande système peut être exécutée pour bloquer l'adresse IP.

Dans ce tutoriel, nous expliquerons comment installer, configurer et utiliser mod_evasive sur votre serveur.

Conditions préalables

Avant de commencer avec ce tutoriel, vous devriez avoir les éléments suivants:

[[step-1 -—- Installing-mod_evasive]] == Étape 1 - Installation de mod_evasive

Dans cette section, nous allons installer les packages nécessaires au fonctionnement de mod_evasive et enfin installer mod_evasive.

Premièrement, nous devons installer le référentiel yum EPEL (Extra Packages for Enterprise Linux) sur le serveur. EPEL est un groupe d’intérêt spécial de Fedora qui crée, met à jour et gère un ensemble de logiciels de haute qualité add-on open source de haute qualité pour Enterprise Linux. Exécutez la commande suivante pour installer et activer le référentiel EPEL sur votre serveur:

Sur CentOS 7:

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

Sur CentOS 6:

sudo rpm -ivh http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

Vérifions que le référentiel EPEL est activé en utilisant:

sudo yum repolist

Si activé, vous verrez le référentiel suivant répertorié dans la sortie:

epel/x86_64                                                            Extra Packages for Enterprise Linux 7 - x86_64

Maintenant, protégeons les paquets de base d'EPEL en utilisant le plugin yumprotectbase.

sudo yum install yum-plugin-protectbase.noarch -y

Le but du pluginprotectbase est de protéger certains référentiels yum des mises à jour d'autres référentiels. Les packages des référentiels protégés ne seront ni mis à jour ni remplacés par des packages de référentiels non protégés, même si le référentiel non protégé a une version ultérieure.

Nous sommes maintenant prêts à installer le module mod_evasive. Exécutez la commande suivante pour l'installer:

sudo yum install mod_evasive -y

[[step-2 -—- verifying-the-installation]] == Étape 2 - Vérification de l'installation

Maintenant que mod_evasive est installé, vérifions que le fichier de configuration a bien été installé et que le module est en cours de chargement.

Lors de l'installation, le fichier de configuration mod_evasive/etc/httpd/conf.d/mod_evasive.conf a été ajouté. Pour vérifier cette exécution:

sudo ls -al /etc/httpd/conf.d/mod_evasive.conf

La sortie devrait ressembler à:

-rw-r--r-- 1 root root 3473 Jul 21 01:41 /etc/httpd/conf.d/mod_evasive.conf

Par défaut, la ligneLoadModule suivante sera ajoutée en haut du fichier de configurationmod_evasive.conf. Ouvrez le fichier et ajoutez la ligne si elle n’est pas déjà présente. Cette ligne indique au serveur Web Apache de charger et d'utiliser le module mod_evasive.

Sur CentOS 7, la ligne devrait se lire comme suit:

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

LoadModule evasive20_module modules/mod_evasive24.so

Sur CentOS 6, la ligne devrait être la suivante:

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

LoadModule evasive20_module modules/mod_evasive20.so

Énumérons les modules chargés pour le serveur Web Apache et recherchons mod_evasive:

sudo  httpd -M | grep evasive

La sortie devrait montrer:

 evasive20_module (shared)

[[step-3 -—- configuring-mod_evasive]] == Étape 3 - Configuration de mod_evasive

Maintenant que l’installation est terminée et vérifiée, examinons la configuration du module. mod_evasive peut être facilement personnalisé via le fichier de configuration demod_evasive.conf. Nous allons discuter de certains paramètres de configuration dans ce tutoriel. Veuillez vous référer au fichier de configuration pour des informations sur tous les paramètres - il contient une description de chaque paramètre.

L'une des options de configuration que vous devez modifier estDOSEmailNotify. C'est une directive très utile. Si cette valeur est définie, un courrier électronique sera envoyé à l'adresse électronique spécifiée chaque fois qu'une adresse IP est mise sur liste noire. Le corps de l'e-mail afficheramod_evasive HTTP Blacklisted 111.111.111.111

Par exemple, si vous souhaitez envoyer des alertes mod_evasive pour dire,[email protected], modifiez le fichier:

sudo nano /etc/httpd/conf.d/mod_evasive.conf

Décommentez la ligneDOSEmailNotify en supprimant les# devant la ligne et changez l'adresse e-mail en la vôtre:

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

DOSEmailNotify   [email protected]

[.note] #Note: mod_evasive utilise/bin/mail pour envoyer des alertes par e-mail. Vous devez avoir un serveur de messagerie installé et opérationnel, veuillez vous référer àthis tutorial pour plus d'informations sur la configuration d'un serveur de messagerie simple afin que les notifications par e-mail fonctionnent.
#

Un autre paramètre que vous voudrez peut-être définir estDOSWhitelist. À l'aide de cette option, les adresses IP des clients approuvés peuvent être ajoutées à la liste blanche pour garantir qu'elles ne sont jamais refusées. La liste blanche a pour but de protéger les logiciels, scripts, robots de recherche locaux ou autres outils automatisés contre toute demande de données volumineuses sur le serveur.

Pour ajouter une adresse IP à la liste blanche, par exemple 111.111.111.111, ajoutez une entrée dans le fichier de configuration comme suit:

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

DOSWhitelist    111.111.111.111

Les caractères génériques peuvent être utilisés sur les 3 derniers octets de l'adresse IP si nécessaire.

Pour ajouter à la liste plusieurs adresses IP de différentes plages IP, vous pouvez ajouter des lignes DOSWhitelist distinctes dans le fichier de configuration, comme suit:

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

DOSWhitelist    111.111.111.111
DOSWhitelist    222.222.222.222

DOSPageCount etDOSSiteCount sont deux autres paramètres qu'il est recommandé de changer pour des valeurs moins agressives pour éviter que les clients ne soient bloqués inutilement.

DOSPageCount est la limite du nombre de requêtes pour la même page par intervalle de page (généralement défini sur une seconde) par une adresse IP. Une fois que le seuil de cet intervalle a été dépassé, l'adresse IP du client sera ajoutée à la liste des personnes bloquées. La valeur par défaut est fixée à 2. Vous pouvez le changer pour une valeur plus élevée, disons 20, en modifiant ce qui suit dans/etc/httpd/conf.d/mod_evasive.conf:

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

DOSPageCount 20

DOSSiteCount est la limite du nombre total de demandes pour le même site Web par une adresse IP par intervalle de site (par défaut à 1 seconde). Pour le remplacer par une valeur supérieure, telle que 100 secondes:

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

DOSSiteCount 100

Il existe quelques autres paramètres que vous pouvez modifier pour obtenir de meilleures performances.

L'un estDOSBlockingPeriod, qui est la durée (en secondes) pendant laquelle un client (adresse IP) sera bloqué s'il est ajouté à la liste bloquée. Pendant ce temps, toutes les demandes ultérieures du client entraîneront une erreur 403 (interdit) et la réinitialisation du chronomètre (la valeur par défaut est 10 secondes).

Par exemple, si vous souhaitez augmenter la période de blocage à 300 secondes:

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

DOSBlockingPeriod    300

Un autre estDOSLogDir qui fait référence au répertoire temporaire utilisé par mod_evasive. Par défaut,/tmp sera utilisé pour un mécanisme de verrouillage, ce qui ouvre des problèmes de sécurité si votre système est ouvert aux utilisateurs du shell. Dans le cas où vous avez des utilisateurs shell non privilégiés, vous voudrez créer un répertoire accessible en écriture uniquement pour l'utilisateur sous lequel Apache s'exécute (généralementapache), puis définissez ce paramètre dans votre fichier mod_evasive.conf.

Par exemple, pour définir le répertoire utilisé par mod_evasive sur/var/log/mod_evasive, créez le répertoire en utilisant:

sudo mkdir /var/log/mod_evasive

Définissez ensuite la propriété sur l'utilisateurapache:

sudo chown -R apache:apache /var/log/mod_evasive

Maintenant, éditez la configuration mod_evasive et changez le répertoire comme suit:

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

DOSLogDir           "/var/log/mod_evasive"

Un autre paramètre estDOSSystemCommand. Si une valeur est définie, la commande spécifiée sera exécutée chaque fois qu'une adresse IP est sur liste noire. En utilisant ce paramètre, vous pouvez intégrer mod_evasive avec le pare-feu installé sur votre serveur ou un script shell et bloquer les adresses IP de la liste noire de mod_evasive dans le pare-feu.

[[step-4 -—- loading-the-mod_evasive-module]] == Étape 4 - Chargement du module mod_evasive

Une fois les modifications apportées au fichier de configuration, nous devons redémarrer le serveur Web Apache pour que celles-ci prennent effet. Exécutez la commande suivante pour redémarrer Apache.

Sur CentOS 7:

sudo systemctl restart httpd.service

Sur CentOS6:

sudo service httpd restart

[.note] #Note: Veuillez noter que mod_evasive semble entrer en conflit avec les extensions serveur FrontPage. Vous pouvez également vérifier les paramètres de votre serveur Web Apache pour vous assurer que mod_evasive est capable de fonctionner correctement. Les ajustements Apache suggérés doivent avoir une valeur très élevée pourMaxRequestsPerChild mais pas illimitée (une valeur de zéro implique un nombre illimité) et avoirKeepAlive activé avecKeepAliveTimeout défini raisonnablement long.
#

[[step-5 -—- testing-mod_evasive]] == Étape 5 - Test de mod_evasive

Laissez-nous faire un petit test pour voir si le module fonctionne correctement. Nous utiliserons un script perltest.pl écrit par les développeurs mod_evasive. Pour exécuter le script, nous devons d'abord installer le packageperl sur le serveur en utilisant:

sudo yum install -y perl

Le script de test est installé avec mod_evasive à l'emplacement suivant:

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

Par défaut, le script de test demande la même page à votre serveur Web Apache 100 fois de suite pour déclencher mod_evasive. Dans la dernière section, nous avons modifié mod_evasive pour qu’il soit plus tolérant des requêtes par seconde vers la même page. Nous devons modifier le script à 200 demandes consécutives au lieu de 100 pour nous assurer de déclencher toutes les méthodes de notification de mod_evasive.

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

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

Trouvez la ligne suivante:

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

for(0..100) {

Remplacez100 par200:

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

for(0..200) {

Sauvegarder et quitter.

Pour exécuter le script, lancez:

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

Vous devriez voir une sortie similaire à:

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
...

Le script effectue 100 demandes sur votre serveur Web. Le code de réponse 403 indique que l'accès est refusé par le serveur Web. mod_evasive se connecte également à syslog lorsque l'adresse IP est bloquée. Vérifiez le fichier journal en utilisant:

sudo tailf /var/log/messages

Il devrait montrer une ligne semblable à:

Jul 29 00:11:18 servername mod_evasive[18290]: Blacklisting address 127.0.0.1: possible DoS attack.

indiquant que l'adresse IP est bloquée par mod_evasive.

Si vous avez configuré mod_evasive pour envoyer des alertes par courrier électronique lorsqu'une adresse IP est bloquée, vous recevrez un courrier électronique avec le contenu suivant:

mod_evasive HTTP Blacklisted 127.0.0.1

Conclusion

mod_evasive est un excellent moyen de combattre les attaques par serveur unique, les attaques par script ainsi que les attaques distribuées. Toutefois, il n’est utile que si vous disposez de la bande passante totale et de la capacité du processeur de votre serveur pour traiter les requêtes invalides et y répondre. Pour cette raison, il est judicieux d’intégrer ce module au pare-feu de votre serveur pour une protection maximale. Sans une très bonne infrastructure et un pare-feu en place, une DDoS lourde risque de vous mettre hors ligne. Si une attaque est très lourde et persistante, vous devrez peut-être adopter une solution d’atténuation des attaques DDoS basée sur le matériel.