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..
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 :
- [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. - enabled = true
Cette ligne active la prison. Si elle est définie surfalse
, la prison ne sera pas utilisée même si elle est configurée. - 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. - 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. - bantime = 72000
Durée (en secondes) pendant laquelle une IP sera bannie. Ici, elle est définie à 72000 secondes, soit 20 heures. - maxretry = 4
Nombre de tentatives autorisées avant qu’une IP ne soit bannie. Ici, après 4 tentatives, l’IP sera bannie. - 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. - logpath = /var/log/haproxy.log
Chemin du fichier journal que Fail2Ban doit surveiller pour cette prison. - 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