Fail2Ban

Fail2ban est in IPS (Intrusion Prevention Software) qui analyse les fichiers log du système pour détecter des tentatives d’accès par brute force ou dictionnaire et bannir les adresses IP ayant obtenu un trop grand nombre d’échecs. Il met à jour les règles du pare-feu Iptables pour rejeter ces adresses IP et stopper les attaques pendant un temps définis. Les règles de bannissement sont paramétrables comme par exemple la durée du bannissement ou le nombre de tentatives échouées.

Installation

L’installation peut simplement se faire via la commande apt install :

# apt install fail2ban

Dès son installation Fail2Ban est déjà actif et permet une protection contre de nombreuses attaques telle que le bruteforcing du port SSH.
Vous pouvez vérifier si Fail2Ban est bien lancé :

# systemctl status fail2ban.service 
● fail2ban.service - Fail2Ban Service
Loaded: loaded (/lib/systemd/system/fail2ban.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2018-12-14 19:28:52 UTC; 1 day 17h ago

Le répertoire contenant les logs de Fail2ban se trouve dans /var/log/fail2ban/fail2ban.log et les fichiers de configuration dans /etc/fail2ban/.

Configuration

Fail2ban contient des fichiers de configuration généraux, de préférence à ne pas toucher pour ne pas que la configuration personnalisée soit effacée lors d’une mise à jour ou lors d’une réinstallation, et des fichiers de configuration prévus pour être personnalisés par l’utilisateur.

Les fichiers de configuration

Dans /etc/fail2ban/ se trouvent tous les fichiers de configuration de Fail2ban. Fail2ban utilise 2 types de fichiers de configuration. Les fichiers de configuration de base et les fichiers de configuration personnalisés par l’utilisateur·trice.
Les configurations personnelles de fail2ban doivent de préférence toutes se faire dans un fichier *.local, cette sécurité permet de garder la configuration personnalisée en cas de mise à jour et d’éviter un risque d’écrasement. Dans ces fichiers il faut uniquement spécifier les modifications, le reste de la configuration sera effectuée par les fichiers *.conf qui seront lu en premier.

# ls -l /etc/fail2ban/
total 80
drwxr-xr-x 2 root root 4096 déc. 14 19:56 action.d
-rw-r--r-- 1 root root 2328 déc. 14 19:35 fail2ban.conf
drwxr-xr-x 2 root root 4096 avril 17 2017 fail2ban.d
drwxr-xr-x 3 root root 4096 déc. 14 19:51 filter.d
-rw-r--r-- 1 root root 21284 déc. 9 2016 jail.conf
drwxr-xr-x 2 root root 4096 déc. 16 13:27 jail.d
-rw-r--r-- 1 root root 21284 déc. 14 19:36 jail.local
-rw-r--r-- 1 root root 2375 déc. 9 2016 paths-common.conf
-rw-r--r-- 1 root root 642 déc. 9 2016 paths-debian.conf
-rw-r--r-- 1 root root 975 déc. 9 2016 paths-opensuse.conf

Fichiers de configuration de Fail2ban

La configuration par défaut de Fail2ban (ces fichiers ne sont pas à modifier) :

fail2ban.conf Configuration générale
action.d/*.conf Actions à effectuer en cas d’attaque
filter.d/*.conf Filtres permettant de détecter une attaque dans les logs
**jail.conf ** Configuration des prisons
paths-common.conf Contient les chemins vers différents fichiers logs variables
paths-debian.conf Contient les chemins vers différents fichiers logs
paths-opensuse.conf Contient les chemins vers différents fichiers logs

Fichiers pour personnaliser fail2ban

Les fichiers à utiliser pour configurer son Fail2ban, en cas de réinstallation ou de mise à jour ses fichiers devraient être conservés. Je vous recommande tout de même d’en faire une sauvegarde.

fail2ban.local Configuration générale, copie de fail2ban.conf - Fichier à créer
jail.local Copie manuelle de jail.conf, configuration générale des prisons
fail2ban.d/*.local Contient la configuration générale personnalisée / modifiée
action.d/*.local Actions à effectuer en cas d’attaque
filter.d/*.local Filtres permettant de détecter une attaque dans les logs
jail.d/*.local Contient les prisons personnalisées / modifiées

Configuration générale

On effectue une copie de fail2ban.conf dans fail2ban.d/fail2ban.local afin de pouvoir, si besoin, personaliser ce fichier.

# cp fail2ban.d/fail2ban fail2ban.d/fail2ban.local

Contenu du fichier fail2ban.d/fail2ban.local, il contient les options par défaut qui seront appliquées si vous ne les spécifiez pas dans vos prisons.

# ===============================================================
# == Configuration personnalisée de Fail2Ban
# == --------------------------------------
# == fichier principal : /etc/fail2ban/fail2ban.d/fail2ban.local
# == fichier original : /etc/fail2ban/fail2ban.conf
# ===============================================================

[Definition]

# Option: loglevel - Default: ERROR
# Values: [ CRITICAL | ERROR | WARNING | NOTICE | INFO | DEBUG ] Default: ERROR
loglevel = INFO

# Option: logtarget - Default: STDERR
# Values: [ STDOUT | STDERR | SYSLOG | FILE ]
logtarget = /var/log/fail2ban.log

# Option: syslogsocket - Default: auto
# Values: [ auto | FILE ]
syslogsocket = auto

# Option: socket - Default: /var/run/fail2ban/fail2ban.sock
# Values: [ FILE ]
socket = /var/run/fail2ban/fail2ban.sock

# Option: pidfile - Default: /var/run/fail2ban/fail2ban.pid
# Values: [ FILE ]
pidfile = /var/run/fail2ban/fail2ban.pid

# Options: dbfile - Default: /var/lib/fail2ban/fail2ban.sqlite3
# Values: [ None :memory: FILE ]
dbfile = /var/lib/fail2ban/fail2ban.sqlite3

# Options: dbpurgeage - Default: 86400 (24hours)
# Values: [ SECONDS ]
dbpurgeage = 86400

Configuration des prisons

Le fichier de configuration /etc/fail2ban/jail.local contient la configuration générale pour les prisons. Il est par la suite possible de créer des fichiers séparés dans /etc/fail2ban/jail.d/*.local pour configurer chaque prison ou de tout simplement les configurer dans ce même fichier.

Contenu du fichier /etc/fail2ban/jail.local qui contient la configuration générale des prisons. Cette configuration de base sera appliquée si rien n’est précisée dans la prison à configurer.

# ===============================================================
# == Configuration personnalisée de Fail2Ban
# == --------------------------------------
# == fichier principal : /etc/fail2ban/jail.local
# == fichier original : /etc/fail2ban/jail.conf
# ===============================================================

[INCLUDES]

# Contient les chemins vers différents fichiers logs
before = paths-debian.conf


[DEFAULT]
# == ------------------------------------------------------------
# Paramètres par défaut pour les prisons si rien n'est défini
# == -----------------------------------------------------------

# Ne pas bannir les @ip suivantes
ignoreip = 127.0.0.1/8 142.42.42.4 242.142.42.2

# Temps de banissement
bantime = 600

# Intervalle de temps où le maxretry sera comptabilisé
findtime = 600

# Nombres maximum de tentatives échouées pendant le findtime
maxretry = 5

# Détecter les changement dans les chemins des logs
backend = auto

# Si les prisons doivent approuver les noms d'hôtes dans les journaux
usedns = warn

# Type d'encodage des logs
logencoding = auto

# Par défaut les prisons configurées ne sont pas activées
enabled = false

# Nom des filtres, ils ont le même nom que la prison
filter = %(__name__)s

# Default protocol
protocol = tcp

# Chain d'iptables-* où ajouter les actions
chain = INPUT

# Ports pouvant être bannis
port = 0:65535

# Format of user-agent https://tools.ietf.org/html/rfc7231#section-5.5.3
fail2ban_agent = Fail2Ban/%(fail2ban_version)s

# Adresse email pour envoyer des notifications de banissement
destemail = [email protected]

# Adresse email de l'émeteur
sender = fail2ban@debian

# Le MTA utilisé
mta = sendmail

# Default banning action
banaction = iptables-multiport
banaction_allports = iptables-allports

# Ban & envoie un mail + whois + log lines (contenu du mail envoyé en cas de bannissement)
action_mwl = %(banaction)s[name=%(__name__)s, bantime="%(bantime)s", port="%(port)s", protocol="%(protocol)s", chain="%(chain)s"] %(mta)s-whois-lines[name=%(__name__)s, sender="%(sender)s", dest="%(destemail)s", logpath=%(logpath)s, chain="%(chain)s"]
action = %(action_mwl)s

Les prisons peuvent être configurées à la suite de ce fichier ou séparément dans /etc/fail2ban/jail.d/*.local.

Créer de nouvelles prisons

Pour créer une nouvelle prison il faut 3 fichiers (parfois ils existent déjà dans Fail2ban) :

  • Le fichier qui défini la prison :
    • /etc/fail2ban/jail.d/MaPrison.local
  • Le fichier qui qui permettra de détecter une attaque dans les logs :
    • /etc/fail2ban/filter.d/MaPrisonFiltre.local
    • /etc/fail2ban/filter.d/MaPrisonFiltre.conf (si vous utiliser un filtre qui existe déjà)
  • Le fichier qui indiquera la marche à suivre si une attaque est détectée :
    • /etc/fail2ban/action.d/ActionMaPrison.local
    • /etc/fail2ban/filter.d/ActionMaPrison.conf (si vous utiliser une action qui existe déjà)

Par défaut une prison possède les options et les valeurs suivantes :

# --------------------------------------
# JAILS
# --------------------------------------

[Nom-de-la-prison]
enable = false # Par défaut la prison n'est pas activée
ignoreip = 127.0.0.1/8 4.4.2.2 # Adresses ip ignorées par le bannissement
bantime = 600 # Temps de bannissement par défaut : 10min
findtime = 600 # Intervalle de temps où les échecs sont comptabilisés soit 10min
maxretry = 5 # Nombre de tentatives erronées maximales
backend = auto # Détecter les changements dans les chemins des logs, valeur par défault dans /etc/fail2ban/path-common.conf
logencoding = auto # Type d'encodage des logs
filter = %(__name__)s # Le filtra aura le même nom que la prison, sinon mettre le chemin exact
port = 0:65535 # Ports pouvant être bannis, à préciser pour une prison en partuciler
banaction = iptables-multiport # Par défaut utilisera le fichier iptables-multiport en cas de ban
banaction_allports = iptables-allports # Par défaut utilisera le fichier iptables-allports
action = %(action_mwl)s # Ban & envoie un mail + whois + log lines
usedns = warn # Approuver les noms d'hôtes dans les journaux
logpath = < valeur > # Chemin vers les logs à surveiller ou variable déjà prédéfinie
failregex = < valeur > # Ajouter une regex complémentaire sans en créer une autre
ignoreregex = < valeur > # Ignore une regex

Si certaines options ci-dessus ne sont pas définies dans la prison alors ce sera les paramètres définis par défaut dans les fichiers jail.conf, jail.local, fail2ban.conf ou fail2ban.local dans qui seront pris en compte.

SSHD : une prison pour ssh

Dans le répertoire /etc/fail2ban/jail.d on créer un nouveau fichier appelée sshd.local et on y écrit le contenu suivant :

[sshd]

enabled = true
port = ssh
maxretry = 3
bantime = 600
logpath = %(sshd_log)s
backend = %(sshd_backend)s

Les valeurs de sshd_log et sshd_backend sont déjà définies dans /etc/fail2ban/path-common.conf et /etc/fail2ban/path-debian.conf et valent respectivement :

  • sshd_log = %(syslog_authpriv)s = syslog_authpriv = /var/log/auth.log
  • backend = %(sshd_backend)s = %(default_backend)s = default_backend = auto

Et de façon implicite (car défini par défaut dans jail.local)

  • banaction = iptables-multiport
  • banaction_allports = iptables-allports

SSHD-DDOS : une prison pour ssh contre le DDOS

Cette prison peut sembler similaire à [sshd] mais la valeur de la variable filter = %(__name__)s définie par défaut dans jail.local diffère, en d’autres termes le filtre utilisé est différent en fonction du nom de la prison.


enabled = true
port = ssh
maxretry = 3
bantime = 3600
logpath = %(sshd_log)s
backend = %(sshd_backend)s

PAM : Prison pour la connexion des users

Cette prison permet de bloquer des tentatives de connexions directement sur le serveur (et non pas à distance via ssh). Elle bloque également les tentatives erronées losqu’un utilisateur déjà loggé tente d’utiliser un autre compte.

[pam-generic]

enabled = true
banaction = %(banaction_allports)s
logpath = %(syslog_authpriv)s
backend = %(syslog_backend)s

Prisons particulières : IP récidivistes

Le but est de créer une interdiction plus étendue pour les IP récidivistes

Pré-configuration

Dans un premier temps il ne faut pas que le niveau de loglevel spécifié dans fail2ban.d/fail2ban.conf.local ne soit pas à DEBUG (sinon fail2ban tomberait dans une boucle infinie en interpretant constamment des lignes inutiles). Il faut ensuite augmentez la valeur de dbpurgeage à 648000 (7,5 jours) pour conserver les entrées de connexions échouées pendant une durée suffisament longue pour pouvoir bannir les IP pour 1 semaine par exemple.

Variables à modifier dans fail2ban.d/fail2ban.conf.local

[Definition]

loglevel = INFO
dbpurgeage = 648000

Création de la prison pour IP récidivistes

Ici Fail2ban va examiner son propre fichier logs et bannira pendant 1 semaine une adresse IP qui, sur une durée de 24h, s’est déjà retrouvée 5 fois (valeur par défaut du maxretry dans jail.local) dans une prison.

[recidive]

enabled = true
bantime = 604800 ; 1 week
findtime = 86400 ; 1 day
logpath = /var/log/fail2ban.log
banaction = %(banaction_allports)s

Activer les nouvelles prisons

Pour recharger les fichiers de configuration, afin que les nouvelles prisons soient prises en compte, il suffit de recharger Fail2ban.

# fail2ban-client reload

Pour recharger le fichier de configuration d’une prison déjà existante :

# fail2ban-client reload <NomDeLaPrison>

Débannissement

Si vous avez besoin de débannir une adresse IP en particulier vous pouvez aller regarder les statut des prisons :

# fail2ban-client status <Nom de la Prison> 

En regardant le statut de la prison concernée, par exemple avec celle nommée sshd on peut voir les filtres et les actions mises en place par Fail2ban. Dans cet exemple il y a eu 717 tentatives, toutes loggées dans /var/log/auth.log et une adresse IP actuellement bannie sur un total de 237.

# fail2ban-client status sshd 
Status for the jail: sshd
|- Filter
| |- Currently failed: 1
| |- Total failed: 717
| `- File list: /var/log/auth.log
`- Actions
|- Currently banned: 1
|- Total banned: 237
`- Banned IP list: 142.124.242.224

On peut également, à titre informatif, voir ce bannissement directement dans iptables. Il n’est pas conseillé de modifier directement les règles d’IPtables mais plutôt d’utiliser la commande de Fail2ban approprié pour réautoriser une adresse IP.

# iptables -L
Chain f2b-sshd (1 references)
target prot opt source destination
REJECT all -- 142.124.242.224 anywhere reject-with icmp-port-unreachable
RETURN all -- anywhere anywhere

Pour réautoriser une ip bannie par Fail2ban :

# fail2ban-client set <Nom-Prison> unbanip @AdresseIP

Bonnes pratiques

Le réflexe à avoir est de créer une nouvelle prison à chaque services nouvellement installés. Il en existe de nombreuses prédéfinies de bases dans jail.local, comme celles pour gérer un serveur Apache, Bind9 ou NGINX par exemple.

Fail2ban ET Docker

https://mondedie.fr/d/9250-faire-fonctionner-fail2ban-avec-limage-docker-wonderfall-boring-nginx
https://mondedie.fr/d/9327-docker-fail2ban-sur-lhost-avec-nginx-dockerise/3

Documentation

FAQ Fail2ban : http://www.fail2ban.org/wiki/index.php/FAQ_french
Fail2ban inutile ? https://kabs.homeunix.org/blog/brute-force

> Partager <