Fail2ban
Par ce salop de FanfanlaTulipe
Fail2ban est un service de parsing de journaux et de défense contre des signes d'attaques prédéterminés. Il s'agit d'une protection efficace pour des services exposés tels que SSH ou NGINX contre les attaques par force brute par exemple.
Dans le cas de SSH, sshguard est un autre service de défense intéressant. Il est cependant déconseillé de le mélanger avec fail2ban.
Installation
Nous verrons la suite de ce guide sur un Debian 11 (bien qu'il ne s'agisse pas de la meilleure distribution du monde, mais il fonctionne pour toutes les distributions Linux.
apt install fail2ban -y
Fail2ban s'appuie sur iptables (par défaut), assurez-vous qu'il soit installé.
Configuration
Nous arrivons sur la partie utile de ce guide, la configuration de fail2ban. Tous les fichiers/dossiers mentionnés ci-dessous sont dans /etc/fail2ban/
.
Il existe 4 types de configurations :
- La configuration générale du service, dans
jail.conf
. - La déclaration des jails, dans
jail.conf
et dansjail.d/
. - La définition des filtres dans
filter.d/
. - La définition des actions dans
action.d/
.
Configuration générale
Tout d'abord, il est conseillé de toujours garder jail.conf
d'origine et de créer jail.local
pour faire des modifications :
cp jail.conf jail.local
ignoreip = 127.0.0.1/8 ::1 # Défini les IPs à ne pas bannir
bantime = 1m # Temps de bannissement
findtime = 15m # Défini l'intervalle de temps pendant lequel un
# utilisateur peut être banni s'il dépasse le nombre
# maximum d'essai
maxretry = 3 # Défini le nombre maximal d'essai
La plupart des configurations suivantes sont des configurations par défaut des jails.
Par défaut, les jails sont désactivés.
Jail
Une jail est une combinaison d'un filtre et d'une ou plusieurs actions. On peut les ajouter dans jail.local
ou créer un fichier dans jail.d/
. On a ici jail.d/bad_method.conf
:
[nginx-bad_method] # On définit la jail 'nginx-bad_method'
enabled = true # On active la jail
port = http,https # Elle est active sur les ports 80 et 443
filter = bad_method # Nous utiliserons le filtre bad_method.conf
logpath = /var/log/nginx/access.log # Sur le fichier '/var/log/nginx/access.log'
maxretry = 1 # Redéfinit le nombre max d'essais
Filtre
Un filtre est un fichier qui définit les journaux qui correspondent à des signes d'attaques grâce à des regex. On trouve ces fichiers dans filter.d/
, ici filter.d/bad_method.conf
:
[Definition]
failregex = ^<HOST> - .*(POST|PUT|HEAD|CONNECT|DELETE|OPTIONS|PATCH)
ignoreregex =
Dans ce filtre, nous signalons toutes les requetes qui n'utilisent pas la méthode GET.
<HOST>
permet de déterminer où se trouve l'IP à signaler/bannir. Par exemple, pour le journal suivant :
1.2.3.4 - - [20/Oct/2021:16:50:03 +0200] "POST /malware.php HTTP/1.1" 405 ...
<HOST>
sera 1.2.3.4 et vu que la méthode utilisée est POST
, l'utilisateur est signalé. De plus, nous avons défini que maxretry
serait à 1. L'utilisateur est donc banni 1 minute.
Vérification du fonctionnement
Fail2ban embarque un programme, fail2ban-client
, qui permet par exemple de regarder l'état des jails.
fail2ban-client status nginx-bad_method
Status for the jail: nginx-bad_method
|- Filter
| |- Currently failed: 3
| |- Total failed: 37
| `- File list: /var/log/nginx/access.log
`- Actions
|- Currently banned: 2
|- Total banned: 8
`- Banned IP list: 47.242.195.12 8.210.90.76
Il permet de gérer fail2ban dans la globalité (redémarrage, débannissment, etc...).