Fail2ban

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
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