Cet article explique comment mutualiser simplement les bannissements entre les noeuds d'un cluster afin de bannir préventivement les tentatives d'attaque sur le service SSH.
On va maintenant mutualiser les bannissements entre les noeuds de notre cluster, comme ça le premier noeud qui détecte une tentative d'intrusion et bannit une adresse IP, vaccinera automatiquemt les autres.

Sur mon cluster Kubernetes, les noeuds sont accessibles via ssh, ce qui en fait des cibles de choix pour les relous. On va mettre en place un partage de renseignements entre les services fail2ban.
Mon cluster Kubernetes est composé de trois noeuds raspberry pi faisant tourner k3s et ont donc le client NFS déjà installé:
- taranis
- epona
- teutates
Bien évidemment ces trois noeuds peuvent résoudre le nom des deux autres (court et pleinement qualifié avec le domaine), c'est un prérequis pour l'environnement Kubernetes.
Installation du serveur NFS
-
On installe le paquet deb correspondant au service
sudo apt install nfs-kernel-server -
On créé un répertoire qui sera partagé. Alors oui l'emplacement est inhabituel pour un partage NFS mais je trouve que c'est vraiment l'emplacement idéal.
sudo mkdir -p /var/log/fail2ban sudo chmod 0755 /var/log/fail2ban -
On créé les fichiers de log afin qu'ils aient directement les bons droits
sudo touch /var/log/fail2ban/fail2ban-{taranis,epona,teutates}.log sudo chown root:adm /var/log/fail2ban/fail2ban-*.log sudo chmod 0640 /var/log/fail2ban/fail2ban-*.log -
On configure notre service NFS en ajoutant une ligne au fichier
/etc/exportsecho '/var/log/fail2ban epona(rw,sync,no_subtree_check,no_root_squash) teutates(rw,sync,no_subtree_check,no_root_squash)' | sudo tee -a /etc/exports -
On (re)démarre le service
sudo systemctl restart nfs-server.service -
Le serveur NFS va gérer l'intégralité de la rotation des fichiers de log fail2ban, on modifie la configuration de logrotate en conséquence
sed -i -e '/^\/var\/log\/fail2ban.log/s;fail2ban;fail2ban\/fail2ban*;' /etc/logrotate.d/fail2ban
Installation des clients NFS
-
Création et définition du point de montage
sudo mkdir -p /var/log/fail2ban -
Configuration du montage automatique au démarrage
echo 'taranis:/var/log/fail2ban /var/log/fail2ban nfs defaults,noatime,_netdev,sync 0 0' | sudo tee /etc/fstab -
Rafraîchissement de systemd et montage du partage NFS
sudo systemctl daemon-reload sudo mount /var/log/fail2ban -
Le client NFS ne gère plus le logrotate des fichiers de log fail2ban, on supprime sa configuration
sudo rm -f /etc/logrotate.d/fail2ban
Modification du service fail2ban
Cette modification concerne tous les noeuds du cluster
-
Modification du chemin du fichier de log dans le fichier
/etc/fail2ban/fail2ban.confsudo sed -i -e "/^logtarget/s;=.*;= /var/log/fail2ban/fail2ban-$(hostname -s).log;" /etc/fail2ban/fail2ban.confJe n'ai pas réussi à surcharger ce paramètre dans un fichier placé dans
/etc/fail2ban/fail2ban.d/ -
Configuration d'un filtre fail2ban permettant d'analyser les fichiers de log produit par fail2ban himself dans le fichier
/etc/fail2ban/filter.d/sshd-shared.confcat << 'EOF' | sudo tee /etc/fail2ban/filter.d/sshd-shared.conf [INCLUDES] # Read common prefixes. If any customizations available -- read them from # apache-common.local before = fail2ban-common.conf [Definition] failregex = .* Ban <HOST> ignoreregex = EOF -
Configuration de la prison fail2ban associée à notre filtre d'analyse des fichiers de log produit par fail2ban
cat << 'EOF' | sudo tee /etc/fail2ban/jail.d/sshd-shared.conf [sshd-shared] enabled = true port = 22 maxretry = 1 bantime = 168h findtime = 1d logpath = /var/log/fail2ban/fail2ban-taranis.log /var/log/fail2ban/fail2ban-epona.log /var/log/fail2ban/fail2ban-teutates.log backend = polling EOF -
Redémarrage du service fail2ban
sudo systemctl restart fail2banLe bannissement d'une adresse sur un hôte du cluster entraine maintenant automatiquement le bannissement sur les autres noeuds.