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 dans jail.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...).