Partager les bannissements de fail2ban au sein d'un cluster

securité serveur fail2ban cluster

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

  1. On installe le paquet deb correspondant au service

    sudo apt install nfs-kernel-server
  2. 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
  3. 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
  4. 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
  5. On (re)démarre le service

    sudo systemctl restart nfs-server.service
  6. 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

  1. Création et définition du point de montage

    sudo mkdir -p /var/log/fail2ban
  2. 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
  3. Rafraîchissement de systemd et montage du partage NFS

    sudo systemctl daemon-reload
    sudo mount /var/log/fail2ban
  4. 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

  1. 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/

  2. 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
  3. 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
  4. 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.

Article précédent