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é:
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.
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/exports
echo '/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
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
Cette modification concerne tous les noeuds du cluster
Modification du chemin du fichier de log dans le fichier /etc/fail2ban/fail2ban.conf
sudo sed -i -e "/^logtarget/s;=.*;= /var/log/fail2ban/fail2ban-$(hostname -s).log;" /etc/fail2ban/fail2ban.conf
Je 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.conf
cat << '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 fail2ban
Le bannissement d'une adresse sur un hôte du cluster entraine maintenant automatiquement le bannissement sur les autres noeuds.