Fail2ban
| Fiche express | |
|---|---|
| Domaine | Protection des services exposés |
| Principe | Bannissement d'IP sur échecs répétés |
| Contexte | Linux, analyse de journaux + iptables/firewalld |
| Voir aussi | Port knocking · Iptables |
Fail2ban surveille les journaux des services exposés (SSH, web, messagerie…) et bannit temporairement, au niveau du pare-feu, les adresses IP à l'origine d'un trop grand nombre de tentatives de connexion infructueuses. Il constitue une défense simple et efficace contre les attaques par force brute et les scans répétés.
apt-get install fail2ban
Notions
Une prison (jail) associe un service à surveiller, un filtre (expression régulière appliquée au journal) et une action (bannissement). Les prisons se déclarent dans /etc/fail2ban/jail.local (copie personnalisée de jail.conf, qui n'est pas écrasée aux mises à jour).
Client en ligne de commande
# État général et détail d'une prison
fail2ban-client status
fail2ban-client status sshd
# Débannir une adresse
fail2ban-client set sshd unbanip 203.0.113.10
# Recharger la configuration
fail2ban-client reload
Liste blanche
Les adresses de confiance ne doivent jamais être bannies. Dans /etc/fail2ban/jail.local :
[DEFAULT]
ignoreip = 127.0.0.1/8 ::1 203.0.113.0/24
Prison SSH
Dans /etc/fail2ban/jail.local :
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 5
bantime = 86400
En cas de port SSH non standard :
port = ssh,sftp,2222
On peut arrêter la surveillance d'un seul service :
fail2ban-client stop sshd
Prison web (anti-DoS HTTP)
Déclaration de la prison :
[http-get-dos]
enabled = true
port = http,https
filter = http-get-dos
logpath = /var/log/nginx/access.log
maxretry = 360
findtime = 120
bantime = 600
action = iptables[name=HTTP, port=http, protocol=tcp]
Filtre associé /etc/fail2ban/filter.d/http-get-dos.conf :
[Definition]
# Attention : ce motif capture toutes les requêtes GET (valides ou non).
# Régler maxretry et findtime avec soin pour éviter les faux positifs.
failregex = ^<HOST>.*"GET
ignoreregex =
Prison WordPress
Filtre /etc/fail2ban/filter.d/wordpress-auth.conf :
[Definition]
failregex = <HOST>.*POST.*(wp-login\.php|xmlrpc\.php).* 403
Prison correspondante :
[wordpress]
enabled = true
port = http,https
filter = wordpress-auth
logpath = /var/log/nginx/access.log
maxretry = 3
bantime = 3600
Famille Red Hat / CentOS
yum install -y epel-release
yum install -y fail2ban fail2ban-systemd
Prison SSH dans /etc/fail2ban/jail.d/sshd.local (le journal est ici /var/log/secure) :
[sshd]
enabled = true
port = ssh
logpath = %(sshd_log)s
maxretry = 5
bantime = 86400
Activation et vérification :
systemctl enable --now fail2ban
fail2ban-client status sshd
journalctl -lfu fail2ban
Prison Proxmox
Prison dans /etc/fail2ban/jail.local :
[proxmox]
enabled = true
port = https,http,8006
filter = proxmox
logpath = /var/log/daemon.log
maxretry = 3
bantime = 3600
Filtre /etc/fail2ban/filter.d/proxmox.conf :
[Definition]
failregex = pvedaemon\[.*authentication failure; rhost=<HOST> user=.* msg=.*
ignoreregex =
Tester un filtre contre un journal réel :
fail2ban-regex /var/log/daemon.log /etc/fail2ban/filter.d/proxmox.conf
Voir aussi
- Port knocking — masquer un service plutôt que réagir aux échecs
- Iptables — pare-feu utilisé pour appliquer les bannissements