Outils pour utilisateurs

Outils du site


fail2ban

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
fail2ban [2023/12/04 11:20] – [Le fichier jail.local] adminfail2ban [2025/01/16 09:09] (Version actuelle) – [Fail2Ban] serge.guerinet
Ligne 1: Ligne 1:
-====== Fail2Ban ======+====== Fail2Ban : bannir les intrus ======
  
-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'identifier un échec de connexion. +Un attaquant peut essayer en <wrap em>« brute force »</wrap> toutes les combinaisons possibles pour trouver le mot de passe d’un compte utilisateur sur un service. Pour le <wrap em>détecter</wrap>, il faut qu'une <wrap em>journalisation</wrap> permette d'identifier un échec de connexion. 
  
-Le serveur Apache ou le code ne permettent pas de détecter cela. +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</wrap> dans les accès aux services d’une machine :  
 +  * 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)</wrap> C’est le rôle de l’outil Fail2ban : <wrap em>de l’échec (Fail) à (2) un bannissement (Ban)</wrap>
 +
 +===== Installation =====
 +On doit d'abord installer **//fail2ban//** à partir des dépôts : 
 +<code lscript>apt install fail2ban</code>
 +
 +On doit aussi disposer de l'outil [[iptables|iptables]] qui gèrera les règles de bannissement : 
 +<code lscript>apt install iptables</code>
 +
 +
 +
  
 ===== 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>jail</wrap> : les services qu’on surveille (nom, port, fichiers journaux étudiés, filtres appliqués, etc) avec les paramètres (nombre de tentatives considérées comme une intrusion, intervalle de temps dans lequel on détecte ce nombre, etc)     * <wrap em>jail</wrap> : les services qu’on surveille (nom, port, fichiers journaux étudiés, filtres appliqués, etc) avec les paramètres (nombre de tentatives considérées comme une intrusion, intervalle de temps dans lequel on détecte ce nombre, etc)
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 (/etc/fail2ban) +  * Dossier de base (**/etc/fail2ban**
-    * fail2ban.conf : définit les configurations de base de l'outil : niveau de journalisation, fichier de journalisation, durée de conservation, etc +    * **fail2ban.conf** : définit les configurations de base de l'outil : niveau de journalisation, fichier de journalisation, durée de conservation, etc 
-    * jail.conf : paramètres par défaut des **//jail//** (prisons ou éléments surveillés) s'ils ne sont pas redéfinis :  +    * **jail.conf** : paramètres par défaut des **//jail//** (prisons ou éléments surveillés) s'ils ne sont pas redéfinis :  
-      * bantime : défini la durée de bannissement, et les options (rallongement, mémorisation, etc)+      * **bantime** : défini la durée de bannissement **en secondes**, et les options (rallongement, mémorisation, etc)
       * ignoreself et ignoreip : machines qui ne doivent pas être bannies       * ignoreself et ignoreip : machines qui ne doivent pas être bannies
-      * maxretry : nombre d'essais infructueux détectés avant bannissement +      * **maxretry** : nombre d'essais infructueux détectés avant bannissement 
-      * findtime : délai dans lequel on cherche les échecs d'action+      * **findtime** : délai dans lequel on cherche les échecs d'action
       * banaction : comportements à appliquer en cas de détection d'intrusion       * banaction : comportements à appliquer en cas de détection d'intrusion
       * 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 //**paths**// indiquent les chemins vers les fichiers à utiliser pour les ossiers, actions et autres filtres+    * les fichiers //**paths**// indiquent les chemins vers les fichiers à utiliser pour les dossiers, actions et autres filtres
  
-Pour configurer Fail2ban, la règle est de définir des fichiers spécifiques (nommés **//<nom>.local//**) dans les dossiers dédiés :  +**Pour configurer Fail2ban, la bonne pratique** est de définir des **fichiers spécifiques** (nommés **//<nom>.local//**) dans les dossiers dédiés :  
-  * jail.d : on y crée les configurations pour les services qu'on souhaite surveiller, soit dans des fichiers individuels, soit dans un fichier **//jail.local//** +  * **jail.d** : on y crée les configurations pour les services qu'on souhaite surveiller, soit dans des fichiers individuels, soit dans un fichier **//jail.local//** 
-  * 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é +  * **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, etc+  * **action.d** : dossier qui décrit les comportements (blocages d'IP, ajout de règles de filtrage, journalisation, etc
 + 
 +===== Les principales commandes ===== 
 +Gérer le service Fail2ban 
 +<code lscript>systemctl {stop|start|restart|status} fail2ban</code> 
 + 
 +Connaître l'état d'un jail (sshd, apache, etc) : actif ou non, machines bannies, ... 
 +<code lscript>fail2ban-client status <jail></code> 
 +Exemple 
 +<WRAP center round tip 90%> 
 +<code lscript>root@B1-DB12-SecuWeb:~# fail2ban-client status sshd 
 +Status for the jail: sshd 
 +|- Filter 
 +|  |- Currently failed: 0 
 +|  |- Total failed:     6 
 +|  `- Journal matches:  _SYSTEMD_UNIT=sshd.service + _COMM=sshd 
 +`- Actions 
 +   |- Currently banned: 1 
 +   |- Total banned:     2 
 +   `- Banned IP list:   10.12.0.38 
 + </code> 
 +</WRAP> 
 + 
 + 
 +Pour bloquer une IP pour un jail donné (sshd, apache, etc) 
 +<code lscript>fail2ban-client set <jail> banip <ip_poste> </code>   
 + 
 +Pour débloquer une IP bannie pour un jail donné (sshd, apache, etc) 
 +<code lscript>fail2ban-client set <jail> unbanip <ip_poste>  </code> 
 + 
 +Voir les journaux d'activité 
 +<code lscript>{nano|tail} /var/log/fail2ban.log</code> 
 + 
 + 
 +===== 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'outil permet des paramétrages plus ou moins restrictifs (mode normal, aggressive, ddos et extra). On trouvera une démarche et les explications complètes https://www.malekal.com/comment-proteger-ssh-avec-fail2ban-des-attaques-dos-bruteforce/.  
 + 
 +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 **/etc/fail2ban/jail.d/defaults-debian.conf** (existant) ou **/etc/fail2ban/jail.d/jail.local ** (éventuellement à créer), on indiquera la //**section**// [sshd] suivante :  
 + <code lscript>nano /etc/fail2ban/jail.d/jail.local </code> 
 +<code lscript> 
 +[sshd] 
 +# Active la surveillance stricte de SSH 
 +enabled = true   
 +#mode de surveillance 
 +mode = normal 
 +# Port sur lequel le blocage s'appliquera (par son nom ou son numéro : SSH ou 22) 
 +port = ssh   
 +# Chemin des logs d'authentification 
 +logpath = /var/log/auth.log   
 +# Nombre de tentatives autorisées avant bannissement (plus strict) 
 +maxretry = 3   
 +# Période d'échecs de connexion en minutes (30 minutes = 3000s) 
 +findtime = 3000   
 +# Temps de bannissement en minutes (20 minutes) 
 +bantime = 20m   
 +# Backend pour la gestion des journaux 
 +backend = systemd   
 +</code> 
 + 
 +Après modification du fichier, on redémarre le service : <code lscript> systemctl restart fail2ban </code> 
 + 
 +Une tentative de connexion impossible générera des traces dans le journal, jusqu'au banissement de la machine concernée. 
 +<code lscript> 
 +distant@machine.sio.bts$ tail /var/log/fail2ban.log 
 +2025-01-16 08:38:56,246 fail2ban.jail           [11935]: INFO    Jail 'sshd' started 
 +2025-01-16 08:38:56,247 fail2ban.jail           [11935]: INFO    Jail 'apache' started 
 +2025-01-16 08:41:06,536 fail2ban.filter         [11935]: INFO    [sshd] Found 10.12.0.38 - 2025-01-16 08:41:06 
 +2025-01-16 08:41:11,794 fail2ban.filter         [11935]: INFO    [sshd] Found 10.12.0.38 - 2025-01-16 08:41:11 
 +2025-01-16 08:41:16,044 fail2ban.filter         [11935]: INFO    [sshd] Found 10.12.0.38 - 2025-01-16 08:41:15 
 +2025-01-16 08:41:16,288 fail2ban.actions        [11935]: NOTICE  [sshd] Ban 10.12.0.38 
 +</code> 
 + 
 +après le temps prévu du bannissement, la machien est débloquée et l'information est journalisée 
 +<code lscript>2025-01-16 08:41:16,288 fail2ban.actions        [11935]: NOTICE  [sshd] Ban 10.12.0.38 
 +2025-01-16 08:46:16,414 fail2ban.actions        [11935]: NOTICE  [sshd] Unban 10.12.0.38 
 +</code>
  
 ===== 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, donc via le service Apache. On va créer une configuration de base pour bloquer des tentatives de connexion infructueuses répétées sur le service apache (http/https) dans le fichier à créer : <code lscript>nano /etc/fail2ban/jail.d/jail.local </code> On doit surveiller les échecs de connexion sur l’application, donc via le service Apache. On va créer une configuration de base pour bloquer des tentatives de connexion infructueuses répétées sur le service apache (http/https) dans le fichier à créer : <code lscript>nano /etc/fail2ban/jail.d/jail.local </code>
-Le contenu du fichier est par exemple : +Le contenu de la section pour apache sera par exemple : 
 <code apache> <code apache>
 [apache]    ; Nom du service qu’on surveille [apache]    ; Nom du service qu’on surveille
Ligne 48: Ligne 143:
 logpath  = /var/log/apache*/*error.log   ; fichier de journalisation dans lequel on cherche le comportement intrusif logpath  = /var/log/apache*/*error.log   ; fichier de journalisation dans lequel on cherche le comportement intrusif
 maxretry = 3 ; nombre d échecs avant banissement maxretry = 3 ; nombre d échecs avant banissement
-findtime 60 ; délai dans lequel le nombre d échec doit être détecté +findtime 60 ; délai dans lequel le nombre d échec doit être détecté 
-bantime 10m ; durée du bannissement (10 minutes)+bantime 10m ; durée du bannissement (10 minutes
 +banaction = iptables-allports  #bannit l'IP sur tous les ports (il existe d'autres options moins radicales)
 </code> </code>
  
-<WRAP center round tip 100%>+<WRAP center round important 100%>
 A ce stade, le blocage ne sera pas détecté car le filtre //apache-auth// ne saura pas reconnaître l'intrusion (le fonctionnement de l'application est normal, il n'y a pas d'enregistrement d'échec par défaut) A ce stade, le blocage ne sera pas détecté car le filtre //apache-auth// ne saura pas reconnaître l'intrusion (le fonctionnement de l'application est normal, il n'y a pas d'enregistrement d'échec par défaut)
 </WRAP> </WRAP>
Ligne 68: Ligne 164:
 <code lscript>fail2ban-client set apache unbanip <ip_poste>  </code> <code lscript>fail2ban-client set apache unbanip <ip_poste>  </code>
  
-**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 
 +</WRAP> 
  
 ==== 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 //connecter.php// qui vérifie l’identité de connexion, en cas d’erreur, avant le renvoi vers l’index.php, on inscrit l’erreur dans le journal d’activité :  Par exemple, dans la page //connecter.php// qui vérifie l’identité de connexion, en cas d’erreur, avant le renvoi vers l’index.php, on inscrit l’erreur dans le journal d’activité : 
 +<WRAP right round tip 40%>
 +  * error_log enregistre dans le fichier /var/log/apache2/error.log.  
 +  * $_SERVER["REMOTE_ADDR"] fournit l'IP du poste ayant généré l'accès 
 +</WRAP>
 <code php> <code php>
 else { else {
Ligne 89: Ligne 192:
 echec de connexion : root:10.12.0.6, referer: http://172.20.12.102/dplace/  echec de connexion : root:10.12.0.6, referer: http://172.20.12.102/dplace/ 
 echec de connexion : user:10.12.0.6, referer: http://172.20.12.102/dplace/ </code> echec de connexion : user:10.12.0.6, referer: http://172.20.12.102/dplace/ </code>
 +
 +<WRAP center round important 100%>
 +Le **jail** est configuré, les erreurs journalisées, mais le **filtre** ne prend toujours pas en compte l'information
 +</WRAP>
 +
  
 ==== 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 /etc/fail2ban/filter.d/apache-auth.conf</code> +<code lscript>nano /etc/fail2ban/filter.d/apache-auth.conf</code> 
-Il faut ajouter <wrap em>l’expression régulière</wrap> qui dit que la ligne recherchée doit commencer (^) par le terme « echec ».+ 
 +Il faut ajouter <wrap em>l’expression régulière</wrap> qui dit que la ligne recherchée doit commencer (^) par le terme « echec » (ajout à la dernière ligne du filtre existant). 
 + 
 +<code lscript>failregex = ^client (?:denied by server configuration|used wrong authentication schem> 
 +            ^user (?!`)<F-USER>(?:\S*|.*?)</F-USER> (?:auth(?:oriz|entic)ation failur> 
 +            ^Authorization of user <F-USER>(?:\S*|.*?)</F-USER> to access .*? failed\b 
 +            ^%(auth_type)suser <F-USER>(?:\S*|.*?)</F-USER>: password mismatch\b 
 +            ^%(auth_type)suser `<F-USER>(?:[^']*|.*?)</F-USER>' in realm `.+' (auth(?> 
 +            ^%(auth_type)sinvalid nonce .* received - length is not\b 
 +            ^%(auth_type)srealm mismatch - got `(?:[^']*|.*?)' but expected\b 
 +            ^%(auth_type)sunknown algorithm `(?:[^']*|.*?)' received\b 
 +            ^invalid qop `(?:[^']*|.*?)' received\b 
 +            ^%(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 
 +</code>
  
 ==== Journalisation du blocage ==== ==== Journalisation du blocage ====
 Le fichier **/var/log/fail2ban.log** conserve la trace des détections et blocages que l'outil a mis en place.  Le fichier **/var/log/fail2ban.log** conserve la trace des détections et blocages que l'outil a mis en place. 
 <code lscript>nano /var/log/fail2ban.log</code> <code lscript>nano /var/log/fail2ban.log</code>
 +
 +On y repère les horaires précis d'enregistrement de l'échec et l'action de banissement
 +
 +<code log>
 +2023-12-04 11:16:22,916 fail2ban.filter [2327]: INFO [apache] Found 10.12.0.6 - 2023-12-04 11:16:22
 +2023-12-04 11:16:24,832 fail2ban.filter [2327]: INFO [apache] Found 10.12.0.6 - 2023-12-04 11:16:24
 +2023-12-04 11:16:27,536 fail2ban.filter [2327]: INFO [apache] Found 10.12.0.6 - 2023-12-04 11:16:27
 +2023-12-04 11:16:27,725 fail2ban.actions [2327]: NOTICE [apache] Ban 10.12.0.6
 +</code>
  
  
  
fail2ban.1701688825.txt.gz · Dernière modification : de admin