Installer et configurer le paquet Fail2ban sur un serveur

Par le dans . Marqué comme , , , , , avec 35 Commentaires

Installer et configurer le paquet Fail2ban sur un serveur

Après vous avoir expliqué comment vous protéger « vous et votre fidèle serveur » du spam avec mes billets concernant l’installation de SpamAssassin et la mise en place d’un SPF pour votre serveur de mails, je me suis dit que j’allais continuer cette série de billets sur l’administration de serveurs.

Aujourd’hui, nous allons donc nous attaquer à la « sécurisation » d’un serveur avec l’installation et le paramétrage du paquet Fail2ban !!

Informations importantes :
Avant de commencer, sachez que ce billet se base sur la dernière distribution stable de GNU/Linux Debian qui est la version 6.0.1, nom de code Squeeze. Toutes les informations et modifications de la configuration de Fail2ban que je diffuse dans ce billet sont en production sur mon serveur depuis maintenant plusieurs mois et je n’ai, encore à ce jour, rencontré aucun problème.

Qu’est-ce que Fail2ban ?! Comment ça fonctionne ?!

Alors, avant de vous jeter comme des morfales sur votre terminal en ayant envie de bouffer de la ligne de commandes et du fichier de configuration (bande de g33ks), respirez un bon coup et laissez-vous aller !!

Je vais commencer par vous expliquer rapidement ce qu’est Fail2ban et comment ce paquet fonctionne.

  • Fail2ban est un logiciel libre, vous pouvez le distribuer et/ou le modifier sous les termes de la licence GNU General Public License.
  • Fail2ban est un paquet qui est capable de lire et d’analyser des fichiers de logs de toute sortes comme /var/log/apache*/*error.log ou /var/log/mail.err ou encore /var/log/auth.log
  • Lors de l’analyse de ces logs, il est capable de bannir pour une durée à déterminer les adresses IP qui auront obtenues un nombre (à paramétrer) d’échecs lors de l’authentification à l’un des daemons installés sur votre serveur.

Une fois que Fail2ban a décidé de bannir une adresse IP, Fail2ban est alors capable de créer et de mettre à jour les règles du pare-feu de votre serveur. Il est donc capable d’écrire des règles IPTables de la forme suivante :

iptables -I INPUT 1 -s AdresseIpBannie -j DROP

Installer et configurer « basiquement » Fail2ban sur un serveur :

Maintenant … passons aux choses sérieuses ^^

Pour installer le paquet Fail2ban sur votre serveur, rien de plus simple :

aptitude install fail2ban

Une fois le paquet installé, il est conseillé de paramétrer Fail2ban, pour cela il faut éditer le fichier /etc/fail2ban/jail.conf avec la commande suivante :

nano /etc/fail2ban/jail.conf

Afin d’y modifier les valeurs suivantes en fonction de vos besoins :

  • bantime = 600 où bantime est le temps en secondes pour lequel une adresse IP est bannie (je vous conseille de mettre une valeur plus importante comme 604800 secondes ce qui fait 7 jours exactement.
  • maxretry = 3 où maxrestry est le nombre d’échecs d’authentification à partir duquel Fail2ban doit rejeter une adresse IP
  • destemail = server@domain.tld où destemail est l’adresse email vers laquelle Fail2ban enverra ses rapports.
  • action = %(action_XXX)sXXX est à remplacer par le paramètre mwl pour obtenir de plus amples informations dans les rapports envoyés par Fail2ban

Ensuite il suffit d’activer les Jails (ou prisons en français) pour que Fail2ban commence le monitoring des Daemons choisis avec par exemple des Jails pour ssh, pam-generic, postfix , apache, sasl, couriersmtp etc.
Cette liste n’est pas exhaustive car il est ensuite possible de créer soi-même ses propres Jails/prisons en fonction des ses besoins !!

Pour cela, il faudra toujours dans le fichier /etc/fail2ban/jail.conf retrouver la Jail qui vous intéresse pour y modifier le paramètre enable afin de le mettre sur true ou false

Exemple d’une Jail concernant le daemon SSH qui est activée :

[ssh]
enabled = true
port	= ssh
filter	= sshd
logpath  = /var/log/auth.log
maxretry = 6

Les paramètres que j’ai listé un peu plus haut (maxretry, bantime etc.) sont des paramètres globaux pris par défaut par Fail2ban. Mais chacune de ces valeurs peut être affinée et redéfinie pour chaque jail comme vous pouvez le voir dans la jail SSH ci-dessus.

Améliorer le fonctionnement de Fail2ban :

Nous venons de voir les bases du fonctionnement de Fail2ban et comme vous pouvez le voir ce n’est pas très compliqué !! Passons maintenant à la suite … nous allons paramétrer notre analyseur de logs plus en détails afin de créer de nouvelles Jails et de corriger quelques erreurs présentes dans les règles de filtres suite à l’installation du paquet. (ces erreurs étaient présentes sur mon serveur suite à l’installation du paquet et si celui-ci a été mis à jour entre-temps, vous ne les rencontrerez pas mais dans le doute …)

Pour bien comprendre le fonctionnement de Fail2ban, il faut savoir que les Jails présentes dans le fichier /etc/fail2ban/jail.conf fonctionnent grâce à des fichiers jouant le rôle de filtres qui sont présents dans le répertoire /etc/fail2ban/filter.d/. Ces fichiers sont composés de regex ou expressions régulières reposant sur le langage POSIX.

Nous avons vu plus haut la jail SSH, voici maintenant un bout de son filtre : (pour voir la regex entière je vous conseille un petit cat /etc/fail2ban/filter.d/sshd.conf dans votre terminal !!)

failregex = ^%(__prefix_line)s(?:error: PAM: )?Authentication failure for .* from <HOST>\s*$
            ^%(__prefix_line)s(?:error: PAM: )?User not known to the underlying authentication module for .* from <HOST>\s*$

Pour améliorer la configuration de notre Fail2ban, nous allons donc ajouter plusieurs Jails et filtres utiles pour un serveur qui aura une vocation plutôt orientée Web et hébergement de sites Internet :)

Comment bloquer les requêtes w00t-w00t qui ciblent le daemon Apache :

En effet, il existe des attaques sur le serveur Apache qui envoient des requêtes étranges sur la racine du serveur en cherchant un fichier commençant par w00tw00t. (d’après ce que j’en ai compris hein ^^)
Nous pouvons donc bannir les adresses IP qui effectuent ces requêtes en créant le fichier /etc/fail2ban/filter.d/apache-w00tw00t.conf :

nano /etc/fail2ban/filter.d/apache-w00tw00t.conf

Et ajoutons y les lignes suivantes pour créer notre filtre :

#<HOST> - - [11/Jan/2010:14:56:27 +0200] "GET /w00tw00t.at.ISC.SANS.DFind:) HTTP/1.1" 400 326

[Definition]
# Option:  failregex
# Notes.:  regex to match the w00tw00t scan messages in the logfile. The
#          host must be matched by a group named "host". The tag "<HOST>" can
#          be used for standard IP/hostname matching.
# Values:  TEXT
failregex = ^<HOST> -.*"GET \/w00tw00t\.at\.ISC\.SANS\.DFind\:\).*".*

# Option:  ignoreregex
# Notes.:  regex to ignore. If this regex matches, the line is ignored.
# Values:  TEXT
ignoreregex =

Enregistrer ensuite le fichier que l’on vient de créer.

Une fois notre filtre créé, il nous faut ajouter et activer la jail :

nano /etc/fail2ban/jail.conf

Pour y ajouter les lignes suivantes :

[apache-w00tw00t]
enabled = true
filter  = apache-w00tw00t
port = all
banaction = iptables-allports
port     = anyport
logpath  = /var/log/apache*/access.log
maxretry = 1
bantime = 86400

Comment bloquer les scanners de failles qui ciblent le daemon Apache :

De la même façon que pour les requêtes w00t-w00t, il existe un filtre permettant de bloquer les scans du serveur Apache. Il faut donc créer le filtre suivant /etc/fail2ban/filter.d/apache-bloquescan.conf avec les informations suivantes :

[Definition]
failregex = [[]client <HOST>[]] client denied by server configuration: /home/www/*.*
ignoreregex=

Puis il faut activer ce filtre dans /etc/fail2ban/jail.conf en ajoutant :

[apache-bloquescan]
enabled = true
port    = http,https
filter  = apache-bloquescan
logpath = /var/log/apache*/*error.log
maxretry = 1
banTime = 86400

Optimisation de la jail de Postfix :

De nombreux spammeurs essaient d’envoyer des emails à des adresses inexistantes sur les serveurs qu’ils trouvent.
Par défaut, le filtre de fail2ban ne banni que les emails rejetés par le serveur (erreur 554), mais ne gère pas les emails rejetés pour une adresse inexistante.
Afin de remédier à cela, nous allons éditer le fichier /etc/fail2ban/filter.d/postfix.conf pour simplement supprimer le 4 de la ligne suivante pour bannir n’importe quelle erreur :

failregex = reject: RCPT from (.*)\[<HOST>\]: 554

Activation de la Jail concernant le serveur FTP pureFTPd :

Si jamais vous utilisez le paquet PureFTPd pour votre serveur FTP, sachez que par défaut, le filtre Fail2ban existe mais que la définition de la Jail n’est pas présente dans le fichier /etc/fail2ban/jail.conf !!

Il va donc falloir activer le filtre pour pureFTPd si vous l’utilisez sur votre serveur :

nano /etc/fail2ban/jail.conf

Et ajoutez les lignes suivantes :

[pure-ftpd]
enabled  = true
port     = ftp
filter   = pure-ftpd
logpath  = /var/log/messages
maxretry = 3

Comment protéger PhpMyAdmin avec Fail2ban :

Si vous utilisez le paquet PhpMyAdmin pour une gestion simplifiée de vos bases de données, il est possible avec Fail2ban d’empêcher aux bots de scanner les versions de PhpMyAdmin installées sur un serveur, afin de rendre plus complexe l’utilisation de failles de sécurité connues !!

Pour cela, il faut ajouter le fichier /etc/fail2ban/filter.d/apache-phpmyadmin.conf et y ajouter les lignes suivantes :

# Fail2Ban configuration file
# Bans bots scanning for non-existing phpMyAdmin installations on your webhost.
#

[Definition]
# Option: failregex
# Notes.: Regexp to match often probed and not available phpmyadmin paths.
# Values: TEXT
#
failregex = [[]client <HOST>[]] File does not exist: .*(PMA|phpmyadmin|myadmin|mysql|mysqladmin|sqladmin|mypma|admin|xampp|mysqldb|mydb|db|pmadb|phpmyadmin1|myadmin2)

# Option: ignoreregex
# Notes.: regex to ignore. If this regex matches, the line is ignored.
# Values: TEXT
#
ignoreregex =

Il faut ensuite activer le filtre dans le fichier de configuration /etc/fail2ban/jail.conf :

[apache-phpmyadmin]
enabled = true
port = http,https
filter = apache-phpmyadmin
logpath = /var/log/apache*/*error.log
maxretry = 3

Activation de la Jail contre les bots ciblant Apache :

Le filtre Apache-badbots est présent dans le répertoire /etc/fail2ban/filter.d/ mais n’est pas activé par défaut dans le fichier de configuration /etc/fail2ban/jail.conf de Fail2ban.

Il peut donc être intéressant de l’activer MAIS attention avec cette Jail car j’ai rencontré plusieurs problèmes et je l’ai finalement désactivée !!
En effet, d’après les rapports Logwatch de mon serveur, la jail contre les bots avait tendance à bannir les adresses IP de plusieurs bots qui ne sont pas forcément nocifs, comme les GoogleBots, YahooBots etc. Je pense qu’il faudrait l’améliorer, donc si jamais quelqu’un à le courage de le faire, n’hésitez pas à poster la regex corrigée pour que je mette à jour mon billet :-)

Pour activer la jail Apache-Badbots, ajoutez donc les lignes suivantes dans /etc/fail2ban/jail.conf :

[apache-badbots]
enabled  = true
filter   = apache-badbots
port = http,https
banaction = iptables-allports
logpath  = /var/log/apache*/access.log
bantime  = 86400
maxretry = 1

Corriger la Jail par défaut du daemon SASL :

Après plusieurs tests et quelques recherches sur le Net, je me suis rendu compte que la jail par défaut du daemon SASL se trouvant dans le fichier /etc/fail2ban/filter.d/sasl.conf ne fonctionnait pas !!

Il faut modifier une ligne du filtre en enlevant la fin pour que la ligne :

failregex = (?i): warning: [-._\w]+\[<HOST>\]: SASL (?:LOGIN|PLAIN|(?:CRAM|DIGEST)-MD5) authentication failed(: [A-Za-z0-9+/]*={0,2})?$

ressemble à :

failregex = (?i): warning: [-._\w]+\[<HOST>\]: SASL (?:LOGIN|PLAIN|(?:CRAM|DIGEST)-MD5) authentication failed

Prise en compte de l’ensemble des modifications effectuées :

Pour finaliser l’ensemble de vos modifications, il faudra redémarrer le daemon Fail2ban pour que la nouvelle configuration soit prise en compte.
Cela se fait avec les lignes de commandes suivantes :

/etc/init.d/fail2ban stop
/etc/init.d/fail2ban start

Et pour vérifier que le daemon Fail2ban est bien lancé, utilisez la commande suivante :

ps aux | grep fail2ban

Si vous obtenez un retour autre que le grep de fail2ban c’est que le daemon est bien démarré.

Tester si les jails fonctionnent convenablement :

Une fois Fail2ban installé et configuré convenablement, il est possible de vérifier si une jail fonctionne correctement !
En effet, lorsque l’on modifie ou que l’on écrit une expression régulière, on peut la tester via la commande « fail2ban-regex » qui prend deux arguments :

  • Le fichier de logs à analyser (ou directement la ligne de logs à analyser)
  • Le fichier contenant l’expression régulière (ou directement l’expression régulière)

Il peut être utile de vérifier si une jail est efficace ou pas et si elle est fonctionnelle. C’est comme ça que je me suis rendu compte qu’il y avait une erreur dans la Jail de SASL (Cf. plus haut). En comparant les logs de mon serveur et en testant la jail de SASL, je me suis rendu compte qu’elle ne fonctionnait pas suite à une erreur dans la regex.

Voici un exemple de vérification d’une expression régulière via la ligne de commande :

fail2ban-regex /var/log/apache2/error.log /etc/fail2ban/filter.d/apache-phpmyadmin.conf

Résultats positifs :

Si l’expression récupère bien des résultats dans le fichier de logs, vous obtiendrez alors un résultat de la forme :

Running tests
=============
Use regex file : /etc/fail2ban/filter.d/apache-phpmyadmin.conf
Use log file   : /var/log/apache2/error.log

Results
=======
Failregex
|- Regular expressions:
|  [1] [[]client <HOST>[]] File does not exist: .*(PMA|phpmyadmin|myadmin|mysql|mysqladmin|sqladmin|mypma|admin|xampp|mysqldb|mydb|db|pmadb|phpmyadmin1|myadmin2)
|
`- Number of matches:
   [1] 21 match(es)

Ignoreregex
|- Regular expressions:
|
`- Number of matches:

Summary
=======
Addresses found:
[1]
    XXX.XXX.XXX.XXX (Sun Mar 20 23:04:19 2011)
    XXX.XXX.XXX.XXX (Sun Mar 20 23:04:19 2011)
    XXX.XXX.XXX.XXX (Sun Mar 20 23:04:19 2011)

Date template hits:
124 hit(s): MONTH Day Hour:Minute:Second
0 hit(s): WEEKDAY MONTH Day Hour:Minute:Second Year
0 hit(s): WEEKDAY MONTH Day Hour:Minute:Second
0 hit(s): Year/Month/Day Hour:Minute:Second
0 hit(s): Day/Month/Year Hour:Minute:Second
0 hit(s): Day/Month/Year Hour:Minute:Second
0 hit(s): Day/MONTH/Year:Hour:Minute:Second
0 hit(s): Month/Day/Year:Hour:Minute:Second
0 hit(s): Year-Month-Day Hour:Minute:Second
0 hit(s): Day-MONTH-Year Hour:Minute:Second[.Millisecond]
0 hit(s): Day-Month-Year Hour:Minute:Second
0 hit(s): TAI64N
0 hit(s): Epoch
0 hit(s): ISO 8601
0 hit(s): Hour:Minute:Second
0 hit(s): <Month/Day/Year@Hour:Minute:Second>

Success, the total number of match is 21

However, look at the above section 'Running tests' which could contain important information.

Résultats négatifs :

Si jamais l’expression régulière n’est pas correcte ou que vos logs ne contiennent pas les lignes recherchées, vous obtiendrez alors un résultat de la forme suivante, grâce par exemple à cette ligne de commande :

fail2ban-regex /var/log/apache2/access.log /etc/fail2ban/filter.d/apache-phpmyadmin.conf
Running tests
=============
Use regex file : /etc/fail2ban/filter.d/apache-phpmyadmin.conf
Use log file   : /var/log/apache2/access.log

Results
=======
Failregex
|- Regular expressions:
|  [1] [[]client <HOST>[]] File does not exist: .*(PMA|phpmyadmin|myadmin|mysql|mysqladmin|sqladmin|mypma|admin|xampp|mysqldb|mydb|db|pmadb|phpmyadmin1|myadmin2)
|
`- Number of matches:
   [1] 0 match(es)

Ignoreregex
|- Regular expressions:
|
`- Number of matches:

Summary
=======
Sorry, no match

Look at the above section 'Running tests' which could contain important information.

Petite astuce en cas de pépin ou comment se débannir de Fail2ban :

Bon forcément … à force de jouer et de tester tout et n’importe quoi (c’est comme ça que l’on apprend non ?!) j’ai fini par me faire /kick par Fail2ban, qui a pris en grippe mon adresse IP via une des jails d’Apache. Il m’était alors impossible de charger une page du blog, ce qui je vous l’avoue est assez gênant ^^

Donc si comme moi, vous êtes en IP fixe sur votre box et que l’astuce du reboot de votre connexion ADSL ne fonctionne pas, il va falloir trouver un moyen de vous débannir … Et pour cela j’ai trouvé deux solutions …

La première solution en mode « bourrin » :

On redémarre le serveur !!
En effet, IPtables n’enregistre que « temporairement » les règles de filtrage qui lui sont données, donc un restart de votre serveur réinitialisera sa configuration et il vous sera alors à nouveau possible d’accéder à votre site.
Enfin … c’est efficace … mais pas franchement conseillé ^^

La seconde solution bien plus « propre » :

Cette solution consiste à demander à IPtables de nous laisser tranquille !!
Pour débannir une adresse IP ou son adresse IP il va falloir réaliser plusieurs manipulations !!

  • Tout d’abord, rechercher sur quelle table et quelle chaîne Fail2ban a banni une adresse IP !!
iptables -t filter -L -n

Cette commande permet de lister rapidement les règles d’iptables et prend en arguments le paramètre -t pour préciser la table à lire, et le paramètre -L pour lister les règles. Le paramètre -n permet de ne pas rechercher les reverse DNS des adresses IP (ce qui permet de lister les adresses IP bannies plus rapidement).

Si comme moi, le nombre de règles est trop important pour être lu sur votre terminal, renvoyez le résultat de la commande dans un fichier plus facile à manipuler :

iptables -t filter -L -n > VotreFichier

Une fois que vous avez obtenu cette information, il va falloir chercher sur quelle chaîne Fail2ban a été sans pitié.
Par exemple, la chaîne fail2ban-apache-phpmyadmin, ce qui est arrivé dans mon cas !!

Ensuite il faut compter le numéro de ligne où se trouve votre adresse IP dans le résultat, vous obtiendrez comme cela le numéro de la règle ayant banni votre IP.

  • Débannir votre adresse IP :

Une fois que vous aurez obtenu les informations nécessaires pour vous débannir, il faudra ensuite utiliser la ligne de commande suivante :

iptables -t filter -D NomDeLaChaine NumeroDeLaChaine

Commande qui se traduit de la façon suivante :

  • -D ou –delete NomDeLaChaine est le nom de la chaîne à manipuler
  • Et où NumeroDeLaChaine est le numéro de la règle à manipuler

Dans mon cas, la commande ressemblait à :

iptables -t filter -D fail2ban-apache-phpmyadmin 1

Faites ensuite un test pour vérifier que la commande a bien fonctionné. Pour l’exemple de Fail2ban et de la règle apache-phpmyadmin, le test consistera à afficher une page web présente sur le serveur concerné.

## Mise à jour du billet le 20/12/2015 (merci Spyneur) ##

Une solution encore plus « propre » :

Suite au commentaire d’un sublimigeekien qui est passé par ici, je fais une petite mise à jour de cet article pour vous signaler une astuce bien pratique dont je n’ai pas parlé lors de sa rédaction !

Pour éviter que Fail2ban ne banisse vos adresses IP « par erreur », il est possible de lui demander très simplement de les ignorer.

Voici comment faire :
* Éditer le fichier /etc/fail2ban/jail.conf
* Rechercher le bloc de configuration suivant : [DEFAULT]
* Modifier la ligne ignoreip en y ajoutant vos adresses « IP et masque de sous-réseaux » ou vos « noms de domaines » concernés (séparés par des espaces) :

Dans l’exemple ci-dessous, j’ai ajouté le bloc d’adresses IP suivantes : 10.0.0.0/8

[DEFAULT]
# "ignoreip" can be an IP address, a CIDR mask or a DNS host
ignoreip = 127.0.0.1/8 10.0.0.0/8

* Après avoir enregistré vos modifications, n’oubliez pas de redémarrer le service Fail2ban comme je l’ai expliqué un peu plus haut.

Si vous connaissez d’autres astuces ou des règles supplémentaires pour Fail2ban, et que vous souhaitez les partager avec les visiteurs de ce blog, n’hésitez pas à les poster en commentaires et je les ajouterai au billet !!

Voici les sources que j’ai utilisées pour réaliser ce billet :
– La définition Wikipédia de Fail2ban
– Le FAQ (en français) de Fail2ban : FAQ du projet Fail2ban
– Le manuel ou howto du projet : manuel de Fail2ban
– Toutes les notes que j’ai pu prendre lors de mes différents tests sur mon serveur !! (plusieurs heures de boulot, donc merci à mon GoogleNotebook et à ma manie de tout noter !!)
Et désolé pour les sites que je n’aurais pas cité car ce sont des recherches que j’ai réalisées il y a un moment maintenant, et impossible de remettre la main sur les liens et/ou wiki que j’ai utilisés …

35 Commentaires


  1. Salut et bravo pour ton travail sur f2b.

    C’est vrai que c’est plus simple que de configurer iptable à la mano et autres modules d’apps réseaux, pour un serveur pas trop exposé ; mais pour un serveur web avec un traffic hardcore et donc fortement attaqué, f2b devient très vilain et gourmand, pas le choix faut éviter ce genre d’applicatif.

    Merci pour ton travail et ton blog très intéressant

    • Salut Lionel,

      Tout d’abord merci pour ce commentaire et tes compliments :-)
      Ensuite, concernant la consommation en ressources système de Fail2ban, je t’avouerai que je n’ai pas encore eu « réellement » l’occasion de travailler sur un serveur au trafic hardcore comme tu dis, donc je ne sais pas si Fail2ban est si gourmand que ça ^^ Mais j’imagine en effet que l’analyse des logs sur un gros serveur peut rapidement devenir gourmande !!
      Dans ce cas, tu préconiserai quoi comme applicatif(s) et/ou autre(s) action(s) à réaliser ?!

      Ps : je me suis permis de supprimer les liens que tu as mis dans tes coms car ils ne menaient vers rien, mais si tu veux je peux mettre celui de SMSMPI ?

  2. Bonjour,

    merci à Joël ? et félicitations pour cet article qui m’a bien servi.

    En effet, en fouinant dans les logs d’un de mes dédiés j’ai pu constater ce genre d’attaques à 2 balles (en même temps j’ai viré phpmyadmin entretemps qui ne me servait plus)

    donc maintenant, je vais surveiller les logs à nouveau, en espérant que ça coince ces batards de robots. de plus, c’est vraiment formidable que fail2ban ait pu mettre en place un système de test d’expressions régulières directement dans le log (bon bien sûr ce test aurait pu être fait aussi à la main avec vi, mais là on est sûr de pas se planter)

    a+

  3. Au passage je vous mets aussi ma ligne regex qui concerne le filtre phpmyadmin, je l’ai un peu modifié en fonction de mes logs, en rajoutant 2 ou 3 expressions :

    failregex = [[]client []] File does not exist: .*(pMA|PMA|phpMyAdmin|phpmyadmin|myadmin|mysql|mysqladmin|
    sqladmin|mypma|admin|xampp|mysqldb|mydb|db|pmadb|phpmyadmin1|myadmin2|pma)

    D’ailleurs ça aurait bien en petit complément d’expliquer comment exécuter fail2ban au démarrage du serveur ? car je suis pas certain que sans rien il démarre directement tout seul.

    • Salut Arnaud,

      Tout d’abord merci pour tes commentaires, et surtout pour la regex concernant PhpMyAdmin !!
      Il est vrai que j’avais vu passer dans mes logs des cas que le filtre de PMA ne prenait pas en compte, mais je n’ai jamais pris le temps de le modifier. Avec ça, plus d’excuse je vais devoir m’y coller ^^
      En tout cas, merci pour le tuyau :)

      Concernant ta question pour l’exécution de Fail2ban au boot d’un serveur, il est vrai que je n’ai pas donné d’info sur ce point …

      Il faut donc savoir que le démon Fail2ban s’exécute automatiquement lors du démarrage de la machine, et pour vérifier cela je te propose 2 manières de procéder :
      1) Connaitre le status de Fail2ban via une ligne de commandes :
      $ fail2ban-client status
      Cette ligne retournera le status de Fail2ban avec le nombre et une liste des jails actives.
      Exemple :
      Status
      |- Number of jail: 14
      `- Jail list: apache-w00tw00t, courierauth, pam-generic

      On voit ici que Fail2ban a bien été lancé sans intervention de ma part.
      2) Connaitre les jails actives via IPtables :
      Comme expliqué dans mon billet, Fail2ban écrit des règles IPtables pour bloquer les IP qui tentent de scanner les serveurs.
      Donc avec cette commande suivante, il est possible de lister les règles prises en compte par IPtables. Si on trouve des traces de Fail2ban, cela confirmera que celui-ci est bien lancé :)
      $ iptables -L
      Exemple :
      Chain INPUT (policy DROP)
      target prot opt source destination
      fail2ban-sasl tcp -- anywhere anywhere multiport dports smtp,ssmtp,imap2,imap3,imaps,pop3,pop3s
      fail2ban-ssh-ddos tcp -- anywhere anywhere multiport dports ssh

      J’essaierai de prendre un peu de temps pour ajouter un rapide paragraphe au billet :)

      • Salut Joël,

        merci pour les compléments, pour ma part, j’ai vérifié les nouvelles entrées iptables avec :
        iptables –list
        mais après ce n’est peut être pas la bonne commande.

        pour les règles phpmyadmin, en fait il pourrait y en avoir d’autres, car ces robots testent différentes versions de phpmyadmin, exemple :
        phpMyAdmin-2.11.6.0|phpMyAdmin-2.11.9.3|phpMyAdmin-2.9.0 etc ..

        mais ce serait quasi inutile étant donné que les règles actuelles bannissent déjà, il suffit de quelques correspondances et c’est bon, le paramètre maxretry qui a été mis en place

        • J’essaierai la commande « iptables –list » pour voir ce que cela donne car je ne vois pas ce qu’elle retourne là tout de suite :)
          Concernant le paramètre maxretry, il faut en effet le mettre le plus petit possible pour ne pas laisser le temps aux scripts de tourner, mais si la machine sur laquelle le script tourne est vraiment puissante, le temps que Fail2ban demande à Iptables de faire son boulot, le script a parfois le temps de scanner plusieurs dizaines de fois la version de PMA !!
          Je n’ai pour le moment pas trouver de moyen d’optimiser ces temps de traitements … donc si jamais tu as un tuyau sur ce sujet, je suis preneur ^^

  4. Salut :-)

    Pourquoi ne pas changer le dossier phpmyadmin changer son nom et protéger l’accès par un .htaccess et password / les robots sont cons LOL

    Sinon pour ta demande pour les serveurs a treS gros trafic / ben déjà pour du http filtrer les logs, car tu sais mieux que moi qu’une simple image genre une flèche LOL pour un utilisateur tu te retrouve avec 1000 lignes de logs, tu t’imagines avec les sites qui font 200 000 vu par jour re gros LOL

    Jvais essayer de retrouver les règles apache pour les logs filtre.

    Car finalement fail2ban peut être hyper interressant même pour du fort trafic faut juste être rusé pour qu’il soit le moins solicite. Avis personnel biensur ;-)

    • Salut Lionel,
      Merci pour le lien, je regarde ça plus en détails dès que j’ai un peu de temps libre ^^
      Il est vrai que vu le « petit » trafic que je génère, pour le moment je n’ai pas de problème de gourmandise de la part de Fail2ban …
      Pour PMA, il est vrai que le déplacer/renommer/protéger est une bonne idée :) Perso, je l’ai juste changer de dossier, et pour le moment, rares sont les robots qui scannent au bon endroit !!

  5. Merci pour l’article,

    J’ai mis en place les règles sur mon serveur mais en testant avec fail2ban-regex j’obtiens le message suivant :

    Unable to compile regular expression
    ‘[[]client []] File does not exist: .*(PMA|phpmyadmin|myadmin|mysql|mysqladmin|sqladmin|’

    J’ai pourtant vérifié plusieurs fois la syntaxe, refait un copier coller pour être sur… rien n’y fait

    une idée de la raison ?

    • Salut,

      Hum c’est étrange comme retour de commande … tu es vraiment sûr d’avoir récupérer correctement la regex que je décris dans le billet ou de faire le test en appelant les bons répertoires ?

      On dirait une erreur de syntaxe dans la regex suite à l’exécution de Fail2ban, mais avec un message d’erreur un peu différent. Je suis pourtant sûr de mon filtre car je l’utilise sur plusieurs serveurs en production et je t’assure qu’il fonctionne.

      Vérifies qu’il n’y ait pas d’espace (ou autres caractères) en trop car les expressions régulières sont souvent capricieuses ^^

      Tiens moi informé et bon débugage :)

  6. J’ai effectivement pensé à une faute de syntaxe mais j’ai retrouvé celle ci à l’identique sur plein de sites, l’erreur venait donc de moi…
    Je me demande si la raison n’est pas une version de Fail2ban un peu spéciale sur mon hébergement.

    Par contre j’ai trouvé comment la corriger en ajoutant dedans.
    Je n’ai pas la syntaxe exacte (je ne peux pas vérifier sur le serveur pour l’instant) mais ça a suffit !

    On a vite fait de passer des heures là dessus… :)

    • Cool si tu as pu résoudre ton problème :)
      Par contre, si tu as accès à ton serveur, je veux bien que tu me décrives les modifications que tu as réalisé sur la regex pour résoudre ce problème (ça peut toujours être utile).
      Sinon, je suis bien d’accord avec toi, on a vite fait de passer pas mal d’heures sur ce genre d’erreurs qui souvent (et c’est le pire) se règlent très simplement …

  7. [[]client []] File does not exist: .*(PMA|phpmyadmin|myadmin|mysql|mysqladmin|sqladmin|mypma|admin|xampp
    |mysqldb|mydb|db|pmadb|phpmyadmin1|myadmin2)

    J’ai juste ajouté .
    Bon le ‘juste’ peut donner à penser que ce fut rapide mais j’ai galéré un moment à comparer les différentes chaines trouvées et essayer de bien comprendre comment ça marchait :)

    Par contre j’ai un autre soucis : en testant ça marche bien, après trois essais de connection à une page inexistante type mysql l’ip est bien bannie. (je teste depuis mon smartphone en 3g)
    Du moins en apparence : je reçois un mail me signalant le ban mais je continue a avoir accès au site… :(

    • Merci d’avoir pris le temps de détailler un peu plus ta solution ;)
      Après avoir reçu le mail tu es sûr que via la 3G tu n’as pas changé d’IP, car je viens de faire le test depuis ma connexion ADSL en me faisant bannir par le filtre de PhpMyAdmin et je peux t’assurer que je n’accède plus du tout au serveur.
      Donc soit tu as changé d’adresse IP entre temps, soit il y a un problème dans la configuration de ton Fail2ban … Tu as quoi comme valeur de bantime par exemple ?

  8. Oui je suis bien sur d’être en 3G quand je teste la manip. Par contre je soupçonne effectivement le bannissement de ne pas fonctionner.
    Je ne sais pas trop comment ça fonctionne avec la 3G mais je ne crois pas que l’IP change aussi rapidement,
    J’ai mis le bantime à 604800 soit 7 jours…
    fail2ban-client status apache-phpmyadmin m’affiche bien l’ip bannie

    J’ai du zapper quelque chose quelque part…

  9. Oups, en y regardant de plus près je viens de voir qu’il y a DEUX expression sur cette page : la tienne, où il y a bien le et une autre dans les commentaires. C’est celle là que j’utilisais et qui plantait. Et ma correction ne fait que revenir à la tienne ! :)

    • Ah … ok, du coup j’imagine que Fail2ban bloque bien l’accès au site pour ton IP une fois bannie ?
      Ça me semblait bizarre tout de même car la configuration que j’ai mise en place sur mon serveur est exactement identique à celle détaillée dans mon billet, et je n’avais pas rencontré de problème de ce genre :)
      Au final tout est fonctionnel sur ton serveur ?

  10. Oui merci, au final ça marche, je suppose que j’avais oublié un détail.
    Je sais qu’une fois mon téléphone était repassé en wifi donc sur mon IP ‘non bannissable’… j’ai mis un moment à m’en rendre compte !
    Là ça fonctionne. J’ai trois IP Sfr bannies et depuis deux jours s’y sont ajoutées une douzaine d’autres donc le possesseur d’un serveur ovh que j’ai pu prévenir.

    Donc au final tout fonctionne.
    Je me suis posé un moment la question de l’intérêt de bannir des IP après qu’elles aient fait le tour des potentielles vulnérabilités du serveur. Mais en fouillant dans les vieux logs j’ai vu que certaines revenaient périodiquement. Ce serait d’ailleurs utile de mutualiser ce genre d’infos :)

    • Si Fail2ban fonctionne, c’est cool, car c’est bien pratique !! La plupart des IP bannies sont en général des bots qui scannent les sites web automatiquement à la recherche de failles qui pourraient être exploitées …
      De mon côté, je pense que je vais améliorer un peu le filtre PhpMyAdmin pour faire en sorte qu’il prenne aussi en compte l’analyseur de logs « Awstats » car j’ai une IP qui cherche régulièrement une faille sur mon serveur alors que je n’utilise pas ce type d’outil.
      Je mettrais le billet à jour une fois que j’aurais modifier la regex pour partager l’astuce avec tout le monde :)

  11. Pingback : Fail2ban – Bloquer les requêtes Apache ^null$ | Sublimigeek | Geek, Astuces, High Tech et découvertes du Net

  12. Bonjour,
    tout d’abord merci pour votre tuto qui est super, ensuite j’aurais besoin d’aide (j’ai vu les dates et le tuto date de 2011 j’espere quand que quelqu’un verra mon comm et pourra m’aider ^^) pour créer une prison pour mon serveur de torrent transmission-daemon, première sous question où son stocké les tentatives d’authentification de l’interface web?? (j’ai cherché sur le web sans résultat (j’ai du mal cherché xD)) comment créer le filtre enfin le fichier .conf pas le créer mais le remplir =) ? et ensuite dans le fichier jail, l’option filter on doit mettre quoi, le nom du fichier? nom du processus? ou autre chose??

    merci d’avance pour m’avoir lu et répondu si réponse j’ai =)
    CDL

    • Salut Maelios,

      Alors pour commencer, ne t’inquiètes pas, même si le billet a été rédigé en 2011, je réponds toujours aux internautes qui prennent la peine de me contacter :)
      Certes, avec un peu de retard, car la vie IRL est parfois prenante, mais je te réponds !

      Alors pour commencer, je pense qu’il faut que tu comprennes un peu plus le fonctionnement des Jails sous Fail2ban.
      J’ai écrit un article qui pourrait t’aider je pense : http://www.sublimigeek.fr/fail2ban-bloquer-requetes-apache-null
      C’est une règle que j’ai créé moi même et j’y décris étape par étape comment je l’ai construite. Je pense que tu pourrais utiliser cela comme modèle pour développer la tienne.

      Pour les logs de Transmission, là tout de suite, je t’avouerai que je ne sais pas où les trouver, mais je pourrais regarder cela ce soir si tu les cherches toujours :)

      N’hésites pas à repasser par ici si tu as besoin de moi, j’essaierai d’être plus réactif huhu !

      @+

  13. Bonsoir,

    Merci pour votre réponse, et oui je suis toujours à la recherche des logs =) et remercie pour le lien vers ton autre billet qui est bien fais ^^.

    cdl,

    • Salut Maelios,

      J’ai regardé rapidement sur une de mes machines où Transmission-gtk est installé et j’avoue que pour le moment je n’ai pas trouvé de trace de logs.
      Du coup, ça va être compliqué d’écrire une règle Fail2ban ^^

      Je continue à chercher et je reviens vers toi si je trouve quelque chose :)

  14. Hello

    Joli tuto, clair et assez précis sur le sujet

    J’aurais une question….

    J’utilise un serveur qui me sert de FIREWALL avec 2 cartes réseaux…

    ETH0 pour le net, et ETH1 pour mon LAN… je voudrais que tout ce qui se connecte depuis mon LAN ne soit pas listé ou bloqué… comment faire?

    Merci d’avance

    KnArF

    • Salut KnArF,

      Merci pour le compliment sur le tuto ^^
      Concernant ta question, je pense qu’il va falloir que tu joues avec IPtables directement et non pas Fail2ban.

      Pour le coup, il va falloir que tu autorises tous les types de paquets qui traversent ton interface eth1 en particulier.

      Vérifies un peu la syntaxe mais des commandes de ce type devraient faire l’affaire :
      iptables -I INPUT 1 -i eth1 -j ACCEPT
      iptables -I OUPUT 1 -i eth1 -j ACCEPT

      Je ne sais pas si tu es à l’aise avec IPtables, mais si tu pars sur ce genre de solution, penses à regarder sur le net comment on fait pour prendre en compte les règles IPtables au démarrage de ta machine. Sinon elles seront perdues et tu devrais les re-paramétrer à la main ^^
      Idem, pour tester tes règles avant de les appliquer, utilises la commande suivante « iptables-apply » cela te permettra de ne pas couper ta connexion en cas de mauvaise manipulation ^^

      N’hésites pas à repasser pour me dire si tu as réussi à faire ce que tu voulais car à 2 cerveaux on réfléchit mieux ;)

  15. Pingback : Protéger vos services auto-hébergés avec Fail2ban | Sublimigeek | Geek, Astuces, High Tech et découvertes du Net

  16. Pingback : Mauvais format de date dans les notifications Fail2ban | Sublimigeek | Geek, Astuces, High Tech et découvertes du Net

  17. Bonjour Joël,

    Avant toutes choses, merci beaucoup pour cette article très clair & très précis, ça m’a fait gagner énormément de temps dans la configuration de Fail2ban, cela dit, il me vient une question (je viens d’arriver à la fin de l’article), ton dernier paragraphe  » Petite astuce en cas de pépin ou comment se débannir de Fail2ban  » bien qu’utile pourrait se résumer à une simple modification dans le ficher  » jail.conf  » à la ligne  » ignoreip  » & en y ajoutant ton ip histoire de ne pas être embêter par Fail2ban.

    Bloque & ligne à modifier :

    [DEFAULT]
    ignoreip = 127.0.0.1 0.0.0.0 …ect

    Voila, je voulais apporter ma petite contribution à ton blog bien utile, encore merci à toi ^^

    • Hello Spyneur,

      C’est une excellente remarque, j’ai d’ailleurs pris le temps de modifier l’article et pour y intégrer ta contribution :)
      Merci pour tes retours positifs et merci d’avoir pris le temps de partager cette astuce sur le blog, cela aidera forcément les prochains visiteurs et ça c’est une bonne chose !!

      Si tu as d’autres remarques/retours à faire, n’hésites pas !

      @+ et joyeuses fêtes si tu ne repasses pas par ici entre temps !

  18. Bonjour et merci pour votre tutoriel sur Fail2ban.

    Je cherche à écrire le filtre suivant mais je pense que la regex est mal formée.
    Je suppose que je dois échapper les points, au niveau de l’adresse IP ?
    J’aurais du n’utiliser que du texte pour nommer le répertoire pour simplifier la configuration.
    [Definition]
    failregex = [[]client []] client denied by server configuration: /var/www/123.44.555.666/.*
    ignoreregex=

    Voilà également mes notes actuelles sur Fail2ban :
    https://wiki.visionduweb.fr/index.php?title=Installer_et_utiliser_Fail2ban

    • Hello,
      En relisant cet article, je me rends compte que celui-ci n’est plus à jour et que certains filtres ne sont même plus compatibles avec les dernières versions de Fail2Ban qui ont été publiées …
      Je crois que j’ai un peu de boulot pour le coup =)
      Merci pour ton retour positif en tout cas !
      Joel

N'hésitez pas, laissez un commentaire — DoFollow activé sur ce site —


« »