Accueil Technologies Debian / VPS – Avec Fail2ban, protégez votre serveur des attaques DDOS, XmlRPC, SSH…
Debian - VPS – Protéger votre serveur avec Fail2Ban d'attaque DDOS, XmlRPC, SSH,...

Debian / VPS – Avec Fail2ban, protégez votre serveur des attaques DDOS, XmlRPC, SSH…

par Jérémy PASTOURET
Publié : Mis à jour le

Comme vous le savez, j’apprécie vraiment tout ce qui touche à la sécurité. Dans ce nouveau tutoriel, je vais vous apprendre à protéger votre gentil serveur contre les grosses attaques qu’il peut subir. En fait le principal problème dans ce domaine, c’est de trouver le juste milieu entre trop de sécurité et pas assez. Car trop de sécurité rend le travail sur un serveur plus compliqué : il faut une tonne d’authentification, qui alourdit l’accès puisque le coût de traitement est plus gros.

Présentation de Fail2Ban

Logo Fail2ban

Fail2ban est un analyseur de fichier de logs en tout genre. Il bannit les adresses IP qui ont des comportements étranges. Par exemple : trop de tentatives de connexion avec des mots de passe qui ne fonctionnent pas, recherche de failles, etc. Pour cela, Fail2ban met à jour le pare-feu de votre système Linux. Petit rappel : un pare-feu est un service qui contrôle puis autorise ou bloque des adresses IP ou sites web à rentrer ou sortir de votre système. Vous pouvez par exemple demander au pare-feu d’interdire l’accès à Google à tout les utilisateurs de votre serveur Linux. Vous pouvez aussi dire à votre pare feu d’empêcher telle adresse IP d’accéder à votre site Web. Si vous souhaitez obtenir plus d’informations sur Fail2ban, un wiki complet est disponible. Le projet est même présent sur GitHub si vous souhaitez le consulter.

Connexion au serveur

Je vous propose maintenant d’entrer dans le vif du sujet et de vous connecter en SSH, ou directement sur votre serveur afin d’avoir un terminal pour lancer des commandes. Vous devez vous mettre en root, car le système qui va protéger votre serveur doit avoir accès aux commandes clés de celui-ci. Pour passer en root, il vous suffit de taper la commande suivante :

su

Puis saisissez votre mot de passe suivi de la touche entrée.

Téléchargement de Fail2ban

Étant donné que Fail2ban est sous Github, je vous propose d’utiliser le programme Git pour le télécharger. Si celui-ci n’est pas installé sur votre serveur, lancez la commande suivante :

apt-get install git

Pour réaliser une installation propre, je vous propose de télécharger Fail2ban dans notre répertoire de téléchargement en tapant :

cd Téléchargements/

Ensuite, vous pouvez cloner (télécharger le code) en utilisant la commande suivante :

git clone https://github.com/fail2ban/fail2ban.git

Vous obtiendrez le résultat suivant :

git clone fail2ban

Ensuite, vous allez rentrer dans le dossier nouvellement crée et vérifier que vous êtes sur la dernière branche (version) du projet. Pour cela, lancez les commandes suivantes :

cd fail2ban/
git branch

Je vous conseille de prendre la dernière version publiée par la communauté car j’ai voulu tester la version LTS (stable) mais je n’ai pas réussi à la faire fonctionner. A priori Fail2ban n’a pas de véritable version stable, il corrige en continu – c’est l’impression que j’ai. Actuellement, nous en sommes à la version 0.11. Comme vous pouvez le constater l’équipe de Fail2ban n’est toujours pas passé à la version 1.0. Ce qui prouve bien que pour eux il n’y a pas encore de version bien complète. Malgré tout, je vous assure que le programme fonctionne superbement bien. Surtout si vous prenez la dernière version qu’ils considèrent comme expérimentale.

Installation de Fail2ban

Pour installer Fail2ban, rien de plus simple : il suffit de lancer la commande suivante :

python setup.py install

Techniquement, vous devriez être au même niveau que moi :

Vérification de la branch et installation de fail2ban

Vérification de l’installation de Fail2ban

Une fois l’opération terminée, je vous propose de vérifier si l’outil est bien installé. Pour cela, il suffit simplement de lancer la commande :

fail2ban-client

Vous obtiendrez ce résultat si tout s’est bien passé :

Vérification de l'installation fail2ban-client

Création d’un fichier de configuration pour fail2ban

Maintenant, nous allons créer un fichier de configuration qui nous est propre. Celui-ci va surcharger la configuration de base de Fail2ban. C’est plutôt pratique, surtout si on fait des erreurs : on peut alors repartir de la configuration de base sans problème. Pour faire notre propre configuration, je vous propose de lancer la commande suivante :

nano /etc/fail2ban/jail.d/defaults-debian.conf

Ensuite, vous devez copier-coller le contenu suivant dans le fichier :

[DEFAULT]
ignoreip = 127.0.0.1/8 12.34.56.65

# 1 jour de bannissement pour tous les plugins
bantime = 86400
# Un hôte est banni si il a généré “maxretry” pendant les dernières “findtime”
# seconds.
findtime = 600

# “maxretry” est le nombre d'échec avant qu'un hôte soit banni.
maxretry = 5

[wordpress-xmlrpc]
enabled = true
port     = http,https
logpath  = %(apache_access_log)s
bantime  = 48h
maxretry = 1

N’oubliez pas d’y apporter deux retouches, sinon ce serait trop simple. Vous devez absolument renseigner l’adresse IP de votre ordinateur sur la ligne ignoreip. A défaut, vous risquez de vous retrouver banni de votre propre système.

Ensuite, il est possible que vous deviez changer le logpath si vous avez une configuration particulière. La propriété est située à la troisième ligne en partant du bas : vous devez mettre le chemin de vos fichiers de logs serveur Apache2.

Vous devriez obtenir un résultat similaire à cette capture d’écran :

Surcharge de la configuration de fail2ban

Quelques d’explications : au dessus de la partie [wordpress-xmlrpc] se trouvent des configurations « générales« .  Notamment la liste d’adresses IP à ignorer (white list). On bloque pendant un jour les attaquants (bantime), et on assimile les utilisateurs à des hackers lorsqu’ils réalisent plus de 5 tentatives d’attaques (maxretry) dans un intervalle de 600 secondes (findtime).

Concernant la propriété [wordpress-xmlrpc], on utilise le nom enabled = true pour informer Fail2ban qu’on active cette prison. Port définit sur quel port, nous allons bloquer l’attaquant. Logpath correspond quant à lui au chemin dans lequel il peut analyser les logs. Pour finir nous avons bantime et maxretry dont je vous ai expliqué l’utilité plus haut.

Bien sûr, n’oubliez pas de sauvegarder le fichier.

Création de la prison

Maintenant que l’on a défini la prison, nous devons la décrire. C’est à dire apprendre à Fail2ban comment détecter un attaquant.

Pour cela, nous allons créer un fichier de prison en tapant la commande suivante :

nano /etc/fail2ban/filter.d/wordpress-xmlrpc.conf

Avis aux fans des regex : vous allez être servis !

A l’intérieur du fichier, vous devez saisir les commandes suivantes :

[Definition]
failregex = ^<HOST> .* "(GET|POST) .*xmlrpc.php
ignoreregex = .*IFTTT|.*wp-android.*

Explication du fonctionnement : failregex définit la règle pour déterminer qu’une ligne de log représente l’action d’un attaquant. ignoreregex définit une règle supérieur indiquant à fail2ban d’ignore certaines lignes dans notre cas éviter de bloquer le célèbre service IFTTT et que l’application WordPress soit bloqué.

Maintenant que nous nous sommes occupés de la configuration de base, démarrons notre serveur Fail2ban pour vérifier qu’il arrive bien à bannir les attaquants.

Lancement du serveur Fail2ban

Pour le démarrer, c’est très simple, il suffit de faire un:

fail2ban-client start

Celui-ci doit vous répondre Server ready,comme ci-dessous :

Démarrer le serveur Fail2Ban

Vérification de la prison

Pour vérifier que la prison a bien été prise en compte, tapez :

fail2ban-client status

Vous pourrez connaître le nombre de prison activées dans Fail2ban.

Pour savoir si des détenus se trouvent dans une prison en particulier, vous devez taper cette commande :

fail2ban-client status wordpress-xmlrpc

Vous avez dû comprendre que vous pouvez remplacer wordpress-xmlrpc par n’importe quel nom de prison que vous avez paramétré. Pour l’instant il n’y en a qu’une, donc le choix est vite fait. Vous devriez avoir le même résultat que moi :

Vérification du status de la prison WordPress Fail2ban

On peut voir que le système a bien détecté nos fichiers de logs Apache. Pour le moment, il y a 0 lignes analysées et personne n’est bloqué.

Test : se faire bannir

L’heure est enfin arrivée de vérifier si les indésirables se font bien bannir. Je vous conseille de prendre votre smartphone, de vous déconnecter du WIFI et d’activer la connexion 4G. Ensuite, rendez-vous sur votre site WordPress en ajoutant la fameuse page xmlrpc.php.

Vous allez donc tomber sur ce résultat :

Test : se faire bannir avec Fail2ban

Comme vous pouvez le constater, le serveur ne vous a pas bloqué et vous a même répondu correctement. Je vous propose de retourner sur notre chère console du serveur afin de regarder l’état de notre prison. Pour cela, tapez la commande suivante :

fail2ban-client status wordpress-xmlrpc

Et là : magie. Vous devriez obtenir à peu près ce résultat :

Bannisement de notre adresse Ip avec Fail2ban

Dans la partie Actions, on constate que le système a banni une adresse IP : 192.168.1.18. Donc c’est déjà pas mal, le système a bien compris qu’il s’agissait d’une attaque. Maintenant, nous allons vérifier si l’action mise en œuvre pour bloquer l’attaquant identifié fonctionne. Pour cela, rien de plus simple, il suffit de rafraîchir la page web sur votre smartphone.

Voici le résultat :

Page bloqué par fail2ban

Se faire débannir

Vous pouvez facilement vous débannir grâce à une ligne de commande :

fail2ban-client set wordpress-xmlrpc unbanip <ip-address>

Bien entendu, vous devez remplacer ip-address par l’adresse IP qui a été bloquée. Si vous souhaitez vérifier que l’action a bien fonctionné, vous pouvez essayer de retourner sur votre site web ou lancer la commande suivante :

fail2ban-client status wordpress-xmlrpc

Vous devriez obtenir le même résultat que moi : 

Unban|débannir xmlrpc IP avec fail2ban

Bannissement sur le port SSH

Enfin, pour terminer, je vous propose d’essayer de vous bannir avec le protocole SSH. C’est plutôt simple : essayez de vous connecter à votre serveur SSH en tapant un mauvais mot de passe. Réessayez plusieurs fois, et voici ce que vous obtiendrez :

Bannissement par SSH avec fail2ban

Vous pouvez utilisez la même technique que précédemment pour vous débannir.

Debogage de prison

Si vous développer une prison ou si tout simplement vous souhaitez déboguer une expression régulière d’une prison, vous pouvez utilisez la commande suivante : 

fail2ban-regex <chemin_de_log> <chemin_du_filter> <argument_affichage>

Par exemple : pour deboguer la prison wordpress-xmlrpc en affichant toutes les lignes correspondant à l’expression, lancez la commande suivante :

fail2ban-regex /var/log/apache2/access.log /etc/fail2ban/filter.d/wordpress-xmlrpc.conf --print-all-matched

Vous obtiendrez ce résultat :

Fail2ban-regex - deboguage de prison

Dans l’encadré rouge, vous trouverez les spammers qu’on a récupéré dans notre filet.

Conclusion

On arrive au terme de cet article détaillé. Vous aurez à présent, je l’espère, toutes les clés pour gérer correctement Fail2ban. Mais en tout cas, prenez bien garde à ce que vous faites. Je vous conseille d’ailleurs de jouer sur une machine virtuelle pour apprendre à utiliser Fail2ban. Ce serait dommage d’être bloqué… par soi-même.

Si vous rencontrez des problèmes de compréhension ou de mise en œuvre, les commentaires sont un bon moyen de vous (entr)aider et compléter l’article. Si vous vous sentez de tester d’autres prisons qui marchent bien, je pourrai en dresser une liste ; on peut procéder de la même manière en les notant dans les commentaires.

Pour écrire ce tuto / article, nous avons utilisé les commandes sur notre serveur chez notre partenaire IKOULA. Pour plus d’informations sur leur service, rendez-vous sur leur site ou sur notre article consacré aux solutions d’IKOULA.

Pour aller encore plus loin, lisez l’article suivant afin d’utiliser une blacklist contenant les spammers à bloquer.

Vous pourriez aussi aimer

2 commentaires

Paul 8 février 2019 - 18 h 38 min

Les « catch-all » de type .* sont peu efficaces.
Utiliser plutôt \s ou \w avec * ou +, par exemple \s* ou \s+

Répondre
Jérémy PASTOURET 10 février 2019 - 22 h 53 min

Merci Paul pour cette astuce que je vais tester sous peu.

Répondre

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.