Bannir les IP avec Fail2ban, comment ça marche chez Cloudflare
Sommaire
I. Présentation
Pour ceux qui se servent de Cloudflare comme proxy, voici comment on peut configurer Fail2ban pour bannir automatiquement les IP attaquantes de son serveur.
- Créer un fichier d’action spécifique pour Cloudflare
- Régler ses "jails" pour envoyer les bans à Cloudflare
Le problème quand on a un site Internet qui propose des services, c’est de devoir souffrir des sollicitations de ses confrères, en plus d’un assez grand nombre d’attaques sur un petit blog WordPress en apparence inactif. Cela ne correspond évidemment pas à la réalité, le nombre de personnes qui ne demandent qu’à obtenir plus de commentaires sur leur blog ou amorcer la réaction d’autant d’internautes sur leur propre site est évidemment proche de 100%. Mais cela ne me laisse guère de temps pour enrichir le mien…
II. Créer un fichier d’action spécifique pour Cloudflare :
Fail2ban me permet désormais de monitorer en grande partie des accès, à distance sur le protocole HTTP, ce qui se révèle essentiel lorsqu’on a une activité sur le Web. De base, les "jails" en rapport avec le serveur Apache sont désactivées, ce qui ne me gêne pas personnellement, puisque j’utilise NginX. De même, les requêtes sur mon blog passent par CloudFlare, et ce n’est pas prévu dans le programme… La première étape passe donc par la mise en œuvre d’une action spécifique pour avertir Cloudflare d’une IP à bannir, et de l’activer dans une nouvelle "jail". J’ai trouvé sur Internet un fichier d’action qui va bien et je l’ai recopié dans action.d :
# Author: Mike Rushton # Referenced from from http://www.normyee.net/blog/2012/02/02/adding-cloudflare-support-to-fail2ban by NORM YEE # To get your Cloudflare API key: https://www.cloudflare.com/my-account [Definition] actionstart = actionstop = actioncheck = actionban = curl https://www.cloudflare.com/api_json.html -d 'a=ban' -d 'tkn=< cftoken >' -d 'email=< cfuser >' -d 'key=< ip >' actionunban = curl https://www.cloudflare.com/api_json.html -d 'a=nul' -d 'tkn=< cftoken >' -d 'email=< cfuser >' -d 'key=< ip >' [Init] # Default Cloudflare API token cftoken = VOTRE CLÉ API CLOUDFLARE # Default Cloudflare username cfuser = L'ADRESSE EMAIL DE VOTRE COMPTE CLOUDFLARE
Pour voir (ou revoir) comment marche le logiciel, l’installer correctement et le configurer, n’hésitez pas à consulter, voire même ouvrir les Premiers pas avec Fail2ban dans une nouvelle fenêtre, car c’est un prérequis… Les actions supplémentaires comme celle-ci doivent ensuite être formulées au programme de Fail2ban dans jail.local (ou jail.conf si vous avez écrit vos règles par-dessus les "jails" d’origine). Comme vous l’avez remarqué, les requêtes envoyées à Cloudflare le sont par le biais de cURL, et il faut que ce programme soit installé au préalable sur votre serveur… À chaque fois qu’une IP est contrôlée positive dans le filtre, Fail2ban envoie avec cURL une requête qui prend 4 paramètres :
1. L’action à entreprendre : ban, wl (whitelist), nul (unban) ;
2. L’IP à traiter ;
3. Votre clé API Cloudflare ;
4. L’email dont vous vous servez pour vous connecter à votre compte.
III. Régler ses "jails" pour envoyer les bans à Cloudflare :
Maintenant, on va créer des "jails" spécifiques à partir du format de celles qui nous sont présentées par défaut dans jail.conf :
[apache-noscript] enabled = false port = http,https filter = apache-noscript logpath = /var/log/apache*/*error.log maxretry = 6 [fail2ban-filter] enabled = true port = http filter = fail2ban-filter action = cloudflare-action[name=fail2ban-filter, port="http", protocol="tcp"] sendmail-whois-lines[name=fail2ban-filter, dest="[email protected]", logpath="/var/log/apache*/example.error.log"] logpath = /var/log/apache*/example.error.log maxretry = 3 bantime = 2419200
On voit en comparant les règles 1 et 2 que j’ai nommées fail2ban-filter que l’appel à Cloudflare nécessite une instruction spécifique pour l’action, car elle est différente de celle qui est proposée par défaut, au début du fichier. Dans l’exemple que je donne, j’ai en plus superposé plusieurs actions, qui sont exécutées les unes à la suite des autres. Dans mon cas :
1. Un appel à l’action chez Cloudflare
2. Un envoi de courrier électronique.
Les différentes actions sont libellées séparément avec un retour chariot et une tabulation (pour faire joli). L’action à faire passer chez Cloudflare est caractérisée par le nom du fichier d’action spécifique à Cloudflare, qui va référencer le nom du filtre, et éventuellement d’autres informations, telles que le port et le protocole. Rien de très différent en somme, par rapport à d’autres actions à effectuer, mais de façon différente de celles qui le sont par défaut. Ainsi, l’envoi de courrier électronique référence aussi le filtre, le destinataire et le journal (d’erreur ou d’accès) que considère le filtre en question. Chez Cloudflare, les bans sont interceptés grâce aux requêtes en cURL de votre serveur, de la façon suivante :
input: curl https://www.cloudflare.com/api_json.html \ -d 'a=wl' \ -d 'tkn=8afbe6dea02407989af4dd4c97bb6e25' \ -d '[email protected]' \ -d 'key=0.0.0.0' \ output: { "response": { "result": { "ip": "[IP]", "action": "WL" } }, "result": "success", "msg": null }
On termine en rechargeant la configuration de Fail2ban :
service fail2ban reload
Pour conclure avec une image et abréger le discours, voici celle que vous aurez la satisfaction d’observer sur le panneau "Thread Control" de votre compte Cloudflare, avec la liste des IP attaquantes qui ont été bannies, de manière complètement automatique, et sans plus d’intervention de la part de l’administrateur du serveur…
Quand le délai du ban arrive à terme, un autre appel sera effectué par Fail2ban à Cloudflare, pour lui demander de déréférencer l’IP concernée par le ban. Fail2ban est un logiciel réellement intéressant quand on pousse la configuration, et on peut même pousser un peu plus loin encore…
À vous d’essayer maintenant !