Fail2Ban - Bannir automatiquement les intrus
Table des matières
fail2ban est un logiciel qui se charge d'analyser les logs de divers services installés sur la machine, pour bannir automatiquement un hôte via iptables pour une durée déterminée, en cas d'échec après X tentatives.
C'est un élément essentiel pour sécuriser son système, et éviter des intrusions via brute-force.
Pour installer fail2ban, installer le paquet fail2ban.
Pour Fedora, RHEL et dérivées (Nécessite EPEL) :
Pour Debian, Ubuntu et dérivées :
Pour Gentoo :
Ne pas oblier de lancer le service et l'activer au démarrage.
Pour systemd :
systemctl enable --now fail2ban
Pour OpenRC :
Le fichier principal de configuration est /etc/fail2ban/jail.conf.
La section [DEFAULT] indique les prises de décisions par fail2ban si dans chaque service rien n'est défini
Pour ignorer plusieurs IP, on les sépare par un espace. Des adresses ou réseaux peuvent être spécifiés :
La liste des banactions sont dans : /etc/fail2ban/action.d/
Dans les bonnes pratiques, si on veut configurer des services spécifiques, on pourra s'inspirer des exemples présents dans /etc/fail2ban/jail.conf mais on fera des fichiers dans /etc/fail2ban/jail.d
Parfois dans les fichiers de configuration, on rencontrera des variables du style :
Ces variables sont définies suivant la syntaxe : %(nom_de_la_vatiable)s
Les listes des variables sont situées dans les fichiers paths-common.conf et paths-fedora.conf (sur RHEL et dérivées)
Il est préférable d'utiliser ces variables pour plusieurs raisons :
- Les chemins des fichiers journaux peuvent varier selon les distributions Linux. En utilisant des variables, la configuration reste portable entre différents systèmes.
- Fail2ban peut être configuré pour utiliser différents backends (comme systemd, syslog, etc.). Les variables permettent d'adapter automatiquement les chemins des journaux en fonction du backend utilisé.
- Les variables permettent d'abstraire les détails spécifiques du système, rendant la configuration plus lisible et plus facile à comprendre.
Nous allons configurer fail2ban pour bannir les intrus passant par ssh.
On créra donc un fichier /etc/fail2ban/jail.d/ssh.conf par exemple.
Voici un exemple de configuration :
Voici quelques explications :
[sshd] : Ceci définit une "prison" (jail) spécifique pour le service SSH.
enabled = true : Active cette configuration pour SSH.
port = 22 : Spécifie le port SSH à surveiller (22 est le port par défaut).
logpath = %(sshd_log)s : Indique le chemin du fichier journal SSH à analyser. %(sshd_log)s est une variable qui sera remplacée par le chemin réel du fichier journal SSH.
backend = %(sshd_backend)s : Définit le backend à utiliser pour lire les journaux. %(sshd_backend)s est une variable qui sera remplacée par le backend approprié.
maxretry = 4 : Nombre maximal de tentatives échouées avant le bannissement (ici 4).
bantime = 3600 : Durée du bannissement en secondes (ici 1 heure).
findtime = 3600 : Recherche du nombre de connexion dans le laps de temps indiqué (ici 1 heure).
ignoreip = 127.0.0.1 192.168.21.0/24 212.1.2.3 : Liste des adresses IP ou réseaux à ne jamais bannir (127.0.0.1, Réseau 192.168.21.x, IP spécifique
Sur le serveur on peut suivre les actions via :
On tente de se connecter en SSH (dans mon exemple) plus de 2 fois et on vérifie qu'on est bien banni:
Fail2ban est livré avec un client nommé fail2ban-client.
Pour voir les jails actifs, on peut utiliser :
Exemple :
Pour voir le statut d'un jail particulier (exemple avec sshd) :
Pour lister les IP bannies pour une jail particulière (ici sshd) :
Exemple de retours :
Pour débannir un client :
Exemple avec l'IP 212.x.x.x, bannie du jail sshd :
Qu'est ce que fail2ban
fail2ban est un logiciel qui se charge d'analyser les logs de divers services installés sur la machine, pour bannir automatiquement un hôte via iptables pour une durée déterminée, en cas d'échec après X tentatives.
C'est un élément essentiel pour sécuriser son système, et éviter des intrusions via brute-force.
Installer fail2ban
Pour installer fail2ban, installer le paquet fail2ban.
Pour Fedora, RHEL et dérivées (Nécessite EPEL) :
Code BASH :
dnf install fail2ban
Pour Debian, Ubuntu et dérivées :
Code BASH :
apt install fail2ban
Pour Gentoo :
Code BASH :
emerge -av fail2ban
Ne pas oblier de lancer le service et l'activer au démarrage.
Pour systemd :
systemctl enable --now fail2ban
Pour OpenRC :
Code BASH :
rc-update add fail2ban
Configurer les services
Configuation principale
Le fichier principal de configuration est /etc/fail2ban/jail.conf.
La section [DEFAULT] indique les prises de décisions par fail2ban si dans chaque service rien n'est défini
Code :
ignoreip = 127.0.0.1/8 #adresses IP ignorées par les actions de fail2ban
bantime = 10m #temps de bannissement en secondes (ou en minutes avec suffixe m, heures avec h)
findtime = 10m #historique de recherche dans les logs (ou en minutes avec suffixe m, heures avec h)
maxretry = 5 #nombre d'essais au bout du quel fail2ban bannit notre intrus
banaction = iptables # Méthode de BAN (iptables = Que le port concerné / iptables-multiport = Tous les ports / ...)
protocol = tcp # protocole par défaut des jails définies ci-dessous
enabled = false # Statut par défaut des jails définies ci-dessous (par défaut tout désactivé)
Pour ignorer plusieurs IP, on les sépare par un espace. Des adresses ou réseaux peuvent être spécifiés :
Code BASH :
ignoreip = 127.0.0.1 192.168.21.0/24 212.1.2.3
La liste des banactions sont dans : /etc/fail2ban/action.d/
Dans les bonnes pratiques, si on veut configurer des services spécifiques, on pourra s'inspirer des exemples présents dans /etc/fail2ban/jail.conf mais on fera des fichiers dans /etc/fail2ban/jail.d
A propos des vaiables
Parfois dans les fichiers de configuration, on rencontrera des variables du style :
Code :
logpath = %(sshd_log)s
Ces variables sont définies suivant la syntaxe : %(nom_de_la_vatiable)s
Les listes des variables sont situées dans les fichiers paths-common.conf et paths-fedora.conf (sur RHEL et dérivées)
Il est préférable d'utiliser ces variables pour plusieurs raisons :
- Les chemins des fichiers journaux peuvent varier selon les distributions Linux. En utilisant des variables, la configuration reste portable entre différents systèmes.
- Fail2ban peut être configuré pour utiliser différents backends (comme systemd, syslog, etc.). Les variables permettent d'adapter automatiquement les chemins des journaux en fonction du backend utilisé.
- Les variables permettent d'abstraire les détails spécifiques du système, rendant la configuration plus lisible et plus facile à comprendre.
SSH
Nous allons configurer fail2ban pour bannir les intrus passant par ssh.
On créra donc un fichier /etc/fail2ban/jail.d/ssh.conf par exemple.
Voici un exemple de configuration :
Code :
[sshd]
enabled = true
port = 22
logpath = %(sshd_log)s
backend = %(sshd_backend)s
maxretry = 4
bantime = 3600
findtime = 3600
ignoreip = 127.0.0.1 192.168.21.0/24 212.1.2.3
Voici quelques explications :
[sshd] : Ceci définit une "prison" (jail) spécifique pour le service SSH.
enabled = true : Active cette configuration pour SSH.
port = 22 : Spécifie le port SSH à surveiller (22 est le port par défaut).
logpath = %(sshd_log)s : Indique le chemin du fichier journal SSH à analyser. %(sshd_log)s est une variable qui sera remplacée par le chemin réel du fichier journal SSH.
backend = %(sshd_backend)s : Définit le backend à utiliser pour lire les journaux. %(sshd_backend)s est une variable qui sera remplacée par le backend approprié.
maxretry = 4 : Nombre maximal de tentatives échouées avant le bannissement (ici 4).
bantime = 3600 : Durée du bannissement en secondes (ici 1 heure).
findtime = 3600 : Recherche du nombre de connexion dans le laps de temps indiqué (ici 1 heure).
ignoreip = 127.0.0.1 192.168.21.0/24 212.1.2.3 : Liste des adresses IP ou réseaux à ne jamais bannir (127.0.0.1, Réseau 192.168.21.x, IP spécifique
Test de la configuration
Sur le serveur on peut suivre les actions via :
Code BASH :
tail -f /var/log/fail2ban.log
On tente de se connecter en SSH (dans mon exemple) plus de 2 fois et on vérifie qu'on est bien banni:
Code :
2015-04-09 11:33:33,985 fail2ban.jail [22561]: INFO Jail 'sshd' started
2015-04-09 11:33:53,431 fail2ban.filter [22561]: INFO [sshd] Found 212.x.x.x
2015-04-09 11:33:56,636 fail2ban.filter [22561]: INFO [sshd] Found 212.x.x.x
2015-04-09 11:34:22,988 fail2ban.filter [22561]: INFO [sshd] Found 212.x.x.x
2015-04-09 11:34:23,353 fail2ban.actions [22561]: NOTICE [sshd] Ban 212.x.x.x
fail2ban-client : Gérer fail2ban
Présentation du client fail2ban-client
Fail2ban est livré avec un client nommé fail2ban-client.
Pour voir les jails actifs, on peut utiliser :
Code BASH :
fail2ban-client status
Exemple :
Code :
Status
|- Number of jail: 1
`- Jail list: sshd
Informations sur un jail particuluer
Pour voir le statut d'un jail particulier (exemple avec sshd) :
Code BASH :
fail2ban-client status sshd
Code :
Status for the jail: sshd
|- Filter
| |- Currently failed: 1
| |- Total failed: 31
| `- Journal matches: _SYSTEMD_UNIT=sshd.service + _COMM=sshd
`- Actions
|- Currently banned: 1
|- Total banned: 1
`- Banned IP list: 212.x.x.x
Lister les IP bannies
Pour lister les IP bannies pour une jail particulière (ici sshd) :
Code BASH :
fail2ban-client get sshd banned
Exemple de retours :
Code TEXT :
['183.x.x.x', '81.x.x.x', '212.x.x.x']
Débannir une adresse IP
Pour débannir un client :
Code BASH :
fail2ban-client set jail unbanip ip
Exemple avec l'IP 212.x.x.x, bannie du jail sshd :
Code BASH :
fail2ban-client set sshd unbanip 212.x.x.x