Cloudflare : comment protéger Nginx et WordPress des attaques DoS, piratages et bruteforce

Bloqueur de pub détectée - Vous bloquez l'affichage des publicités.
Pour soutenir le site, merci de bien vouloir laisser les publicités s'afficher
Plus d'informations : Comment désactiver les bloqueurs de publicité sur un site internet

Cloudflare est un service payant avec une version gratuite pour sécuriser son serveur WEB.
Il se présente sous la forme d'un Content Delivery (CDN) et offre donc aussi les avantages de ce dernier.
Notamment :

  • Mitigation et protection contre les attaques DoS
  • Pare-feu pour les applications Web (WAF). Ce dernier est assez complet car vous bloquez ou oisez un défi JS ou Captcha sur des adresses IP, ASN. De plus, ils intègrent une liste de blocage de comportements malveillants.
  • Serveur proxy inversé avec cache pour accélérer son site WEB
  • Réseau de distribution de contenu pour être au plus pret de l'internaute et ainsi donner un meilleure temps de réponse

En utilisant Cloudflare vous pouvez donc sécuriser votre serveur WEB Nginx qui délivre par exemple des sites WordPress.

Cet article vous propose d'appliquer quelques configurations à mettre en place sur votre serveur WEB.
La plupart se font à travers le WAF de Cloudflare afin de protéger Nginx et WordPress des attaques par déni de service (DoS) et bruteforce.

Cloudflare : comment protéger Nginx et WordPress des attaques DoS, piratages et bruteforce

Introduction à Cloudflare

Cloudflare est donc une solution de CDN qui se place entre votre serveur WEB et le client.
Il agit en tant que proxy reverse et permet de rendre votre serveur WEB inaccessible aux clients en traitant les demandes WEB en amont.
Lorsqu'une page WEB n'est pas dans le cache Cloudflare, le service la demande à votre serveur Web (backend).

Schéma CDN CloudFlare

Cloudflare propose plusieurs solutions de sécurité dont :

  • Un WAF (Web Application Firewall) qui peut selon des règles bloquer l'accès ou afficher un défi JS ou Captcha. De quoi bloquer facilement les requêtes automatisées et de bots
  • Détecter et bloquer automatiquement des requêtes malveillantes à travers des règles pré-établies
  • Détecter et bloquer des attaques DoS sur votre sites WEB.

Le WAF permet de sécuriser certains accès.
Par exemple, il est très facile de créer une règle de blocage d'adresses IP sur la page d'identification de WordPress.
De quoi donc sécuriser votre sites WEB.

Schéma fonctionnement WAF

Ci-dessous des règles de sécurité du WAF pré-établies pour différents types de sites (PhpBB, Joomla, WordPress, et attaques (LFI, SQLi, etc)

Règles de filtrages du WAF contre les attaques, tentatives de piratages

Comment protéger Nginx et WordPress des attaques DoS et bruteforce avec Cloudflare

Sécuriser Nginx des attaques DoS et bruteforce

Pour commencer, il faut mettre en place certains configurations sur votre serveurs WEB Nginx.
Cela peut aider à contrer ou atténuer des attaques DoS ou Bruteforce.
Pour cela, rendez-vous dans l'article suivant qui est très complet :

Configurer Nginx et mettre en liste blanche les IP Cloudflare

Ensuite il faut configurer les adresses IP Cloudflares sur Nginx.
Cela permet de ne pas les avoir dans les journaux.

Il faut placer ce contenu dans la directive http.

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;

Ensuite relancez nginx

/etc/init.d/nginx restart

Mettre à jour automatiquement les adresses IP Cloudflare dans nginx

Il est tout à fait possible d'automatiser la mise à jour des adresses IP cloudflare dans nginx.
Pour cela, on les stocke dans le fichier de configuration suivant /etc/nginx/cloudflare-ip.conf

Au lieu de mettre la liste précédente directement.

  • Ajoutez l'inclusion suivante dans la directive http de nginx.conf
include /etc/nginx/cloudflare-ip.conf;
  • Ensuite créez le script bash suivant pour alimenter le fichier de configuration. Il télécharge la liste des adresse IPv4 et IPv6 de Cloudflare puis il créé les lignes set_real_ip_from qui vont bien
  • Enfin il relance nginx automatiquement
#!/bin/bash
cloudflare_real_ip_conf='/etc/nginx/cloudflare-ip.conf'

echo "#Cloudflare" > ${cloudflare_real_ip_conf};
for i in `curl -sk https://www.cloudflare.com/ips-v4`; do
        echo "set_real_ip_from $i;" >> ${cloudflare_real_ip_conf};
done
for i in `curl -sk https://www.cloudflare.com/ips-v6`; do
        echo "set_real_ip_from $i;" >> ${cloudflare_real_ip_conf};
done

echo "" >> ${cloudflare_real_ip_conf};
echo "# use any of the following two" >> ${cloudflare_real_ip_conf};
echo "real_ip_header CF-Connecting-IP;" >> ${cloudflare_real_ip_conf};

if [[ ! `/etc/init.d/nginx configtest` =~ "ok" && -n $ip ]]
then
       echo "config OK"
       /etc/init.d/nginx reload
fi

Par exemple, enregistrez-le sous le nom de cloudflare-realip.sh
Puis on le rend exécutable :

chmod +x cloudflare-realip.sh
./cloudflare-realip.sh

On peut alors automatiser cette mise à jour avec la mise en place d'un cron.

Bloquer l'accès au site WEB avec iptables

Votre site WEB se trouve derrière Cloudflare mais votre serveur WEB reste exposé au net, si vous n'en bloquez pas l'accès.
Des scans de ports, bruteforce ou des attaques DoS peuvent être effectués directement sur votre serveur Nginx.
Il faut donc fermer le port 80 (HTTP) et 443 (HTTPs) et n'autoriser que les adresses IP des serveurs Cloudflare.
Ainsi votre serveur WEB ne communiquera qu'avec Cloudflare.

Ce script place les politiques des chaînes iptables en DROP puis il n'ouvre que les ports 80, 443 et 2408 pour les IP de Cloudflare en téléchargeant la liste depuis le site.
Cela permet d'actualiser facilement les règles du pare-feu.

iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

ipset destroy cf4
ipset create cf4 hash:net family inet
for ip in $(curl https://www.cloudflare.com/ips-v4); do ipset add cf4 $ip; done
iptables -A INPUT -m set --match-set cf4 src -p tcp -m multiport --dports 80,443,2408 -j ACCEPT
iptables -A OUTPUT -m set --match-set cf4 dst -p tcp -m multiport --sports 80,443,2408 -j ACCEPT

iptables -A INPUT -m set --match-set cf4 src -p udp -m multiport --dports 443 -j ACCEPT
iptables -A OUTPUT -m set --match-set cf4 dst -p udp -m multiport --sports 443 -j ACCEPT

ip6tables -P INPUT DROP
ip6tables -P OUTPUT DROP
ip6tables -P FORWARD DROP
ipset destroy cf6
ipset create cf6 hash:net family inet6
for ip in `wget -qO- http://www.cloudflare.com/ips-v6`; do ipset add cf6 $ip ; done
ip6tables -A INPUT -m set --match-set cf6 src -p tcp -m multiport --dports 80,443 -j ACCEPT
ip6tables -A OUTPUT -m set --match-set cf6 dst -p tcp -m multiport --sports 80,443 -j ACCEPT

ip6tables -A INPUT -m set --match-set cf6 src -p udp -m multiport --dports 443 -j ACCEPT
ip6tables -A OUTPUT -m set --match-set cf6 dst -p udp -m multiport --sports 443 -j ACCEPT
Attention, la politique DROP bloque tout, donc si vous avez d'autres services réseau notamment SSH, vous devez ajouter des règles IPtables pour l'autoriser.

Par exemple si vous désirez autoriser SSH soit donc port 22 :

iptables -A INPUT -m state --state NEW,ESTABLISHED,RELATED -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT  -m state --state ESTABLISHED,RELATED -p tcp --sport 22 -j ACCEPT

Plus de détails sur iptables :

Pensez que votre hébergeur peut aussi intégrer un firewall réseau.
C'est notamment le cas avec OVH où vous pouvez aussi créer des règles de blocages en amont de votre serveur.

Installer fail2ban pour bloquer les attaques

Ensuite vous pouvez installer fail2ban.
Ce dernier analyse les logs en permanence et peut bannir automatiquement les adresses IP attaquantes à travers le pare-feu.
Il peut donc détecter les attaques en cours et tenter de les atténuer et mitiger.

Cet article suivant vous guide pour installer Fail2ban et vous son fonctionnement :

En outre, il est possible de bloquer et placer les adresses IP attaquantes en liste noire sur Cloudflare.
Là aussi un article complet, vous guide pour mettre cela en place:

Protéger les emplacements sensibles de votre site WEB et WordPress

Une bonne attaque DoS vise les pages WEB qui demandent le plus de ressources WEB comme par exemple un moteur de recherche.
En effet, celle-ci nécessite un traitement PHP et une requête dans la base de données.
Cela peut poser des problèmes de ressources systèmes ou planter le site, si la configuration du nombre de connexion SQL maximales ou worker PHP est atteint.

Il faut donc protéger ces pages sensibles soit avec une limite de taux plus sensibles sur nginx.
Soit par exemple en plaçant un défi JS avec Cloudflare.
La page va mettre un peu plus de temps à charger pour l'utilisateur final mais cela protège des requêtes automatisées.

Protéger les emplacements sensibles de votre site WEB
Cloudflare propose aussi un mécanisme de protection et limite de taux mais elle est payante. On la trouve dans le menu Pare-feu > Outils.

Protéger WordPress avec le WAF de Cloudflare

Le WAF de Cloudflare vous permet de créer des règles de sécurité pour protéger votre sites Web WordPress et Nginx.

Pour créer une règle :

  • Rendez-vous dans l'onglet pare-feu
  • Puis créer une règle de pare-feu
Protéger WordPress avec le WAF de Cloudflare
  • Ensuite on remplit les données de la règle avec :
    • champs : c'est le contenu de la requête HTTP. Par exemple, l'adresse IP ou l'ASN source, l'URL
    • Opérateur : dans, contient, etc
    • Valeur : ce que vous voulez viser
    • Puis l'action : autoriser, bloquer, défi JS ou captcha

Enfin les règles prennent en comptes les opérateurs et / ou.

Protéger WordPress avec le WAF de Cloudflare

Mettre votre adresse IP en liste blanche

Placez votre adresse IP en liste blanche permet de ne pas appliquer les règles de blocage à celle-ci.

Vous avez ici plusieurs choix dans l'ordre de sécurité décroissante:

  • Ajoutez votre adresse IP exacte à la liste blanche. Choix optimal si votre FAI vous accorde une adresse IP statique. Notez que si votre adresse IP change, vous devrez la saisir de nouveau pour ne pas être exclu de votre zone d'administration WordPress.
  • Ajoutez toute la plage d'adresses IP de votre FAI à la liste blanche. Bon choix si vous avez une adresse IP dynamique.
  • Ajoutez votre pays à la liste blanche. Cela ne vous protégera pas des attaques provenant de l'intérieur de votre propre pays, mais cela peut être une option pratique si vous voyagez fréquemment et utilisez le Wi-Fi pour vous connecter à votre site WordPress. Une adresse IP ou un pays figurant sur la liste blanche de cette manière sera exempté de toutes les règles de pare-feu, vous n'aurez donc pas besoin d'ajouter des exceptions pour chaque règle individuelle.

Pour ce faire, vous pouvez vous rendre dans le menu pare-feu > Outils de l'interface Cloudflare.
De là, il suffit de saisir l'adresse IP et de choisir Autoriser sur tous les sites WEB.

Mettre votre adresse IP en liste blanche sur Cloudflare

Ou créer une règle de pare-feu :

  • Champ: Adresse IP
  • Opérateur: est égal à
  • valeur: votre adresse IP
  • Action : Autoriser
Mettre votre adresse IP en liste blanche sur Cloudflare

Bloquer les attaques wp-login.php, xmlrpc.php

La page d'administration comme wp-login.php et wp-admin sont probablement les plus visées par les attaques.
Notamment avec des attaques bruteforces qui tentent de trouver le mot de passe.
Le but étant de pouvoir se connecter à votre interface d'administration WordPress afin de le pirater.
De même, XML-RPC a des utilisations légitimes, comme bloguer à partir d'un smartphone ou publier du contenu sur plusieurs sites WordPress à la fois. Si vous ne le faites pas, il peut être bloqué en toute sécurité.

Pour rendre WordPress plus sûr et le sécuriser, vous pouvez n'autoriser que votre adresse IP à se connecter à ces dernières.

Pour cela, créez la règle suivante :

  • Champs : chemin URI
  • Opérateur : contient
  • valeur : /wp-login.php
[OU]
  • valeur : /xmlrpc.php
  • Action : bloquer

Action : bloquer

Ce qui donne cette règle :

(http.request.uri.path eq "/wp-login.php") or (http.request.uri.path eq "/xmlrpc.php")
Bloquer les attaques wp-login.php, xmlrpc.php

Protéger la zone wp-admin

Maintenant, faisons en sorte que vous et vous seul puissiez accéder à votre zone d'administration WordPress. Cette règle est légèrement plus complexe car vous devez faire deux exceptions.

Le premier est /wp-admin/admin-ajax.php, qui est utilisé par certains plugins pour afficher du contenu dynamique sur votre site Web. En tant que tel, bien qu'il soit situé dans le dossier / wp-admin /, il doit être accessible de l'extérieur.

Le deuxième est /wp-admin/theme-editor.php, qui exécute un contrôle d'erreur chaque fois que vous modifiez votre thème via l'éditeur intégré en créant une requête de bouclage vers votre page d'accueil. Si vous n'ajoutez pas cette exception, la vérification échouera avec un message "Impossible de communiquer avec le site pour vérifier les erreurs fatales" et vos modifications ne seront pas enregistrées.

Suivez la même procédure que précédemment et créez la règle:

  • Champs : Chemin URI
  • Opérateur : contient
  • Valeur: /wp-admin/
[ET]
  • Champs : Chemin URI
  • Opérateur : ne contient PAS
  • Valeur: /wp-admin/admin-ajax.php
[ET]
  • Champs : Chemin URI
  • Opérateur : ne contient PAS
  • Valeur : /wp-admin/theme-editor.php

Action : bloquer

Ce qui donne :

(http.request.uri.path contains "/wp-admin/" and not http.request.uri.path contains "/wp-admin/admin-ajax.php" and not http.request.uri.path contains "/wp-admin/theme-editor.php")

Limiter les ASN et pays sources d'attaques

Vous n'hébergez certainement pas un site international.
Ainsi il est possible de limiter l'accès à certains pays ou région du monde.
En effet, Si on regarde les statistiques de sources de DoS, les pays asiatiques sont en premières lignes.

Lees attaques DoS par source de pays

Du côté des ASN et réseau, l'hoster DigitalOcean (US), des hébergeurs asiatiques et OVH arrivent ensuite.

Lees attaques DoS par source de réseaux et ASN

Or, à part pour des requêtes automatisées provenant de bot, un hébergeur n'est pas censé demander des ressources de votre sites WEB.
La source principale sont normalement des connexions résidentielles (câble, xDSL ou fibre).

Ainsi vous pouvez mettre en place un Défi JS ou Captcha afin de limiter les requêtes provenant de ces sources.

Bloquer les sources d'attaques DoS, pays et ASN

Cela peut diminuer de manière sensibles des attaques DoS mais aussi les attaques de bruteforce.
Cela n'empêchera pas l'audience à l'étranger à se connecter, ils devront simplement répondre au captcha.

La règle de pare-feu Cloudflare possible :

(ip.geoip.country in {"RU" "RO" "UA" "CN" "IO" "TR" "NG" "BG" "MW"}) or (ip.geoip.continent in {"AS" "OC" "T1"} and not ip.geoip.country in {"PF" "NC"}) or (ip.geoip.asnum in {6496 45916 14061 16509})

Par exemple sur cette attaque DoS, on voit clairement que la majorité de la source provient de pays asiatiques.

Statistiques attaques DoS
Vous pouvez aussi filtrer les USA, mais beaucoup de bots légitimes comme Google, BingBot, Semrush et autres sont hébergés là bas.
Il est toutefois possible de les mettre en exception ou liste blanche par leurs ASN ou via une règle de reconnaissances de bots disponibles dans le pare-feu de Cloudflare.

Sécuriser WordPress

Un article pour sécuriser WordPRess un peu plus ancien existe sur le site.
La plupart des recommandations sont redondantes avec ce qui est présent dans ce article.
En effet, on peut presque tout faire avec Cloudfalre.

Toutefois, vous pouvez toujours jeter un coup d'oeil :

Liens

Vous avez trouvé cet article utile et interressant, n'hésitez pas à le partager...

Trouver la solution sur le forum d'aide

Vous êtes arrivé au terme de l'article Cloudflare : comment protéger Nginx et WordPress des attaques DoS, piratages et bruteforce mais vous n'avez pas trouvé la solution à votre problème...
Suivez ces articles du forum pour trouver une réponse ou demandez à votre tour de l'aide sur le forum