fail2ban
Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
fail2ban [2023/12/04 11:20] – [Le fichier jail.local] admin | fail2ban [2025/01/16 09:09] (Version actuelle) – [Fail2Ban] serge.guerinet | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
- | ====== Fail2Ban ====== | + | ====== Fail2Ban |
- | Un attaquant peut essayer en « brute force » toutes les combinaisons possibles pour trouver le mot de passe d’un compte utilisateur sur un service. Pour le détecter, il faut qu'une journalisation permette d' | + | Un attaquant peut essayer en <wrap em>« brute force »</ |
- | Le serveur | + | Les services (Apache, SSH, FTP, etc) ou le code ne permettent pas de détecter cela. |
- | Il faut rajouter un utilitaire qui permet de détecter les comportements anormaux dans les accès aux services d’une machine : connexion trop fréquentes et en échec, connexions démultipliées dans un temps court, etc. | + | |
+ | Il faut rajouter un utilitaire qui permet de détecter les <wrap em>comportements anormaux</ | ||
+ | * connexion trop fréquentes et en échec, | ||
+ | * connexions démultipliées dans un temps court, | ||
+ | * connexions initiées puis abandonnées, | ||
+ | * connexions envoyant des éléments mal formés | ||
+ | * etc. | ||
C’est le rôle de l’outil Fail2ban : <wrap em>de l’échec (Fail) à (2) un bannissement (Ban)</ | C’est le rôle de l’outil Fail2ban : <wrap em>de l’échec (Fail) à (2) un bannissement (Ban)</ | ||
+ | |||
+ | ===== Installation ===== | ||
+ | On doit d' | ||
+ | <code lscript> | ||
+ | |||
+ | On doit aussi disposer de l' | ||
+ | <code lscript> | ||
+ | |||
+ | |||
+ | |||
===== Les principes ===== | ===== Les principes ===== | ||
Fail2ban est un outil de détection d’intrusion | Fail2ban est un outil de détection d’intrusion | ||
- | * Il explore les journaux d’activités (de la machine, d’un service, etc) pour y repérer des indications de comportement anormaux (par exemple une répétition de messages « connection refused » dans un temps déterminé). | + | * Il **explore les journaux d’activités** (de la machine, d’un service, etc) pour y repérer des indications de **comportement anormaux** (par exemple une répétition de messages « connection refused » dans un temps déterminé). |
* il se base sur 3 types de fichiers : | * il se base sur 3 types de fichiers : | ||
* <wrap em> | * <wrap em> | ||
Ligne 20: | Ligne 36: | ||
==== Les dossiers et fichiers ==== | ==== Les dossiers et fichiers ==== | ||
Fail2ban repose sur les éléments suivants : | Fail2ban repose sur les éléments suivants : | ||
- | * Dossier de base (/ | + | * Dossier de base (**/ |
- | * fail2ban.conf : définit les configurations de base de l' | + | |
- | * jail.conf : paramètres par défaut des **// | + | |
- | * bantime : défini la durée de bannissement, | + | |
* ignoreself et ignoreip : machines qui ne doivent pas être bannies | * ignoreself et ignoreip : machines qui ne doivent pas être bannies | ||
- | * maxretry : nombre d' | + | |
- | * findtime : délai dans lequel on cherche les échecs d' | + | |
* banaction : comportements à appliquer en cas de détection d' | * banaction : comportements à appliquer en cas de détection d' | ||
* une **section** /[JAIL] fourni les configurations par défaut pour de nombreux services | * une **section** /[JAIL] fourni les configurations par défaut pour de nombreux services | ||
- | * les fichiers // | + | * les fichiers // |
- | Pour configurer Fail2ban, la règle | + | **Pour configurer Fail2ban, la bonne pratique** |
- | * jail.d : on y crée les configurations pour les services qu'on souhaite surveiller, soit dans des fichiers individuels, | + | |
- | * filter.d : on y crée ou adapte les fichiers définissant ce qui est recherché dans les journaux pour identifier un type de comportement inadapté | + | |
- | * action.d : dossier qui décrit les comportements (blocages d'IP, ajout de règles de filtrage, journalisation, | + | |
+ | |||
+ | ===== Les principales commandes ===== | ||
+ | Gérer le service Fail2ban | ||
+ | <code lscript> | ||
+ | |||
+ | Connaître l' | ||
+ | <code lscript> | ||
+ | Exemple | ||
+ | <WRAP center round tip 90%> | ||
+ | <code lscript> | ||
+ | Status for the jail: sshd | ||
+ | |- Filter | ||
+ | | |- Currently failed: 0 | ||
+ | | |- Total failed: | ||
+ | | `- Journal matches: | ||
+ | `- Actions | ||
+ | |- Currently banned: 1 | ||
+ | |- Total banned: | ||
+ | `- Banned IP list: | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | |||
+ | Pour bloquer une IP pour un jail donné (sshd, apache, etc) | ||
+ | <code lscript> | ||
+ | |||
+ | Pour débloquer une IP bannie pour un jail donné (sshd, apache, etc) | ||
+ | <code lscript> | ||
+ | |||
+ | Voir les journaux d' | ||
+ | <code lscript> | ||
+ | |||
+ | |||
+ | ===== Exemple de démarche pour du brute force sur SSH ===== | ||
+ | On peut configurer Fail2ban pour qu'il détecte les tentatives de connexion sur SSH. L' | ||
+ | |||
+ | Pour SSH, tout le fonctionnement est pré-paramétré (filter, actions). Il ne reste qu'à définir le **jail**. | ||
+ | |||
+ | __**Exemple d'une configuration de base**__ | ||
+ | |||
+ | Dans le fichier **/ | ||
+ | < | ||
+ | <code lscript> | ||
+ | [sshd] | ||
+ | # Active la surveillance stricte de SSH | ||
+ | enabled = true | ||
+ | #mode de surveillance | ||
+ | mode = normal | ||
+ | # Port sur lequel le blocage s' | ||
+ | port = ssh | ||
+ | # Chemin des logs d' | ||
+ | logpath = / | ||
+ | # Nombre de tentatives autorisées avant bannissement (plus strict) | ||
+ | maxretry = 3 | ||
+ | # Période d' | ||
+ | findtime = 3000 | ||
+ | # Temps de bannissement en minutes (20 minutes) | ||
+ | bantime = 20m | ||
+ | # Backend pour la gestion des journaux | ||
+ | backend = systemd | ||
+ | </ | ||
+ | |||
+ | Après modification du fichier, on redémarre le service : <code lscript> systemctl restart fail2ban </ | ||
+ | |||
+ | Une tentative de connexion impossible générera des traces dans le journal, jusqu' | ||
+ | <code lscript> | ||
+ | distant@machine.sio.bts$ tail / | ||
+ | 2025-01-16 08: | ||
+ | 2025-01-16 08: | ||
+ | 2025-01-16 08: | ||
+ | 2025-01-16 08: | ||
+ | 2025-01-16 08: | ||
+ | 2025-01-16 08: | ||
+ | </ | ||
+ | |||
+ | après le temps prévu du bannissement, | ||
+ | <code lscript> | ||
+ | 2025-01-16 08: | ||
+ | </ | ||
===== Exemple de démarche pour du brute force sur une application Web ===== | ===== Exemple de démarche pour du brute force sur une application Web ===== | ||
Ligne 40: | Ligne 135: | ||
==== Le fichier jail.local ==== | ==== Le fichier jail.local ==== | ||
On doit surveiller les échecs de connexion sur l’application, | On doit surveiller les échecs de connexion sur l’application, | ||
- | Le contenu | + | Le contenu |
<code apache> | <code apache> | ||
[apache] | [apache] | ||
Ligne 48: | Ligne 143: | ||
logpath | logpath | ||
maxretry = 3 ; nombre d échecs avant banissement | maxretry = 3 ; nombre d échecs avant banissement | ||
- | findtime | + | findtime |
- | bantime | + | bantime |
+ | banaction = iptables-allports | ||
</ | </ | ||
- | <WRAP center round tip 100%> | + | <WRAP center round important |
A ce stade, le blocage ne sera pas détecté car le filtre // | A ce stade, le blocage ne sera pas détecté car le filtre // | ||
</ | </ | ||
Ligne 68: | Ligne 164: | ||
<code lscript> | <code lscript> | ||
- | **Cette manipulation montre le principe mais n'est pas automatisée** | + | <WRAP center round important 100%> |
+ | Cette manipulation montre le principe mais n'est pas automatisée | ||
+ | </ | ||
==== Enregistrement de trace dans le journal surveillé par le jail ==== | ==== Enregistrement de trace dans le journal surveillé par le jail ==== | ||
Ligne 76: | Ligne 175: | ||
Par exemple, dans la page // | Par exemple, dans la page // | ||
+ | <WRAP right round tip 40%> | ||
+ | * error_log enregistre dans le fichier / | ||
+ | * $_SERVER[" | ||
+ | </ | ||
<code php> | <code php> | ||
else { | else { | ||
Ligne 89: | Ligne 192: | ||
echec de connexion : root: | echec de connexion : root: | ||
echec de connexion : user: | echec de connexion : user: | ||
+ | |||
+ | <WRAP center round important 100%> | ||
+ | Le **jail** est configuré, les erreurs journalisées, | ||
+ | </ | ||
+ | |||
==== Prise en compte par le filtre ==== | ==== Prise en compte par le filtre ==== | ||
Ligne 99: | Ligne 207: | ||
Editez-le filtre | Editez-le filtre | ||
- | <code lscript>ano / | + | <code lscript>nano / |
- | Il faut ajouter <wrap em> | + | |
+ | Il faut ajouter <wrap em> | ||
+ | |||
+ | <code lscript> | ||
+ | ^user (? | ||
+ | ^Authorization of user < | ||
+ | ^%(auth_type)suser < | ||
+ | ^%(auth_type)suser `< | ||
+ | ^%(auth_type)sinvalid nonce .* received - length is not\b | ||
+ | ^%(auth_type)srealm mismatch - got `(?: | ||
+ | ^%(auth_type)sunknown algorithm `(?: | ||
+ | ^invalid qop `(?: | ||
+ | ^%(auth_type)sinvalid nonce .*? received - user attempted time travel\b | ||
+ | ^(?:No h|H)ostname \S+ provided via SNI(?:, but no hostname provided| and> | ||
+ | ^echec \b | ||
+ | </ | ||
==== Journalisation du blocage ==== | ==== Journalisation du blocage ==== | ||
Le fichier **/ | Le fichier **/ | ||
<code lscript> | <code lscript> | ||
+ | |||
+ | On y repère les horaires précis d' | ||
+ | |||
+ | <code log> | ||
+ | 2023-12-04 11: | ||
+ | 2023-12-04 11: | ||
+ | 2023-12-04 11: | ||
+ | 2023-12-04 11: | ||
+ | </ | ||
fail2ban.1701688825.txt.gz · Dernière modification : de admin