Installation et configuration de Fail2Ban

Intro


Fail2Ban est un outil qui permet d'empêcher les tentatives d'accès non autorisés (serveurs accessibles depuis internet de préférence).
Pour cela Fail2ban va scruter les logs. Toute tentative d'accès échouée durant une période de temps définie se verront bannie pour une durée définie.

Nous allons mettre en place fail2ban sous Ubuntu 20.04 / debian (mêmes commandes). puis effectuer une configuration simple, cela suffira pour la plupart des besoins

Nous n'aborderons pas les regex ici

Au préalable, il serait intéressant d'avoir mis en place la gestion d'envoi de mail depuis votre serveur afin de recevoir les blocages effectués par fail2ban

Crée un compte dédié à l'envoi de mail. N'utilisait pas un compte personnel

Tapez sur votre moteur de recherche l'une des lignes suivantes :
envoi mail gmail linux exim4
envoi mail gmail linux

Je recommande exim4, car c'est celui utilisé par défaut dans fail2ban, vous pouvez choisir autre chose que gmail si vous le souhaitez

Si vous ne choisissez pas EXIM4, faites attention. SSMTP n'est plus maintenu à jour. Si vous avez activé la double authentification sur le mail utilisé pour la remontée d'info, faites des recherches. Certains sites expliquent la démarche à suivre dans ce cas.

Mise en place


Commençons par l'installer

apt install fail2ban

Configuration /etc/fail2ban/jail.conf


Maintenant qu'il est installé, allons dans le fichier de configuration principal :

nano /etc/fail2ban/jail.conf

IP Ignioré :


Ignioreip vous permet de ne pas appliquer les règles de bannissement aux IP indiquées sur cette ligne
127.0.0.1/8, indique que toute la plage 127.X.X.X est ignorée, ::1 c'est l'adresse locale en IPV6 (ce sont les adresses locales du serveur)

La séparation entre chaque IP se fait via un espace

Pour les IP statiques
Pensez à ajouter les IP avec lesquelles vous allez vous connecter au serveur

Pour les IP dynamiques
Vous pouvez mettre un nom de domaine
Exemple : je pourrais mettre monpc.assistancenum.fr et actualiser l'ip de mon PC sur ce sous-domaine à chaque fois que l'IP change.
ignoreip = 127.0.0.1/8 ::1

Ce qui deviendrait pour de l'IP statique
ignoreip = 127.0.0.1/8 ::1 1.1.1.1

et pour une IP dynamique
ignoreip = 127.0.0.1/8 ::1 monpc.assistancenum.fr

Faites la recherche suivante :
mise à jour dynamique dns

Condition du bannissement


Bantime indique le temps en seconde pendant lequel l'IP sera bannie, perso j'ai mis 10 jours
Il est possible de mettre des jours, des mois, des années au lieu des secondes (qui est la valeur par défaut) (y = year / d = day / mo = month ou mon / minute = m ou mm) , cela est indiqué dans le man de fail2ban à la section TIME ABBREVIATION FORMAT

bantime = 864000
ou
bantime = 10d

Je vous déconseille de bannir trop longtemps, comme les pirates changent souvent d'IP, vous pourriez bloquer un client potentiel qui aurait récupéré l'IP bloqué

Findtime est en corrélation avec maxretry, Findtime fait sa recherche sur une durée (dans mon cas 60 minutes). Si fail2ban trouve 3 essais (maxretry) dans les 60 minutes (findtime) alors il bannit l'IP

findtime  = 60m
maxretry = 3

Ceci sont les valeurs par défaut pour toutes les Jails, après vous pouvez les modifier pour chaque Jail en ajoutant maxretry dans la règle concernée (on voit cela en dessous)

Envoi de mail


Si vous avez configuré l'envoi de mail, je vous recommande de dé-commenté ces lignes et de les remplir.
Cela servira à vous envoyer des notifications dès qu'une IP sera bannie (dans certains cas, j'explique cela plus loin)

Destmail représente l'adresse de destination
destemail = receiver@assistancenum.fr

Dans sender indiquer l'adresse d'envoi, l'adresse avec lequel vous avez paramétré l'envoi de mail dans Exim4
sender = sender@assistancenum.fr

Le mta est l'outil qui va envoyer le mail par défaut c'est EXIM4 (sendmail), les deux seuls choix que vous pouvez indiquer dans mta sont sendmail et mail
mta = sendmail

Détails des Jails


Les Jails commencent par un mot entre crochets [] .
Chacun de ces blocs (Jail) sont reliés à leurs fichiers (/etc/fail2ban/filter.d/) qui contiennent tous les paramètres de recherche regex à appliquer aux logs. Je n'explique pas comment cela fonctionne dans ce document

Exemple avec apache

[apache-auth]

port     = http,https
logpath  = %(apache_error_log)s
bantime  = 48h 
maxretry = 1

Port : Les protocoles nommés sont récupérés dans /etc/services

Si vous avez modifié le port par défaut d'un protocole, alors effectuez aussi ces modifications dans le fichier services pour qu'il soit pris en compte par fail2ban

Logpath indique le chemin ou chercher les logs, les variables indiquées sont visibles dans les fichiers suivants : /etc/fail2ban/paths_common.conf et /etc/fail2ban/paths_debian.conf

Si Bantime et maxretry sont indiquées, alors les valeurs définies par défaut au niveau global ne seront pas prises en compte (paramétré plus haut)

bantime 48h au lieu de 10j par défaut
maxretry 1 fois au lieu de 3 par défaut

Ce bloc est relié au fichier : /etc/fail2ban/filter.d/apache-auth.conf

Activation des Jails souhaités et configuration /etc/fail2ban/jail.d/defaults-debian.conf


Maintenant que nous avons configuré jail.conf, nous allons activer les services souhaités pour nous protéger des attaques

nano /etc/fail2ban/jail.d/defaults-debian.conf
[sshd]
enabled = true
action = %(action_mw)s

Par défaut seul SSH est protégé

Enabled Définit l'état du service. Actif / Inactif.
Action Indique ce que fail2ban doit faire quand il détecte une attaque.

Pour ajouter des services il suffit de copier les noms de service entre crochets présents dans /etc/fail2ban/jail.conf. J'explique comment faire plus bas

exemple :

dans /etc/fail2ban/jail.conf vous avez [apache-auth]
donc dans le fichier /etc/fail2ban/jail.d/defaults-debian.conf vous ajouter une ligne [apache-auth], puis en dessous vous indiquez les mêmes options que pour [sshd]
Ce qui vous donne

[sshd]
enabled = true
action = %(action_mw)s

[apache-auth]
enabled = true
action = %(action_mw)s

Valeur action

plusieurs possibilités s'offrent à vous
%(action_)s

Ban l'ip
%(action_mw)s

Ban l'ip, envoi un mail avec le WHOIS
%(action_mwl)s

Ban l'IP, envoi un mail avec le WHOIS et les lignes du fichier log concerné

Deux autres actions sont disponibles, mais dans certaines conditions.

Il faut installer le paquet bind-utils pour que fail2ban puisse faire des interrogations reverse DNS via la commande DIG, (équivalent de la commande Nslookup)

Etre concerné parmis une ou plusieurs des propositions suivantes :

  • D'avoir banni l'IP à plusieurs reprises
  • Si vous avez défini la valeur maxretry du service à un niveau élevé, exemple : 20 fois
  • Si le risque d'erreurs humaines est très faible voire impossible pour le service sur lequel l'option est ajoutée, par exemple le scan de port sur un port non utilisé

Ban l'IP et envoi un mail au contact présent dans le WHOIS du reverse
%(action_xarf)s

Explication :
Vous pouvez faire une interrogation DNS pour avoir une IP, mais vous pouvez aussi faire une interrogation d'une IP pour avoir un domaine, c'est ce qu'on appelle un reverse DNS ou PTR
Si vous choisissez cette action, alors fail2ban enverra un mail au contact du domaine qu'il a trouvé en faisant un reverse de l'IP et lui joindra les logs

Fais la même chose qu'au-dessus, mais indique aussi à CloudFlare de ban l'IP
%(action_cf_mwl)s

ATTENTION avec ces deux paramètres, un pirate pourrait très bien avoir un domaine lié a sont IP et donc savoir que vous le bloquez (Cas possible)

Configuration rapide du fichier /etc/fail2ban/jail.d/defaults-debian.conf


Pour transférer des blocs disponibles dans jail.conf vers defaults-debian.conf, il suffit d'entrer les commandes suivantes
Exemple avec apache

Deux façons de faire :

Soit

sudo grep -P '(\[apache.*\])' /etc/fail2ban/jail.conf

Vous pouvez remplacer apache par un autre nom (postfix, etc)

Vous allez avoir tous les blocs [] contenant le mot apache, il vous suffit de tout copier avec votre souris et de coller dans /etc/fail2ban/jail.d/defaults-debian.conf en ne gardant que ce qui vous intéresse

Sinon

sudo grep -P '(\[apache.*\])' /etc/fail2ban/jail.conf >> /etc/fail2ban/jail.d/defaults-debian.conf

Puis d'ajouter au-dessous de chaque bloc les éléments habituels, c'est-à-dire :

enabled = true
action = ACTIONACHOISIR

Vous pouvez aussi ajouter d'autres options, ces options seront prioritaires à celles présents dans le fichier /etc/fail2ban/jail.conf

maxretry = 1
findtime  = 10m
bantime = 10d

Ce qui peut vous donner

[ssh]
enabled = true
action = %(action_mw)s
maxretry = 1
findtime  = 10m
bantime = 10d

Commande fail2ban-client

Débannir une IP


Pour enlever le BAN d'une IP voici la commande à taper :

fail2ban-client set SERVICE unbanip IP

SERVICE et le nom du service qui a banni l'IP

IP et l'IP à débloquer

Pour enlever le BAN d'une IP qui a été banni avec le service SSH ça donnerait cela :

fail2ban-client set ssh unbanip 1.1.1.1

Vérification du statut des jails activé


Vous permet de voir toutes les Jails actives

fail2ban-client status

Affiche l'état d'un service en particulier (remplacer JAIL par l'un des noms affichés avec la commande ci-dessus)

fail2ban-client status JAIL

Exemple : fail2ban-client status apache-auth
Vous permet de voir toutes les stats liées à la Jail (apache-auth dans notre cas)

Cette option va permettre d'avoir le nombre d'essais maximum avant ban de l'ip pour le service postfix. Vous pouvez indiquer un autre service et choisir une autre option pour avoir la valeur définie.

fail2ban-client get postfix maxretry

A savoir

Dans /etc/fail2ban/jail.conf, maxretry et findtime ont des valeurs par défaut. Dans certain cas il est pratique d'appliquer des valeurs différentes dans les Jail. Comme pour l'exemple de [apache-auth]

Vérifier régulièrement les logs de vos services (apache2, nginx, postfix, etc...). Certains malins, jouent avec les valeurs par défaut de fail2ban pour éviter de se faire bannir.

Cela m'est arrivé avec postfix. Du coup j'ai dû revoir les valeurs par défaut pour la Jail postfix, afin de bannir les IP qui passait leur temps à faire du brute force.

Création de module


Il est possible d'ajouter des modules en cherchant sur internet, comme par exemple un module pour les erreurs 404 d'apache

Le type de module 404 peut servir à bannir les personnes qui s'amusent à essayer différentes URL dans le but de trouver une faille ou un accès privilégié

Attention, avant d'ajouter des modules, soyer sûrs de ce que vous faites, dans le cas du module 404, si vous avez des liens brisés, vous risquez de bannir des utilisateurs légitimes

Sources

https://doc.ubuntu-fr.org/fail2ban