Fail2ban est un utilitaire qui permet de sécuriser son serveur contre les attaques DoS.
Il analyse les logs et journaux systèmes et applications pour protéger des attaques visant des serveurs WEB, Mail, SSH, etc.
Sur un serveur WEB avec Nginx se trouvant derrière le CDN Cloudflare, on peut l’utiliser pour bloquer les IP en les envoyant dans la liste noire de Cloudflare.
Cela se fait à travers les API mis à disposition sur Cloudflare.
Ainsi, vous pouvez bloquer automatiquement les adresses IP des attaquants par l’infrastructure Cloudflare.
Cet article vous guide pour configurer fail2ban pour bannir et blacklister les adresses IP attaquantes avec Cloudflare sur un serveur nginx.
Table des matières
Configurer fail2ban avec Cloudflare sur Nginx pour protéger des attaques DoS et bruteforce
Introduction
Votre serveur WEB avec Nginx est derrière le proxy-reverse Cloudflare.
Ainsi il ne communique jamais directement avec le client WEB mais seulement avec les serveurs Cloudflare qui font tampon.
C’est le principe du Content Delivery (CDN).
Ainsi selon la configuration de Nginx, ce dernier n’affiche pas ou ne traite pas les adresses IP réels des clients mais celles de Cloudflare.
Ce qui peut poser parfois des problèmes si vous mettez en place des sécurités ou dans les journaux du serveur WEB.
Pour pouvoir utiliser fail2ban sur Nginx derrière l’infrastructure Cloudflare, il faut configurer ce dernier pour traiter les IP réelles correctement.
Pour cela, Cloudflare fournit dans les en-têtes HTTP des informations sur le client via des champs CF-.
Une fois en place, fail2ban peut ensuite de traiter les adresses IP normalement dans les logs.
Je rappelle qu’il existe ce tutoriel qui vous guide sur la mise en place et installation de fail2ban :
Configurer Nginx avec Cloudflare et fail2ban
Temps nécessaire : 15 minutes
Configurer fail2ban avec Cloudflare sur Nginx
- Configurer Nginx avec Cloudflare
La première chose à faire est de configurer nginx pour indiquer les IP de Cloudflare comme IP réelle.
Pour cela, dans la section http de /etc/nginx/nginx.conf, ajoutez ceci :set_real_ip_from 103.21.244.0/22;
set_real_ip_from 103.22.200.0/22;
set_real_ip_from 103.31.4.0/22;
set_real_ip_from 104.16.0.0/12;
set_real_ip_from 108.162.192.0/18;
set_real_ip_from 141.101.64.0/18;
set_real_ip_from 162.158.0.0/15;
set_real_ip_from 172.64.0.0/13;
set_real_ip_from 173.245.48.0/20;
set_real_ip_from 188.114.96.0/20;
set_real_ip_from 190.93.240.0/20;
set_real_ip_from 197.234.240.0/22;
set_real_ip_from 198.41.128.0/17;
set_real_ip_from 199.27.128.0/21;
set_real_ip_from 2400:cb00::/32;
set_real_ip_from 2606:4700::/32;
set_real_ip_from 2803:f800::/32;
set_real_ip_from 2405:b500::/32;
set_real_ip_from 2405:8100::/32;
real_ip_header CF-Connecting-IP;
C’est cette dernière qui indique d’utiliser les IP fournit par Cloudflare dans l’en-tête via CF-Connecting-IP. - Configurer des limites de taux sur nginx
Ensuite en option, configurez Nginx pour bloquer les requêtes HTTP selon une limite de taux.
fail2ban pourra ensuite bloquer les IP qui dépassent les limites de requêtes par secondes.
L’article suivant vous guide pour cela. - Relancer Nginx
Ensuite relancez le serveur Nginx :
/etc/init.d/nginx restart
ou avec systemctl :systemctl nginx restart
- Vérifiez les journaux nginx
Ensuite vérifiez les journaux nginx, par défaut dans /var/log/nginx/access.log
Il faut bien que les IP réelles des clients apparaissent et non celles de Cloudflare.
Si c’est bien le cas, vous allez pouvoir mettre en place fail2ban. - Mettre ensuite en place fail2ban
Mettre en place fail2ban en activant les filtres nginx souhaités.
Suivez alors le guide du site :
- Configurer la prison nginx
Editez la ou les prisons nginx, par défaut dans /etc/fail2ban/jail.d/jail.local
Voici un exemple :[nginx-limit-req]
enabled = true
filter = nginx-limit-req
action = cloudflare
logpath = /home/logs/nginx/error.log
findtime = 600
bantime = 7200
maxretry = 4
ignoreip=66.130.112.0/24 40.112.0.0/13, 40.74.0.0/15, 40.80.0.0/12, 40.124.0.0/16, 40.120.0.0/14, 40.76.0.0/14, 40.125.0.0/17, 40.96.0.0/12
L’action à configurer est cloudflare et non pas une action iptables/ipset.
Le but étant d’appeler les API cloudflare. - Récupérer les jetons des API globaux de Cloudflare
Vous devez récupérer les tokens des API Cloudflare.
Pour cela, connectez-vous à votre compte Cloudflare.
– en haut à droite, cliquez sur votre profil
– puis allez dans l’onglet Jetons API
– Dans Global API Key, cliquez à droite sur Affichage
– Saisissez le mot de passe de votre compte CloudFlare
– Votre clé API s’affiche, notez la - Configurer l’action Clouflare dans fail2ban
Ensuite on configure les jetons API dans l’action Cloudflare afin de pouvoir les appeler avec votre compte Cloudflare.
– Éditez le fichier /etc/fail2ban/action.d/cloudflare.conf
– Tout en bas remplissez :
— cftoken avec le jeton API récupéré précédemment
— cfuser avec l’adresse email de votre compte Cloudflare - Redémarrer le service fail2ban
Voila tout est configuré maintenant du côté de fail2ban.
Il faut relancer ce dernier.systemctl fail2ban restart
Corriger le débanissement sur Debian
Le débanissement du script Cloudflare de Debian ne fonctionne pas.
Lorsque fail2ban tente de débannir une IP, on peut avoir des messages d’erreur de ce type.
2020-11-13 23:48:22,920 fail2ban.utils [10945]: ERROR 7fed38019e30 -- stderr: '/bin/sh: 6: https://api.cloudflare.com/client/v4/user/firewall/access_rules/rules/{: not found'
2020-11-13 23:48:22,920 fail2ban.utils [10945]: ERROR 7fed38019e30 -- returned 127
Pour corriger, éditez le fichier /etc/fail2ban/action.d/cloudflare.conf puis remplacez la commande actionunban par celle-ci :
actionunban = curl -s -o /dev/null -X DELETE -H 'X-Auth-Email: <cfuser>' -H 'X-Auth-Key: <cftoken>' \
https://api.cloudflare.com/client/v4/user/firewall/access_rules/rules/$(curl -s -X GET -H 'X-Auth-Email: <cfuser>' -H 'X-Auth-Key: <cftoken>' \
'https://api.cloudflare.com/client/v4/user/firewall/access_rules/rules?mode=block&configuration_target=ip&configuration_value=<ip>&page=1&per_page=1' | tr -d '\n' | cut -d'"' -f6)
Enfin relancez fail2ban pour prendre en compte la nouvelle configuration.
/etc/init.d/fail2ban restart