fail2ban pour protéger son site : ma configuration

Voici comment j’utilise fail2ban pour blacklister toutes les ip qui tentent d’aller sur des scripts php hors spip. Cela permet de bloquer l’exploitation d’une attaque même si une faille a été utilisée : des fichiers peuvent avoir été posés, ils restent inexploitable car toute tentative d’accès block automatiquement l’ip.

Pour l’installation et l’utilisation sur votre serveur linux, la documentation est ici :
https://doc.ubuntu-fr.org/fail2ban

Le principe clé de fail2ban est de vérifier qu’une certaine condition est déclenchée par une adresse IP (exemple : trop de tentatives d’accès à ftp), et de bloquer l’adresse IP concernée pendant un certain temps.

Ma « prison » est configurée comme cela :
fichier /etc/fail2ban/jail.d/site-spip.conf :

[site-spip]
enabled       = true
filter        = site-spip
logpath       = /var/log/nginx/access.log
maxretry      = 0
findtime      = 120
bantime       = 86400
action        = iptables-allports[name=site-spip]
ignoreip      = 127.0.0.1/8 ::1 123.123.123.123 10.12.13.14

Le filtre utilisé est basé sur ce qu’il y a des les logs (donc la requête http) :
fichier /etc/fail2ban/filter.d/nginx-spip.conf :

[Definition]
failregex = ^<HOST> .* "(GET|POST) /(?!(ecrire/)?(index|spip|spip_loader|prive)\.php)[^ ]*\.php
ignoreregex =

Du coup, dès qu’un attaquant va essayer d’accéder à un fichier php hors spip, il est bloqué.

Il ne vous reste plus qu’à regarder avec délectation la prison se remplir sudo fail2ban-client get site-spip banned

Ce n’est pas la protection ultime, mais ça fait 99% du ménage :wink:

2 « J'aime »

Bonsoir,

Je vous mets la version pour apache2.

[Definition]
failregex = (site1|site2|site3|site4)\.domaine1\.net <HOST> - \S+ \[.*\] "(GET|POST) /(?!(ecrire/)?(index|spip|spip_loader|prive)\.php)[^ ]*\.php
    site5.domaine2.net <HOST> - \S+ \[.*\] "(GET|POST) /(?!(ecrire/)?(index|spip|spip_loader|prive)\.php)[^ ]*\.php
    site6.domaine3.net <HOST> - \S+ \[.*\] "(GET|POST) /(?!(ecrire/)?(index|spip|spip_loader|prive)\.php)[^ ]*\.php
ignoreregex = \S+ 127.0.0.1

Attention, il peut y avoir d’autres sites que du Spip sur le serveur, donc il vaut mieux trier par URL et ignorer ce qui provient de localhost.

En prime, je restreins /ecrire au seul réseau local directement dans la configuration d’apache.

<IfModule mod_ssl.c>
    <VirtualHost _default_:443>
        ServerName www.domaine.net
        ServerAdmin webmaster@localhost

        DocumentRoot /var/www/
        <Directory /var/www/>
            Options +FollowSymLinks -Indexes
            AllowOverride All
            Require all granted
        </Directory>

        <Directory /var/www/ecrire>
            Require all denied
            Require ip 192.168.
        </Directory>
...

J’ai un VPN pour accéder au LAN depuis l’extérieur.

Odile.

Tu fais bien de le préciser.
Pour ma part j’ai des domaines séparés pour les sites SPIP et ceux avec d’autres logiciels. Etant donné que ma règle de prison se base sur des logs d’accès spécifiques à un domaine, c’est ce qui me permet de faire la distinction (j’ai un fichier par logpath différent)