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:
-
DropOS 64 bits CentOS 7 (fonctionne également avec CentOS 6)
-
Utilisateur non root avec privilèges sudo. Pour configurer un utilisateur de ce type, suivez le tutoriel deInitial Server Setup with CentOS 7. Toutes les commandes seront exécutées sous cet utilisateur.
-
Serveur Web Apache s'exécutant sur le droplet. Pour installer Apache, veuillez suivre l'étape 1 de l'articleHow To Install Linux, Apache, MySQL, PHP (LAMP) stack on CentOS.
[[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.