Installation et Configuration de Fail2Ban

L’univers de Linux est passionnant, et la sécurité est un chapitre essentiel de cette aventure. Fail2Ban est l’un de ces outils incontournables pour tout administrateur Linux soucieux de protéger ses serveurs. En surveillant les journaux système, il détecte les tentatives d’intrusion sur des services tels que SSH, HAProxy ou Postfix. Et si un intrus se montre trop insistant? Fail2Ban intervient, bloquant l’adresse IP de l’indésirable via IPTables. L’un des atouts majeurs de Fail2Ban est sa flexibilité. Vous pouvez créer et adapter vos propres filtres selon vos besoins. Dans cet article, je vous guiderai à travers l’installation et la configuration de Fail2Ban sur Debian..

Schéma illustrant le fonctionnement de Fail2Ban

Fonctionnement de Fail2ban en 5 étapes :

1. Surveillance : Fail2Ban scrute continuellement les fichiers journaux.

2. Détection : Il repère les activités suspectes en fonction des règles établies.

3. Consultation : Avant d’agir, il vérifie si l’IP fautive est déjà listée dans sa « prison ».

4. Transmission : Si l’IP est jugée malveillante, elle est envoyée à IPTables.

5. Blocage : IPTables prend le relais et bloque l’adresse IP concernée.

On commence par installer les paquets nécessaires

root@CT-F2B:~# apt-get update
root@CT-F2B:~# apt-get install fail2ban iptables iptables-persistent

Puis on configure IPtables pour éviter de bloquer les flux que nous utilisons, dans cette exemple je ne vais pas trop m’attarder sur les règles ni faire quelque chose d’avancé comme un filtrage ssh par l’IP source

On définit les règles par défaut pour les chaînes INPUT, FORWARD et OUTPUT :

root@CT-F2B:~# iptables -P INPUT ACCEPT 

root@CT-F2B:~# iptables -P FORWARD ACCEPT 

root@CT-F2B:~# iptables -P OUTPUT ACCEPT

Ensuite il faut autoriser le trafic sur les ports utilisés.

Pour un serveur Apache ou HAproxy : 22 (SSH), 80 (HTTP) et 443 (HTTPS)

root@CT-F2B:~# iptables -A INPUT -p tcp --dport 22 -j ACCEPT 

root@CT-F2B:~# iptables -A INPUT -p tcp --dport 80 -j ACCEPT 

root@CT-F2B:~# iptables -A INPUT -p tcp --dport 443 -j ACCEPT

Très important, il faut également autoriser le trafic pour les connexions déjà établies ou liées, ça m’a pris pas mal de temps pour comprendre pourquoi mon flux DNS ne revenait pas…

root@CT-F2B:~# iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

Puis enfin on bloque tout autre trafic entrant :

root@CT-F2B:~# iptables -A INPUT -j DROP

Une fois que vous avez configuré IPtables comme souhaité, vous pouvez sauvegarder la configuration actuelle afin qu’elle persiste au redémarrage du serveur

root@CT-F2B:~# iptables-save > /etc/iptables/rules.v4

On liste l’ensemble des règles pour bien contrôler qu’elles ont été prise en compte

 root@CT-F2B:~# iptables -L -n -v

Maintenant on va configurer une règle Fail2Ban, les règles de filtrage sont stockés dans /etc/fail2ban/filter.d/ mais il est également possible d’en créer en fonction de vos besoins.

Nous allons donc créer une règle pour HAproxy afin de se protéger des tentatives <NOSRV>

On créer donc le fichier de configuration haproxy-noserv.conf

root@CT-F2B:~# nano /etc/fail2ban/filter.d/haproxy-noserv.conf

Et on y ajoute notre nouvelle règle :


[Definition]

failregex = ^.*haproxy\[\d+\]: <HOST>:\d+ \[.*\] http_fe http_fe/<NOSRV> .*

ignoreregex =

Maintenant que la règle de filtrage est ajoutée on va définir les conditions et les actions de celle-ci dans ce qu’on appelle la prison (Jail)

On créer un nouveau fichier haproxy.conf

root@CT-F2B:~# nano /etc/fail2ban/jail.d/haproxy.conf

Et on ajoute les paramètres

[haproxy-noserv]
enabled = true
filter = haproxy-noserv
action = iptables-allports sendmail-whois[name=Haproxy-noserv, dest=mail@mondomaine.com]
bantime = 72000
maxretry = 4
findtime = 6000
logpath = /var/log/haproxy.log
ignoreip = 127.0.0.0/8 10.10.10.1/16

Quelques explications :

  1. [haproxy-noserv]
    Ceci définit le nom de la « prison » (jail) dans Fail2Ban. Chaque prison correspond à une configuration spécifique pour surveiller un service ou un log spécifique.
  2. enabled = true
    Cette ligne active la prison. Si elle est définie sur false, la prison ne sera pas utilisée même si elle est configurée.
  3. filter = haproxy-noserv
    Ceci indique le filtre à utiliser pour cette prison. Il s’agit là du filtre que nous avons créé juste avant et qui contient les expressions régulières nécessaires pour analyser les logs et repérer les comportements suspects.
  4. action = iptables-allports
    Cette ligne définit les actions à prendre lorsqu’une IP est bannie. Ici, iptables-allports : bloque le trafic sur tous les ports pour l’IP bannie.
  5. bantime = 72000
    Durée (en secondes) pendant laquelle une IP sera bannie. Ici, elle est définie à 72000 secondes, soit 20 heures.
  6. maxretry = 4
    Nombre de tentatives autorisées avant qu’une IP ne soit bannie. Ici, après 4 tentatives, l’IP sera bannie.
  7. findtime = 6000
    Durée (en secondes) pendant laquelle Fail2Ban compte les tentatives. Dans ce cas, si une IP fait 4 tentatives (ou plus) en moins de 6000 secondes (soit 1 heure 40 minutes), elle sera bannie.
  8. logpath = /var/log/haproxy.log
    Chemin du fichier journal que Fail2Ban doit surveiller pour cette prison.
  9. ignoreip = 127.0.0.0/8 10.10.10.1/16
    Liste des adresses IP ou des plages d’adresses IP qui ne doivent jamais être bannies. Ici, il ignore toutes les IP locales (127.0.0.0/8) et une plage spécifique (10.10.10.1/16).

Il faut maintenant recharger Fail2Ban

root@CT-F2B:~# systemctl restart fail2ban.service

Avec la commande suivante on peut lister les prisons en cours

root@CT-F2B:~# fail2ban-client status

Pour voir avec plus de précisions sur une prison en particulier on va utiliser la même commande mais on ajoute à la fin la règle de filtrage

root@CT-F2B:~# fail2ban-client status haproxy-noserv

On pourra donc apprécier le résultat et confirmer que ça fonctionne !

Status for the jail: haproxy-noserv
|- Filter
|  |- Currently failed: 4
|  |- Total failed:     65
|  `- File list:        /var/log/haproxy.log
`- Actions
   |- Currently banned: 5
   |- Total banned:     8
   `- Banned IP list:   XXX.XXX.XXX.XXX XXX.XXX.XXX.XXX XXX.XXX.XXX.XXX XXX.XXX.XXX.XXX XXX.XXX.XXX.XXX

Vous constaterez que mon filtre a banni 8 adresses dont 5 qui sont toujours en prison et que j’ai anonymisé bien évidement…

0 Commentaires

Ecrire un commentaire

XHTML: Vous pouvez utiliser les balises : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Connexion