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:27] – [Journalisation du blocage] 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>
  
Ligne 79: 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 109: Ligne 209:
 <code lscript>nano /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> <code lscript>failregex = ^client (?:denied by server configuration|used wrong authentication schem>
Ligne 132: Ligne 232:
  
 <code log> <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: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: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,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+2023-12-04 11:16:27,725 fail2ban.actions [2327]: NOTICE [apache] Ban 10.12.0.6
 </code> </code>
  
  
  
fail2ban.1701689256.txt.gz · Dernière modification : de admin