En prérequis, il faut installer le plugin loglog qui journalise les connexions des utilisateurs au service Dokuwiki. Pour plus de détail concernant la gestion des plugins de Dokuwiki voir le wiki extensions.
Le fichier de log est créé dans ./data/cache/loglog.log
Ci dessous un extrait du fichier de journalisation produit par Dokuwiki lorsque le module loglog est installé:
1682455440 2023/04/25 20:44 176.143.166.229 user0 failed login attempt 1682456821 2023/04/25 21:07 176.143.166.229 user0 logged in temporarily 1682456825 2023/04/25 21:07 176.143.166.229 user0 admin 1682456829 2023/04/25 21:07 176.143.166.229 user0 admin - config 1682456843 2023/04/25 21:07 176.143.166.229 user0 admin - config ["save config"] 1682456941 2023/04/25 21:09 176.143.166.229 user0 admin - logviewer 1682457224 2023/04/25 21:13 176.143.166.229 user0 logged off
# tester l'expression régulière fail2ban-regex /srv/docker/dokuwiki/userdata/data/cache/loglog.log /etc/fail2ban/filter.d/dokuwiki.local fail2ban-clien reload fail2ban-client get dokuwiki failregex
Lorsque l’application Dokuwiki s'exécute depuis un conteneur Docker, l'action de bannissement par défaut ne fonctionne pas. fail2ban-client indique bien que l'IP est bannie, les règles de filtrages sont mises à jour mais les modifications ont lieu sur la chaîne iptable INPUT ce qui est parfaitement adapté dans le cas d'un fonctionnement classique.
L'application reste accessible car dans le cas de Docker le trafic à destination des conteneurs transite et est filtré par la chaîne FORWARD. Il faut donc modifier la configuration et créer une action agissant sur la chaîne FORWARD.
/etc/fail2ban/jail.d/dokuwiki.local
utilise l'action iptables-multiport
;/etc/fail2ban/action.d/iptables-multiport.conf
on identifie la variable <chain> définie dans le /etc/fail2ban/action.d/iptables-common.conf
Pour que les modifications apportées localement ne soient pas écrasées lors d'une mise à jour du paquet et pour qu'elles s'appliquent en dernier, on crée une copie du fichier que l'on modifie:
cd /etc/fail2ban/action.d/ cp iptables-multiport.conf iptables-docker-multiport.local
Dans ce fichier on redéfinit la variable <chain>
# Redémarer le daemon systemclt restart fail2ban.service # Vérifier l'existance de la chaine f2b-dokuwiki iptables -t filter -S f2b-dokuwiki # La chaine f2b-dokuwiki doit se trouver en début de la chaine FORWARD iptables -t filter -S FORWARD | head -n 5 -P FORWARD DROP -A FORWARD -p tcp -m multiport --dports 80,443 -j f2b-dokuwiki -A FORWARD -j DOCKER-ISOLATION-STAGE-1 -A FORWARD -j DOCKER-USER -A FORWARD -o br-5d3619a40a01 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
Autoriser à nouveau le client:
fail2ban-client set dokuwiki unbanip 92.88.170.111