Menu Fermer

Configurer fail2ban avec Cloudflare sur Nginx pour protéger des attaques DoS et bruteforce

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.

Configurer fail2ban avec Cloudflare sur Nginx pour protéger des attaques DoS et bruteforce

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).

Schéma CDN CloudFlare

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.

Schéma fonctionnement WAF

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

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

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

  3. Relancer Nginx

    Ensuite relancez le serveur Nginx :
    /etc/init.d/nginx restart
    ou avec systemctl :
    systemctl nginx restart

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

    Configurer fail2ban avec Cloudflare sur Nginx

  5. Mettre ensuite en place fail2ban

    Mettre en place fail2ban en activant les filtres nginx souhaités.
    Suivez alors le guide du site :


  6. 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.

  7. 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 fail2ban avec Cloudflare sur Nginx

  8. 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

  9. Redémarrer le service fail2ban

    Voila tout est configuré maintenant du côté de fail2ban.
    Il faut relancer ce dernier.

    systemctl fail2ban restart

Bravo ! vous avez réussi à configurer fail2ban pour envoyer les IP à bannir et blacklister sur Cloudflare lors d’attaques sur votre serveur WEB nginx.

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