J'ai donc fait un tas de recherches sur la façon de le faire après avoir regardé la même adresse IP frapper mon cluster de serveurs Web l'un après l'autre. Étant donné que j'utilise AWS, j'ai pensé qu'il pourrait y avoir un moyen simple et que cela fonctionnerait à merveille au cours de mes deux premiers jours de test de 5 serveurs.
La première chose que je recommande est de désactiver temporairement SELinux, nous nous en occuperons à la fin. Je ne suis pas un expert SELinux mais ce que j'ai fait fonctionne jusqu'à présent.
La principale exigence est une source de fichiers partagée, j'utilise AWS EFS. Une fois le nouveau lecteur provisionné et monté, j'ai changé logtarget dans /etc/fail2ban/fail2ban.conf en un sous-dossier dans le lecteur EFS.
logtarget = /efsmount/fail2ban/server1.log
Ensuite, j'ai écrit un filtre simple et l'ai placé dans /etc/fail2ban/filter.d/fail2ban-log.conf
[Definition]
failregex = .* Ban <HOST>
ignoreregex =
Ajout du filtre à /etc/fail2ban/jail.local
[fail2ban-log]
enabled = true
port = http,https
findtime = 86400 ; 1 day
logpath = /efsmount/fail2ban/server1.log
/efsmount/fail2ban/server2.log
/efsmount/fail2ban/server3.log
/efsmount/fail2ban/server4.log
maxretry = 1
Puis redémarré fail2ban
sudo fail2ban-client reload
Jusqu'ici tout va bien! Non, la partie douloureuse est SELinux. Après avoir laissé fail2ban fonctionner un peu, j'ai exécuté cette commande qui permettrait à fail2ban de passer par les filtres.
sudo grep fail2ban /var/log/audit/audit.log | sudo audit2allow -M fail2ban-nfs
Audit2allow vous dira d'exécuter cette commande
sudo semodule -i fail2ban-nfs.pp
Je vérifie toujours mes journaux SELinux ici et là pour voir s'il y a d'autres refus. Si quelqu'un a une astuce pour obtenir ce SELinux clair avec une autre méthode, ce serait génial.
sudo cat /var/log/audit/audit.log |grep fail2ban |grep denied
À ce stade, je recevais toujours des erreurs lors du redémarrage de fail2ban. Il y a un bogue lors de l'utilisation de action = action_mwl dans jail.local. Après un peu de recherche sur Google, j'ai trouvé cela qui fonctionne jusqu'à présent. D'après ce que j'ai lu, c'est à cause des sauts de ligne dans la directive logpath pointant vers plusieurs fichiers. J'ai essayé avec des virgules, des espaces, etc. rien d'autre ne fonctionnait avec action_mwl.
action_mwm = %(banaction)s[name=%(__name__)s, bantime="%(bantime)s", port="%(port)s", protocol="%(protocol)s", chain="%(chain)s"]
%(mta)s-whois-matches[name=%(__name__)s, dest="%(destemail)s", chain="%(chain)s"]
action = %(action_mwm)s
N'oubliez pas de réactiver SELinux!