Sécurisation de son serveur : fail2ban

I. Installation

Mon serveur tourne avec une Debian Lenny. Fail2ban est déjà dans les dépôts officiels, un simple apt-get install sera suffisant :

apt-get install fail2ban

II. Configuration

Toute la configuration se passe dans le répertoire /etc/fail2ban/.

Le fichier fail2ban.conf défini le niveau de verbosité de logs ainsi que le fichier de log utilisé. Par défaut, /var/log/fail2ban.log .

Les services à monitorer sont stockés dans le fichier jail.conf. Il est recommandé d’en effectuer une copie nommée jail.local qui sera automatiquement utilisée à la place du fichier d’origine.

cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

J’ai modifié l’en-tête de ce fichier jail.local :

[DEFAULT]

"ignoreip" les adresses IP qui seront ignorées par fail2ban

ignoreip = 127.0.0.1

3600 secondes = 1 heure de banissement

bantime = 3600

Le laps de temps pendant lequel les tentatives vont être possibles

findtime = 600

Le nombre d’essais maximum avant bannissement

maxretry = 3

Les jails sont les "actions/logs/chaines" à surveiller. Par exemple, le jail [ssh] :

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

    • enabled * est là pour activer le jail (ou le désactiver s’il est positionné à false)
      • port * du service. Si vous avez décidé d’ouvrir ssh sur un autre port, remplacez le mot ssh par le numéro du port
      • filter * est le nom du filtre utilisé pour ce jail (les filtres se trouvent dans le répertoire filter.d) = sshd.conf dans notre exemple
      • logpath * est le fichier de log qui doit être analysé
      • maxretry * est le nombre d’essais autorisés (écrase la valeur positionnée à 3 ci-dessus)
        Pour redémarrer :
        fail2ban-client reload

    Pour voir la conf actuelle :
    fail2ban-client status
    iptables -L -v

    Voici les services que j’ai activé :
    [email protected] :/etc/fail2ban# fail2ban-client status
    Status
    |- Number of jail: 8
    `- Jail list: apache-w00tw00t, apache-noscript, ssh-ddos, apache-multiport, apache-overflows, ssh, apache, apache-phpmyadmin

    Note : Lors du redémarrage de la machine, il se peut que fail2ban ne charge pas toutes les iptables (voir erreurs dans fichier de log fail2ban). Dans ce cas, il faut recharger le fail2ban-client ou bien ajouter une commande sleep dans les jails ().

    III. Mes jails perso

    apache-wOOtwOOt

    Ce jail est là pour bannir les requêtes DFind w00tw00t.
    Dans le fichier /etc/fail2ban/jail.local tout en bas, j’ajoute :

    Mes jails

    [apache-w00tw00t]
    enabled = true
    filter = apache-w00tw00t
    action = iptables[name=Apache-w00tw00t,port=80,protocol=tcp]
    logpath = /var/log/apache2/access*.log
    maxretry = 1

    On notera que contrairement aux autres règles, celle-ci s’attaque au fichier de log des accès (/var/log/apache2/access*.log).

    Voici le fichier de règles /etc/fail2ban/filter.d/apache-w00tw00t.conf

    [Definition]
    failregex = ^ -."GET /w00tw00t.at.ISC.SANS.DFind:).".*
    ignoreregex =

    On teste maintenant si la règle s’applique bien en faisant :

    fail2ban-regex /var/log/apache2/access.log /etc/fail2ban/filter.d/apache-w00tw00t.conf

    Puis on recharge l’application

    fail2ban-client reload

    apache-phpmyadmin

    Pour bannir les requêtes du style :

  • [Mon Dec 27 06:22:13 2010] [error] [client 67.212.67.6] File does not exist: /home/www/phpmyadmin
    [Mon Dec 27 06:22:13 2010] [error] [client 67.212.67.6] File does not exist: /home/www/phpMyAdmin
    [Mon Dec 27 06:22:13 2010] [error] [client 67.212.67.6] File does not exist: /home/www/PHPmyadmin
    [Mon Dec 27 06:22:14 2010] [error] [client 67.212.67.6] File does not exist: /home/www/sqldmin
    [Mon Dec 27 06:22:14 2010] [error] [client 67.212.67.6] File does not exist: /home/www/admin
    [Mon Dec 27 06:22:14 2010] [error] [client 67.212.67.6] File does not exist: /home/www/scripts *

    Je créé le fichier /etc/fail2ban/filter.d/apache-phpmyadmin.conf

    Fail2Ban configuration file

    Bans bots scanning for non-existing phpMyAdmin installations on your webhost.

    [Definition]
    docroot = /home/www
    badadmin = PMA|phpmyadmin|myadmin|mysql|mysqladmin|sqladmin|mypma|admin|xampp|mysqldb|mydb|db|pmadb|phpmyadmin1|phpmyadmin2|webdb|sqlmanager|sqlweb|websql
    failregex = [[]client []] File does not exist: %(docroot)s/(?:%(badadmin)s)
    ignoreregex =

    Puis j’édite le fichier /etc/fail2ban/jail.local

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

    VI. Conclusion

    Si vous avez mis en place fail2ban et que vous avez des jails perso supplémentaires à partager, n’hésitez pas à m’en faire part, je les ajouterai à cet article. Merci par avance 🙂