Sécurité WordPress : mettre en place un pare-feu applicatif (WAF)

WordPress est populaire, donc il attire aussi la popularité des attaquants. Ce n’est pas une impression, c’est un constat opérationnel: beaucoup d’attaques ne visent pas “le serveur”, elles cherchent une surface applicative, une page précise, un point d’entrée comme wp-login.php, un plugin gourmand en droits, ou une faille exploitée via des requêtes mal formées. Dans ce contexte, un pare-feu applicatif (WAF) ne remplace pas la discipline de sécurité (mises à jour, durcissement, bonnes pratiques), mais il ajoute une couche de filtrage au moment où la requête compte vraiment.

Mettre en place un WAF, ce n’est pas seulement cocher une option “sécurité”. Il faut comprendre ce qu’il sait faire, ce qu’il peut casser, et comment le régler pour qu’il protège sans bloquer votre site. Je vais donc aborder le WAF comme un projet de configuration, de test et de pilotage, avec des choix concrets et des garde-fous.

À quoi sert vraiment un WAF face aux attaques WordPress

Un WAF inspecte les requêtes HTTP/HTTPS au niveau applicatif. Là où un pare-feu réseau filtre sur des ports et des protocoles, le WAF regarde le contenu: chemins demandés, paramètres, chaînes suspectes, méthodes, tailles de corps de requête, séquences récurrentes d’attaque, cohérence globale du trafic.

Sur WordPress, la valeur du WAF est surtout dans trois scénarios:

Premièrement, les attaques opportunistes. Beaucoup de bots testent des URL connues, tentent des ../ pour traverser des répertoires, cherchent des injections dans des paramètres GET ou POST, ou enchaînent des requêtes classiques de type “scan”.

Deuxièmement, les tentatives d’exploitation d’applications web. Un WAF peut bloquer des patterns de payloads connus, ou au minimum les mettre en quarantaine en “score” avant qu’elles n’atteignent PHP et la couche applicative.

Troisièmement, les abus et les effets de volumétrie applicative. On pense aux attaques en rafale sur la connexion, ou à des requêtes répétitives qui ne saturent pas forcément la bande passante, mais saturent le traitement côté application (CPU, logs, base de données).

Le point important: un WAF est un filtre probabiliste sur un environnement vivant. Il peut manquer une attaque si elle est novatrice, et il peut gêner un usage légitime si la règle est trop agressive. La différence entre un WAF qui protège et un WAF qui casse, c’est la méthode de déploiement.

Choisir l’approche WAF: cloud, reverse proxy, ou module serveur

Avant de parler de règles et de logs, il faut choisir le “placement” du WAF dans votre architecture.

Dans la pratique, on rencontre trois modèles:

    WAF géré par un fournisseur (service cloud, souvent avec CDN ou reverse proxy) WAF intégré à un reverse proxy (par exemple avec des solutions basées sur Nginx, ou une couche dédiée) WAF au niveau du serveur applicatif (modules, appliances, ou solutions installées sur l’infrastructure)

Un WAF cloud est souvent le plus rapide à activer, car vous n’avez pas à modifier les systèmes. Il peut aussi absorber une partie des effets volumétriques, https://gardewp.fr/securite-wordpress/ puisque la terminaison TLS et le filtrage se font en amont. En revanche, il introduit un trafic indirect, avec des subtilités de headers, de caching, ou de logging.

Un WAF via reverse proxy vous donne plus de contrôle sur l’intégration, mais vous devez maintenir la configuration et gérer des comportements spécifiques. Et un WAF “local” donne une visibilité complète sur votre serveur, tout en demandant une discipline de maintenance, des mises à jour de règles, et un suivi des performances.

Dans tous les cas, la question à trancher est la même: où voulez-vous que la requête soit jugée, et à quel niveau voulez-vous agir. Sur WordPress, le plus fréquent est de juger en amont, au plus près du bord, parce que les mauvais trafics ne devraient pas coûter cher à votre PHP.

Préparer WordPress avant d’ouvrir le WAF

Un WAF bien configuré commence par une base propre. Si vous avez un WordPress déjà “fragile” (plugins obsolètes, thème modifié sans discipline, endpoints exposés inutilement), vous allez passer plus de temps à débloquer qu’à protéger.

Il y a aussi un point souvent négligé: les faux positifs viennent rarement de “l’idée” du WAF, ils viennent de comportements légitimes mal anticipés. Par exemple, un formulaire qui envoie un champ personnalisé avec du contenu HTML, ou un plugin de recherche qui génère des requêtes atypiques. Si vous déployez le WAF sans connaître vos patterns réels, vous risquez de couper le trafic principal.

Avant l’activation “en blocage”, je recommande de faire trois préparatifs.

D’abord, identifier les pages et fonctionnalités réellement exposées. Sur WordPress, wp-login.php et l’API (si vous en utilisez une) méritent une attention particulière. Les sites avec WooCommerce, formulaires de contact complexes, abonnements, ou intégrations CRM ont souvent des requêtes particulières.

image

Ensuite, clarifier la chaîne réseau. Si vous êtes derrière un CDN ou un reverse proxy, vérifiez comment sont gérés les en-têtes X-Forwarded-For, Host, et la terminaison TLS. Un WAF qui voit une IP cliente erronée peut déclencher des règles de rate limiting sur le proxy au lieu du client réel.

Enfin, faire un état des lieux des journaux. Tant que vous n’avez pas les logs applicatifs et les logs sécurité, vous naviguez à l’aveugle. Je parle ici de journaux serveur (Nginx/Apache), journaux WAF (requêtes bloquées, score, règle déclenchée), et journaux WordPress quand c’est possible.

Stratégie de déploiement: audit, mode “monitoring”, puis durcissement

La partie la plus efficace d’un WAF se joue dans sa progression. Un “mode blocage” direct est tentant, mais c’est rarement le meilleur chemin. Sur un site WordPress réel, les exceptions ne sont pas des détails.

L’approche qui fonctionne bien consiste à passer par des étapes:

1) Activez le WAF en mode observation si la plateforme le permet. L’objectif est de voir quelles règles s’appliquent à votre trafic. Beaucoup de WAF ont un mode “detect only” qui n’empêche pas le passage, mais journalise les événements.

2) Analysez sur plusieurs cycles de trafic. Un seul jour ne suffit pas si vous avez un calendrier éditorial, des pics SEO, ou des campagnes.

3) Ajustez les exceptions là où c’est nécessaire. Les exceptions doivent rester minimales et justifiées. Par exemple, si une règle bloque une route spécifique liée à un plugin, vous ne voulez pas désactiver une famille de détection entière sans raison.

4) Basculez graduellement les actions de “détection” vers “blocage”. Là encore, faites-le par niveaux. Commencez par les règles à fort signal et faible risque, puis augmentez.

Je garde en tête un scénario vécu: un WAF bien intentionné bloquait des requêtes POST parce qu’il percevait certains contenus comme “injection”. En réalité, le champ venait d’un plugin qui encode mal les caractères lors d’un envoi de formulaire. Le site marchait parfaitement depuis des semaines, mais une campagne récente a déclenché le pattern. Le WAF était en mode monitoring, donc on a pu identifier la règle exacte et corriger côté plugin, sans rester avec un WAF bloquant en production.

Régler les règles pour WordPress sans casser la vie réelle

Les WAF proposent souvent des “sets” de règles: OWASP, signatures spécifiques, règles anti-bot, protections contre injection, détection d’accès au fichier, etc. La tentation consiste à activer tout, immédiatement.

La réalité est plus fine. WordPress est un produit modulaire, avec des plugins qui créent des endpoints et des comportements. Les règles génériques ne suffisent pas toujours, mais elles constituent un bon socle.

Voici les catégories qui demandent le plus de jugement sur WordPress:

Protection sur wp-login.php et l’authentification

Bloquer les tentatives de connexion n’est pas “optionnel”. Beaucoup d’attaques se font par force brute, en y ajoutant parfois une tentative d’énumération des utilisateurs.

Un WAF peut aider avec du rate limiting et des protections de challenge. Toutefois, attention: si votre site utilise un SSO externe, un WAF trop strict peut provoquer des boucles, ou bloquer des requêtes qui ne ressemblent pas à un navigateur standard.

Le bon repère est de tester avec de vrais comptes, depuis plusieurs réseaux (mobile, bureau, VPN si vous en utilisez un). Vous cherchez à éviter les blocages “fantômes” qui ne se manifestent que sous certains contextes.

Gestion des requêtes XML-RPC si vous l’utilisez encore

WordPress a longtemps exposé XML-RPC, et l’usage réel dépend du site. Beaucoup de sites l’ont désactivé par choix, mais certains l’utilisent encore pour des intégrations.

Si vous avez besoin de XML-RPC, le WAF doit être configuré avec prudence. Les règles par défaut peuvent être trop restrictives ou au contraire trop permissives, selon votre version WordPress et vos usages. Si vous n’avez pas besoin de XML-RPC, le meilleur gain est souvent de le désactiver côté WordPress, et de laisser le WAF comme garde-fou.

Détection d’injections et patterns “applicatifs”

Les règles d’injection inspectent souvent des éléments comme les champs de paramètres, les patterns typiques de SQL injection, des marqueurs de script, des parcours de fichiers.

Le risque de faux positifs apparaît quand vos formulaires autorisent des entrées riches, ou quand certains plugins envoient des payloads encodés. Par exemple, un champ qui stocke un fragment HTML peut déclencher des heuristiques trop basiques. Dans ce cas, vous devez préférer la correction côté formulaire, ou ajuster un champ précis plutôt que neutraliser toute la classe de détection.

Contrôle des tailles et du “corps” des requêtes

Les attaques volumétriques applicatives ne passent pas seulement par des signatures. Elles peuvent aussi profiter de requêtes anormalement grandes, de champs répétés, ou de comportements de session bancals.

Un WAF peut rejeter les requêtes dont la taille dépasse un seuil raisonnable, ou celles qui ne correspondent pas à un format attendu. Là encore, vous devez connaître les limites de votre WordPress. Sur un site, la taille maximale upload (fichiers) ne doit pas être confondue avec la taille maximale d’une requête POST de formulaire standard.

Rate limiting et anti-bot: efficace, mais pas gratuit

Le rate limiting est l’un des leviers les plus rentables. Sur WordPress, il réduit l’impact des essais de connexion, des scans d’URL, et parfois de certains comportements de bots agressifs.

Mais il y a une nuance cruciale: rate limiting “global” peut pénaliser des utilisateurs derrière NAT, ou des API clients qui partagent une IP de sortie. Les règles doivent être calibrées sur des métriques et, idéalement, sur des fenêtres de temps réalistes.

Un WAF peut aussi lancer des challenges (CAPTCHA, ou mécanismes de vérification). Sur WordPress, c’est particulièrement délicat sur les pages qui sont scrappées par des services externes ou qui sont utilisées par des outils internes. Si vous avez un back-office alimenté par des scripts, les challenges peuvent devenir un problème d’exploitation.

Mon conseil pratique: commencez par limiter ce qui vous coûte cher. Ciblez l’authentification, les endpoints sensibles, et les routes qui exposent le plus d’effort applicatif. L’anti-bot “large” sur tout le site doit être une décision mûrie, pas un réglage de confort.

Headers, IP réelle et TLS: les détails qui font tomber des WAF

Un WAF n’est pas qu’un moteur de règles. Il s’insère dans une chaîne technique. Si cette chaîne est mal comprise, vous obtenez des blocages difficiles à diagnostiquer.

Trois soucis reviennent souvent:

L’IP cliente vue par le WAF ne correspond pas à la vraie IP utilisateur, à cause d’un reverse proxy ou d’un CDN. Le schéma HTTP versus HTTPS change, ou des redirections sont interprétées comme des comportements suspects. Les en-têtes exigés par votre WordPress ou par vos plugins ne sont pas propagés correctement.

Pour limiter ce risque, je recommande de vérifier en premier la santé fonctionnelle sans WAF, puis de comparer après activation. Si vous utilisez un CDN, vérifiez la configuration de headers forward, et assurez-vous que le WAF utilise la bonne source d’IP quand il applique ses règles.

C’est aussi là que les tests “navigateur réel” sont utiles. Le WAF voit aussi du trafic “comme s’il s’agissait d’un navigateur”, et le comportement change parfois sur les scripts qui utilisent fetch avec des options spécifiques. Sur des sites riches, une différence de 301 ou 302 peut suffire à faire déclencher une règle de boucle ou de requêtes répétées.

Exemples concrets de règles à activer en premier

Les WAF ont des paramètres et des libellés qui varient selon l’éditeur. Plutôt que de citer des noms exacts qui changent, je décris des intentions de configuration, ce qui vous aide à mapper au produit que vous utilisez.

image

En général, je privilégie d’abord:

    Les règles de base contre les requêtes manifestement invalides, chemins suspects, patterns simples d’exploration. Les protections contre les attaques connues sur les paramètres et les injections évidentes. Le filtrage des accès à des fichiers ou répertoires non exposés au public (selon votre stack). Les garde-fous sur l’authentification, notamment la fréquence des tentatives de connexion.

Ensuite seulement, je renforce vers des règles plus “profilantes”, celles qui peuvent être plus spécifiques, donc plus susceptibles de créer des faux positifs si votre site a des comportements particuliers.

Si votre site est très dynamique, par exemple un site avec un gros volume de commentaires modérés, il peut y avoir des interactions entre rate limiting, gestion anti-spam, et règles WAF. Dans ce cas, vous devez décider: vous voulez protéger avant tout l’authentification, puis laisser le reste plus souple, ou l’inverse. La bonne réponse dépend de la menace dominante que vous observez dans vos logs.

Identifier et traiter les faux positifs sans “désactiver tout”

Un WAF qui bloque trop finit par perdre sa crédibilité et vous le contournez, parfois en désactivant des protections par fatigue. L’objectif est donc de gérer les faux positifs proprement.

Techniquement, une bonne approche consiste à:

    Observer quelle règle déclenche le blocage et sur quelles URLs. Vérifier si le blocage concerne une action utilisateur légitime. Comprendre quel paramètre déclenche le pattern. Corriger soit le contenu côté application (encodage, format des requêtes), soit la configuration WAF au plus petit périmètre possible.

Ce dernier point demande du sang-froid. J’ai vu des équipes créer des exceptions trop larges, du type “ne jamais bloquer cette famille pour tout le site”. Quelques semaines plus tard, une nouvelle variante d’attaque a traversé, et le WAF a perdu une partie de sa valeur.

Une règle plus saine est de cibler uniquement une route et un type de requête précis, ou d’exclure un paramètre bien identifié. Si votre WAF le permet, vous pouvez également définir des règles “allow” pour un endpoint spécifique, tout en gardant les autres protections actives.

Piloter le WAF dans la durée: logs, indicateurs et revues

Un WAF ne se règle pas une fois. Il accompagne l’évolution du site. Quand vous ajoutez un plugin, changez un thème, activez une intégration, ou modifiez des formulaires, vous changez vos patterns de trafic. Le WAF doit suivre.

image

En pratique, je m’appuie sur trois indicateurs:

D’abord le volume des blocages par règle. Si une règle génère beaucoup d’événements, mais que votre site ne signale aucun impact, vous pouvez décider d’ajuster en douceur ou de garder tel quel. Si le volume augmente juste au moment d’un changement applicatif, vous avez un indice.

Ensuite, la proportion de requêtes bloquées qui concernent des erreurs côté application. Si votre WAF bloque des requêtes qui n’atteignent jamais WordPress, vous devez vous assurer que c’est bien l’objectif. Parfois, un blocage “trop tôt” masque un problème de configuration applicative, comme une route mal déclarée.

Enfin, l’impact utilisateur. Je ne parle pas uniquement de “le site marche”. Je parle d’observabilité. Taux d’échec de login, hausse de 4xx sur des pages d’inscription, temps de chargement, erreurs de formulaires. Un WAF mal réglé apparaît souvent dans ces métriques avant d’apparaître dans des logs d’attaque.

Pour rendre le pilotage actionnable, je conseille une routine simple, que vous pouvez adapter à votre équipe:

    passer en revue les 10 règles les plus actives chaque semaine vérifier les événements liés à l’authentification après chaque mise à jour WordPress corriger en priorité ce qui touche les formulaires et les actions critiques documenter les exceptions avec un motif clair et une date réévaluer les exclusions quand les plugins concernés changent

C’est un petit rituel, mais il évite les réglages “à l’intuition”, et il donne une mémoire collective.

Vérification finale: tests avant et après activation

Avant d’arrêter le travail, il faut tester comme un utilisateur et comme un système. Les WAF touchent le trafic, donc le test doit couvrir des routes variées.

Je vous propose une mini-checklist, courte, parce que c’est l’efficacité qui compte:

    tester la connexion et la déconnexion avec plusieurs comptes vérifier les formulaires (contact, inscription, commentaire si présent) contrôler les pages de recherche et filtres, notamment ceux générant des requêtes GET inhabituelles valider le chargement des médias et le comportement sur les pages cache simuler un comportement “non humain” sur une route sensible pour observer le blocage attendu

Si vous avez une API ou des webhooks, testez-les aussi. Les WAF sont parfois trop stricts sur les signatures, les user agents, ou les en-têtes attendus. Quand vous ajoutez un WAF, ces détails peuvent changer.

Et la sécurité WordPress, dans tout ça?

Mettre en place un WAF est une excellente brique, mais la sécurité WordPress reste une chaîne. Un WAF réduit le risque d’exploitation, mais il ne corrige pas les vulnérabilités de plugins non mis à jour. Il ne remplace pas une politique de mots de passe robuste, ni une limitation d’accès cohérente, ni le cloisonnement entre environnements.

Ce que le WAF apporte, c’est une réduction du “temps d’exposition” entre une faille potentielle et votre réaction. Quand une attaque exploite un vecteur connu, le WAF peut bloquer avant que votre stack applicative soit sollicitée. Cela se traduit par moins d’instances compromises, et moins d’indices à analyser après coup.

Personnellement, je considère le WAF comme la couche qui achète du temps. Le reste du travail consiste à utiliser ce temps pour réparer: mettre à jour, durcir, supprimer ce qui est inutile, et améliorer l’hygiène de code côté thèmes et plugins.

Cas particuliers: multilingue, cache, et sites très dynamiques

Certains sites ont des contraintes qui rendent le WAF plus délicat.

Un site multilingue peut avoir des règles supplémentaires de redirection, de réécriture d’URL, et d’en-têtes. Si le WAF interprète des redirections répétées comme suspectes, il peut créer une boucle de blocage.

Un site fortement caché (page cache, object cache) peut aussi être affecté indirectement. Si votre WAF ajoute ou modifie des headers, certains caches se fragmentent. Vous le verrez dans les performances avant de le voir dans la sécurité.

Enfin, les sites très dynamiques, par exemple avec de nombreux formulaires et requêtes AJAX, génèrent plus de variations d’URL et de paramètres. Les règles basées sur des heuristiques simples ont plus de chances de toucher une requête légitime. La solution n’est pas de renoncer, mais d’adapter: privilégier les protections à fort signal sur les endpoints sensibles, et ajuster finement le reste.

Rester crédible: expliquer et documenter en équipe

Un WAF devient un objet “vivant” dans l’exploitation. Quand un événement arrive, on ne veut pas que la discussion tourne en rond.

Je recommande de documenter:

    la logique générale (mode, objectifs, endpoints ciblés) les exceptions ajoutées, et pourquoi elles existent les procédures de test après modification les responsables et le niveau d’escalade

Cela vous évite des modifications opportunistes en production, et vous améliore le délai de résolution quand un blocage survient en pleine période de charge.

Conclusion implicite sous forme de méthode

Le pare-feu applicatif n’est pas un interrupteur. C’est un outil de sécurité qui doit être réglé sur votre site, avec votre trafic et vos contraintes. Sur WordPress, la meilleure stratégie consiste à activer d’abord en mode observation, à identifier ce qui déclenche, à corriger les causes côté application quand c’est pertinent, et à appliquer des exceptions minimales et justifiées. Ensuite seulement, vous augmentez la sévérité.

Si vous faites ce travail sérieusement, vous obtenez un gain concret: moins de requêtes suspectes atteignent PHP, moins d’essais bruyants consomment vos ressources, et vous pouvez vous concentrer sur la maintenance réelle de votre sécurité WordPress, plutôt que sur la chasse aux incidents au coup par coup.