Fail2ban lit les fichiers de log et bannit les adresses IP qui ont obtenu un trop grand nombre d’échecs lors de l’authentification. Il peut mettre à jour les règles du pare-feu pour rejeter cette adresse IP. Fail2ban peut lire plusieurs fichiers de log comme ceux de sshd ou du serveur Apache entre autre.
Installation de Fail2Ban.
On peut créer des prisons par services (ssh, http, …), on renseigne quelques informations (fichier de log, filtre à appliquer, …) et lorsque le filtre trouve une concordance, une action est réalisée (bannissement, mail, whois, …).
Pour installer le logiciel il suffit d’utiliser la commande suivante :
#sudo apt-get install fail2ban
Le répertoire Fail2ban contient les fichiers et répertoires suivants :
- action.d : contient les actions à mettre en oeuvre à un tentative d’intrusion
- filter.d : contient les expressions régulières permettant de parser les logs d’un service donné
- jail.conf : Contient les paramètres de chacun des services surveillés (bantime, maxretry, mail etc…). Ce fichier n’est plus à modifier directement. Nous activerons les jails dans ce fichier /etc/fail2ban/jail.d/defaults-debian.conf.
- fail2ban.conf : Le fichier de configuration global qui se trouve dans/etc/fail2ban/fail2ban.conf ne contient pas grand chose à modifier. Vous pourrez paramétrer l’endroit où Fail2Ban doit enregistrer ses logs, la verbosité de ces derniers et modifier quelques réglages réglages du socket Unix. En ce qui me concerne, je ne touche à rien.
Surveiller les connexions SSH.
Pour surveiller les connexions SSH, nous allons éditer le fichier /etc/fail2ban/jail.d/defaults-debian.conf pour activer les prisons. Que se soit pour SSH, Apache ou d’autres logiciels toutes les activations des jails se font dans ce fichier.
Comme c’est la première fois que vous éditer le fichier, nous allons paramétrer les options communes à toutes les prisons.
- destemail saisissez ici l’adresse email qui recevra les alertes
- sender permet d’afficher le nom de la personne qui envoie le mail
- igonoreip permet d’autoriser des adresses spécifique, il est important à configurer pour éviter de se faire bannir de son propre serveur. Vous pouvez rajouter d’autres ip en laissant un espace entre.
Maintenant pour activer les protections sur le SSH, voici comment les déclarer.
Pensez bien à parcourir les filtres prédéfinis dans le répertoire filter.d afin de voir ce qui existe par défaut et activez ou non des jails selon vos besoins.
Je viens d’activer les jails sshd et sshd-ddos, mails il est possible d’ajouter et de personnaliser d’autres options pour les jails. SI vous ne mettez rien, c’est les paramètres par défaut du fichier jail.conf qui s’applique.
- maxretry nombre d’essais autorisés pour une connexion avant d’être banni
- findtime permet de spécifier le laps de temps pendant lequel on considère les occurrences (au delà de findtime, on repart à zéro)
- bantime définit le temps que l’ip restera bloquée via Fail2Ban
- port permet de préciser les ports à bloquer
- logpath indique le fichier de log à analyser
Maintenant que vous avez paramétrer votre première prison pour le SSH, vous devez redémarrer le service.
# service fail2ban restart
Puis on s’assure que toutes les prisons soient bien en service :
# fail2ban-client status
Test de la configuration.
Il est important avant d’enregistrer la configuration, de vérifier que tout est fonctionnel. L’idéal étant de tester sur le fichier auth.log (du moins pour le SSH) en ayant des entrées avec des intrus par exemple.
Cette commande va vous être utile si vous créer vos propres jail. Vous pourrez tester vos regex pour savoir si elles trouvent bien les éléments recherchés.
Pour cela vous devez utiliser la commande suivante :
fail2ban-regex <chemin_de_log> <chemin_du_filter> <argument_affichage> fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf
Les commandes de base de l’utilitaire fail2ban-client.
Voici une liste de commandes de bases que vous allez sûrement utiliser avec Fail2ban. Si la plupart d’entre elles se passent d’explications, attardons nous sur :
- start : Lance le serveur et les jails.
- reload : Recharge la configuration.
- reload <JAIL> : Recharge la configuration d’une jail uniquement.
- stop : Arrête le serveur.
- status : Retourne le statut du serveur : nombre de jails, filtres, nombres de fails…
- ping : Permet simplement de s’assurer que le serveur répond.
- -h : Retourne l’ensemble des commandes possibles et qui ne sont pas listées ici.
Fail2Ban possède une base de données interne en SQLite. Cette base permet de stocker les informations entre les redémarrages, notamment les ips à bloquer et de recréer les règles iptables au démarrage.
- set dbfile : Définir la localisation de la base de données.
- set dbpurgeage : Définit la durée de rétention des informations dans la base de données.
- get dbfile : Retourne le chemin de la base de données.
- get dbpurgeage : Récupère le nombre de secondes de rétentions des informations en base de données de la configuration actuelle.
Surveiller en direct le bannissement des IP.
Grâce à la commande ci-dessous, vous allez pouvoir suivre les IP qui scannent votre serveur sur Internet (et je dois dire que c’est assez impressionnant).
# tail -f /var/log/fail2ban.log
Créer un rapport journalier des IP bannies.
Fail2ban permet d’envoyer un mail lorsqu’une IP est bannie. Au bout de quelques jours et lorsque votre boite aux lettres sera saturée par 3000 mails vous n’utiliserez plus cette fonctionnalité pourtant bien pratique pour savoir ce qui se passe sur votre serveur.
Dans ce tutoriel nous allons mettre en place un rapport quotidien avec toutes les IP qui ont essayé d’attaquer votre serveur. 1 seul mail qui va recenser toutes les attaques de la journée. pas mal non !
La première étape consiste à créer un fichier mail-daily.conf dans /etc/fail2ban/action.d/ avec le code suivant :
# Fail2Ban configuration file # # Author: Guillaume REYNAUD # Version: 1.0 (04/12/2019) # Web: https://quick-tutoriel.com # Source: https://kdecherf.com/ # [Definition] actionstart = echo -en "***** Fail2Ban *****\n\nNotification Type: RECOVERY\n\nService: <name>\nHost: <server>\nAddress: <serverip>\nState: STARTED\n\nDate/Time: `date`\n\nAdditional Info:\n\n" | mail -a "From: <from>" -s "** RECOVERY alert - <server>/<name> jail is STARTED **" <dest> actionstop = echo -en "***** Fail2Ban *****\n\nNotification Type: ALERT\n\nService: <name>\nHost: <server>\nAddress: <serverip>\nState: STOPPED\n\nDate/Time: `date`\n\nAdditional Info:\n\n" | mail -a "From: <dest>" -s "** ALERT alert - <server>/<name> jail is STOPPED **" <dest> actioncheck = actionban = echo `date | awk -F ' ' '{print $4}'`" - <ip> (<failures> attempts against <name>)" >> <tmpfile> actionunban = [Init] tmpfile = /temp/fail2ban-mail.txt # default dest dest = root
Concrètement à chaque fois que le service Fail2ban s’arrêtera et/ou redémarrera vous recevrez un mail (actionstart et actionstop).
Ensuite lorsqu’une IP sera bannie au lieu de vous envoyer un mail à chaque fois, l’IP sera enregistrée dans un fichier temporaire appelé fail2ban-mail.txt se trouvant dans le répertoire /temp/ de votre serveur (tmpfile) avec quelques infos : IP, service attaqué et tentatives.
La deuxième étape consiste à activer les mails dans les jails (=prisons) que l’on souhaite. Maintenant Il faut aller dans le répertoire /etc/fail2ban/jail.d, puis éditer le fichier defaults-debian.conf.
# cp defaults-debian.conf defaults-debian.conf.20191204
- 1 : Afin que le script s’exécute correctement vous devez paramétrer 4 variables qui sont fromt (Nom de l’expéditeur), servert (Nom du serveur concerné par l’attaque), serveript (adresse ip publique du serveur) et emailt (adresse mail de destination).
- 2: Dans chaque jail, vous devez rajouter une ligne action en précisant bien quelle action vous choississez, ici c’est mail-daily, le fichier que nous avons créé précédemment. Pour l’instant je n’active les mails que pour le SSH.
# action = mail-daily[name=SSH, dest=%(emailt)s, from=%(fromt)s, server=%(servert)s, serverip=%(serveript)s]
La troisième étape consiste à créer un script bash qui va générer le rapport. Eh oui le rapport n’est pas réalisé par Fail2ban mais par un script.
Vous devez créer votre script dans /etc/fail2ban/action.d/. Le script porte le nom report-mail-daily.sh.
#!/bin/sh SERVER="Server_Name" IP="Server_IP" FROM="Fail2ban " TO="Mail" TMP=/temp/fail2ban-mail.txt if [ -f $TMP ]; then echo "***** Fail2Ban *****\n\nNotification Type: INFO\n\nService: *\nHost: $SERVER\nAddress: $IP\nState: OK\n\nDate/Time send of report : `date +"%d-%m-%Y %H:%M:%S"`\n\nAdditional Info:\n\nThese hosts have been banned on `date --date '1 days ago' +"%a %d %b"`\n`cat $TMP`" | mail -a "From: $FROM" -s "** INFO alert - $SERVER ($IP) jail REPORT **" $TO rm $TMP fi
- 1: Pour que le script fonctionne vous devez paramétrer 4 variables qui sont FROM (Nom de l’expéditeur), SERVER (Nom du serveur concerné par l’attaque), IP (adresse ip publique du serveur) et TO (adresse mail de destination).
- 2: Indiquer le chemin ou se trouve le fichier .txt contenant les IP bloquées du jour.
- 3: Si aucun fichier n’est présent, aucun mail n’est envoyé. Il faut savoir que lorsque le mail est envoyé le fichier .txt est supprimé.
La dernière étape consiste à créer une tâche planifiée pour envoyer le rapport 1 fois par jour.
Création d’une tâche CRON pour envoyer le rapport journalier.
- Si vous souhaitez voir les tâches CRON en cours sur votre système vous pouvez utiliser cette commande :
# crontab -l
- Si vous souhaitez éditer ou ajouter une tâche CRON :
# crontab -e
Dans le fichier CRON, j’ai rajouté une ligne qui permet d’envoyer tous les jours à 6 heures du matin le rapport journalier des attaques sur mon serveur VPS, avec la tâche CROM suivante (1) :
# 0 6 * * * /etc/fail2ban/action.d/report-mail-daily.sh > /dev/null
Pour prendre en compte toutes ces modifications, vous devez redémarrer le service Fail2ban.
Maintenant à 6 heures du matin, vous recevrez un mail avec toutes les IP bannies pendant la journée par prison (jail).
That’s All.