Fail2ban : protéger son serveur des attaques DoS et Bruteforce

Bloqueur de pub détectée - Vous bloquez l'affichage des publicités.
Pour soutenir le site, merci de bien vouloir laisser les publicités s'afficher
Plus d'informations : Comment désactiver les bloqueurs de publicité sur un site internet

Fail2ban est un service Linux qui analyse les logs pour bannir les adresses IP ayant un comportement malveillants.
Il analyse les logs pour détecter trop d'échecs de mot de passe, recherche d'exploits, etc.
Lorsqu'une machine distante correspond à ces critères, il créé créé automatiquement une règle de blocage sur le pare-feu firewall iptables, ipset, shorewall ou ufw.
Ainsi les bots, machines compromises sont automatiquement bloqués sur votre serveur.
De ce fait, fail2ban aide à sécuriser et protéger son serveur des attaques par déni de service (DoS) et Bruteforce comme WordPress, serveur mail Postifx, SSH et autres.

Mais on peut aller plus loin.
En effet, Fail2ban réagit selon des filtres et donc vous pouvez tout à fait créer un filtre pour bannir une IP après une activité spécifique.

Cet article vous aide à installer et configurer Fail2ban.
Ce sera essentiellement sur la distribution Debian.

Fail2ban : protéger son serveur des attaques DoS et Bruteforce

Fail2ban : protéger son serveur des attaques DoS et Bruteforce

Principe de fonctionnement de Fail2ban

Fail2ban scrute les fichiers de logs à la recherche d'occurrence définies dans des filtres.
Si l’occurrence est présente, cela déclenche une action.
On peut définir aussi un seuil à dépasser.

Cette action peut par exemple être l'ajout d'une IP dans une règle de blocage Iptables ou Ipset, l'envoi d'un mail, reporter une IP vers un système d'abuse, etc.
Enfin l'utilisateur peut créer ses propres filtres et actions pour sécuriser les services installés sur son serveur.

Lorsque Fail2ban créé une règle de blocage d'IP, l’utilisateur peut déterminer, le temps de bannissement pour ensuite la débanir.
Cela grâce au fait que les filtres sont capables de lire les dates et timestamp pour connaître la date de l'attaque.

Ainsi Fail2ban est vraiment un outil puissant pour contrer des attaques par brutefoce et mitiger les attaques DoS.

Installer fail2ban

L'installation est relativement simple, car il est disponible sur apt-get.

apt-get install fail2ban

A l'issu un dossier /etc/fail2ban est créé avec les fichiers et dossiers de configurations.

Les dossiers et fichiers de configuration de fail2ban

Pour s'y retrouver et y voir plus clair, voici un tableau qui les récapitule.

Dossiers/fichiersDescription
action.dLes actions à effectuer lorsqu'un filtre est positif
fail2ban.confLes paramètres généraux de fail2ban
fail2ban.dL'utilisateur peut créer un fichier de configuration pour personnaliser les réglages de fail2ban
filter.dLes fichiers de configuration des filtres
jail.confLe fichier de configuration des prisons
jail.dC'est là où place nos fichiers de configuration pour activer les prisons configurés dans jail.conf ou ajoutés par vous même
Les dossiers et fichiers de Fail2ban

Les services à protéger et sécuriser se définissant jail.d.
Ce dernier utilisent les filtres et les actions à effectuer.
Il ne faut en aucun cas modifier jail.conf car vous risquez de perdre son contenu à la prochaine mise à jour de la distribution.
Ajoutez à chaque fois un fichier de configuration dans jail.d

Voici la liste des actions fail2ban par défaut, comme vous ouvrez le voir, elles sont nombreuses.

Les fichiers de configuration pour les actions fail2ban

Exemple de prison avec la protection SSH

Sur Debian, par défaut, le filtre SSH est actif.
Ainsi il protège des attaques bruteforce contre ce service SSH qui est très visé.

L'activation se trouve dans le fichier /etc/fail2ban/jail.d/defaults-debian.conf grâce au paramètre enabled à true.

[sshd]
enabled = true

La configuration se trouve dans jail.conf

Fail2ban va alors scruter le contenu de /var/log/auth.log afin de vérifier les tentatives de connexion SSH.
Ensuite il reporte tout dans son journal. Ainsi pour vérifier si des détections ont lieu, il faut regarder dans le journal /var/log/fail2ban.log.

Le journal /var/log/fail2ban.log
  • Found : l’occurrence est trouvée
  • Ban : le seuil est dépassé (maxfailure) et l'action est réalisée

Activer et tester un filtre

Ainsi, pour activer une prison, vous pouvez créer votre fichier /etc/fail2ban/jail.d/jail.local.
Puis vous activez les zones de prisons souhaités en ressaisissant les paramètres comme dans l'exemple SSH.
Sinon vous pouvez aussi copier entièrement le fichier jail.conf de cette manière :

cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

puis activez les zones de prisons souhaitées avec le paramètre enabled à true.

Pour bien comprendre, voici un exemple de sections et paramètres complets.
Imaginons que vous aillez un serveur WEB avec Nginx.
Vous avez configuré des limites de taux comme expliqué dans ce tutoriel : Nginx : protection contre les attaques DoS
Ensuite vous désirez configurer fail2ban pour bannir et blacklister toutes les IP qui dépassent le taux.

Voici un exemple avec les paramètres les plus utiles en exemple.

[nginx-req-limit]
enabled = true
filter = nginx-limit-req
action   = iptables-ipset-proto4[name=fail2ban-nginx, port="http,https", protocol=tcp, bantime=0]
logpath = /var/log/nginx/error.log
maxfailures = 2
findtime = 600
bantime = 7200
maxretry = 4
ignoreip=66.130.112.0/24 40.112.0.0/13, 40.74.0.0/15, 40.80.0.0/12, 40.124.0.0/16, 40.120.0.0/14, 40.76.0.0/14, 40.125.0.0/17, 40.96.0.0/12
  • enabled : active la section en étant à true
  • filter : utilise le filtre /etc/fail2ban/filter.d/nginx-limit-req.conf
  • action : va effectuer l'action configurée /etc/fail2ban/action.d/iptables-ipset-proto4.conf soit donc ici bannir l'ip via ipset. Ici on bannit l'IP que sur le port http, https sur le protocole TCP
  • logpath : moniteur le journal d'erreur nginx
  • maxfailures : c'est le seul à dépasser avant que l'action se déclenche, soit donc ici dépasser deux fois le taux
  • findtime : c'est l'intervalle de recherche du nombre d’occurrences (maxretry)
  • bantime : le temps pendant laquelle la règle ipset sera active. Au delà, fail2ban va retirer l'IP. Soit donc ici 600 secondes.
  • maxretry : Nombre de correspondances (c'est-à-dire la valeur du compteur) qui déclenche une action d'interdiction sur l'IP.
  • ignoreip : ignore les IP suivantes. Dans l'exemple, il s'agit des sous-réseaux utilisés par GoogleBot et BingBot
Tous les paramètres ne sont pas obligatoires comme bantime ou findtime. En effet au début de jail.conf, vous avez la section [DEFAULT] où l'on retrouve ces derniers.

En résume, le findtime définit à quel point les journaux en arrière sont vérifiés. Le filtre est vérifié par rapport à l'entrée qui a une date entre maintenant - l'heure de recherche et maintenant.
Si le filtre a trouvé maxretry ou plus de lignes de journal qui correspondent (sans compter celles qui correspondent également à ignoreregex) dans cette période de temps, alors il émet l'action d'interdiction.

Par exemple cette adresse IP Amazon qui a fait des scans tentent ensuite un bruteforce WordPress.
Il a dépassé le seuil car le serveur WEB retourne un HTTP 429 Too Many Requests consignés dans error.log.
Fail2ban le détecte et ban l'IP.

Exemple de détection d'attaque bruteforce et bannissement par fail2ban

Au besoin pour lister les IP bannies dans ipset :

ipset list f2b-blacklist
Lister les IP bannies par fail2ban
Bravo ! vous avez réussi à protéger son serveur des attaques DoS et Bruteforce avec fail2ban.

Fail2ban avec Cloudflare

Fail2ban propose une action Cloudflare afin de blacklister les adresses IP sur le WAF.
Cela fonctionne avec les API et nécessite une petite configuration.
L'article suivant vous guide pour mettre cela en place :

Créer son propre filtre fail2ban

Par défaut, fail2ban fournit beaucoup de filtres qui répondent à al plupart des situations pour sécuriser son serveur.
Mais parfois, on peut avoir besoin d'écrire son propre filtre.
Cet article vous explique le principe et comment aire :

failban2-client

failban2-client vous permet de gérer entièrement fail2ban.
Cela va des prisons aux IP bannies.
Il serait très long de donner tous les commandes.
Voici quelques exemples utiles.

Pour vérifier les status de fail2ban :

fail2ban-client status
Status
|- Number of jail:      3
`- Jail list:   nginx-limit-req, nginx-slow-dos, sshd

Pour lister les adresses IP blacklistés sur une prison :

fail2ban-client status nomPrison
Lister les informations d'une prison avec le nombre d'IP bannie

Enfin il est tout à fait possible de bannir une IP manuellement.
Ainsi, on peut créer une prison sans filtre pour bannir temporairement une IP sur ipset ou cloudflare.

Par exemple cette prison pour bannir une IP pour une journée :

[ban1day]
enabled = true
filter=
action= cloudflare
bantime=86400

et du coup pour bannir l'ip avec fail2-banclient :

fail2ban-client set <prison> banip <adresse IP>
Bannir une IP avec fail2ban-client

Par exemple pour dé-bannir une adresse IP :

fail2ban-client get nomPRison actionunban AdresseIP

Pour débannir toutes les adresses IP :

 failban2-client unban --all

Et bien d'autres commandes sont disponibles. N'hésitez pas à consulter l'aide et le man.

Les logs de fail2ban

Quelques mots concernant les logs.
On a vu que tout était consigné dans /var/log/fail2ban.log.
Il est tout à fait possible de surveiller en temps réel ce qui se passe avec tail ou multitail. Plus d'informations : Comment lire les logs sur Linux en temps réel avec tail, multitail

tail -f /var/log/fail2ban
Lire les logs fail2ban en temps réel

Faire ressortir les sous-réseaux qui ont subit le plus de BAN.

zgrep -h "Ban " /var/log/fail2ban.log* | awk '{print $NF}' | awk -F\. '{print $1"."$2"."}' | sort | uniq -c  | sort -n | tail

Enfin il est tout à fait possible de grapher les prisons fail2ban sur munin :

Grapher fail2ban sur munin pour monitorer les prisons fail2ban

Liens

Vous avez trouvé cet article utile et interressant, n'hésitez pas à le partager...

Trouver la solution sur le forum d'aide

Vous êtes arrivé au terme de l'article Fail2ban : protéger son serveur des attaques DoS et Bruteforce mais vous n'avez pas trouvé la solution à votre problème...
Suivez ces articles du forum pour trouver une réponse ou demandez à votre tour de l'aide sur le forum