ecloudserv docs

Pare-feu applicatif (WAF)

Filtrer les requêtes avant qu'elles n'atteignent ton application.

Le WAF s'applique aux domaines servis par le reverse proxy. Les règles sont traduites en configuration nginx et appliquées sur le node : une requête refusée n'atteint jamais ton conteneur.

Jeux de règles fournis#

Le plus rapide est d'activer un jeu prêt à l'emploi depuis Sécurité → WAF.

JeuCe qu'il bloqueRisque
Injection SQLMots-clés SQL enchaînés dans l'URL ou les paramètres.sans risque
Cross-site scriptingBalises et gestionnaires d'événements injectés.à surveiller
Exécution de commandesEnchaînements de commandes shell dans les paramètres.sans risque
Log4Shell et injections JNDIChaînes ${jndi:…} qui font charger du code à distance par une application Java, variantes obfusquées comprises.sans risque
Portes dérobées et webshellsNoms de webshells connus (c99, r57, wso…) et exécution de code PHP en paramètre.sans risque
Traversée de répertoireTentatives de remonter l'arborescence (../, encodages inclus).sans risque
Fichiers sensiblesAccès direct à .env, .git, dumps SQL…sans risque
SSRF et métadonnées cloudParamètres pointant vers l'intérieur : 169.254.169.254, localhost, adresses privées, file://.à surveiller
ScannersSignatures d'outils connus (sqlmap, nikto, nmap…).sans risque
Sondages d'administrationBalayage de wp-admin, phpMyAdmin, .git/config, /actuator…à tester d'abord
Collecteurs de contenuAspirateurs et bibliothèques laissées à leur agent par défaut (wget, curl, scrapy…).à tester d'abord
Anomalies de protocoleOctets nuls, doubles encodages, retours à la ligne injectés dans l'URL.sans risque

Des motifs volontairement resserrés

Un pare-feu qui bloque du trafic légitime est désactivé au bout d'une journée, donc inutile. Les jeux fournis privilégient la précision plutôt que la couverture maximale.

Lis la colonne « Risque »

Sondages d'administration bloque wp-admin et phpMyAdmin : si ton site EST un WordPress, le premier bloqué sera toi. Collecteurs de contenu arrête aussi curl et python-requests, donc tes propres intégrations et tes sondes de supervision — sur une API, préfère l'action « Vérifier ».

Un jeu s'active sur le domaine affiché, ou sur tous tes domaines d'un coup avec le lien sous sa description : une injection SQL ne vise pas un site en particulier, et personne ne réactive la même protection sur douze domaines à la main.

Bloquer, ou seulement observer#

Chaque domaine a un mode, en haut de la page. En observation, les règles ne refusent RIEN : elles écrivent au journal ce qu'elles auraient bloqué, limites de débit comprises.

C'est la façon d'allumer un pare-feu sur un site vivant : on regarde deux jours ce qui aurait été cassé dans les évènements, on ajoute les exceptions nécessaires, puis on bascule en blocage en sachant ce qu'on fait — au lieu de l'apprendre par un client au téléphone.

Le mode ne touche pas aux règles

Rien n'est désactivé : une règle reste « Bloquer » dans la liste, elle est simplement appliquée comme une journalisation tant que le domaine est en observation. Le simulateur l'affiche explicitement (« dégradée depuis Bloquer par le mode observation »).

Tester une requête avant qu'un visiteur ne le fasse#

Le simulateur, sur la même page, répond à « que ferait le pare-feu de cette requête ? ». Tu donnes un chemin et un agent utilisateur — ou tu cliques un exemple — et il rend le verdict, la règle qui a décidé, et la valeur exacte qui a été comparée.

Rien n'est envoyé à ton application

L'évaluation se fait côté serveur, sur les règles réelles du domaine. Aucune requête n'atteint ton conteneur : tu peux y coller une charge d'injection sans crainte.

C'est une simulation, pas nginx

Elle reproduit fidèlement l'ordre d'application (les exceptions d'abord, puis le blocage, puis la vérification), mais deux choses lui échappent et sont signalées dans le résultat : les compteurs de débit, qui dépendent du trafic réel, et le blocage par adresse IP, appliqué plus tôt dans la chaîne.

Règles sur mesure#

Une règle inspecte un élément de la requête et agit dessus.

  • Élément inspecté : chemin, URL et paramètres, agent utilisateur, en-tête HTTP, méthode, ou adresse IP.
  • Comparaison : contient, égal, commence par, finit par, ou expression régulière.
  • Action : bloquer (403) ou autoriser.

Une règle « Autoriser » l'emporte toujours

Quelle que soit sa priorité. C'est ainsi qu'on écrit une exception : laisser passer une API interne qu'un jeu fourni gênerait, par exemple.

exemple d'exception
Règle 1 — en-tête X-Api-Key égal à « secret-interne » → Autoriser Règle 2 — jeu « Injection SQL » → Bloquer Une requête portant la bonne clé passe, même si elle déclenche le jeu SQL.

Profils de filtrage (par domaine)#

À côté des règles sur mesure, chaque domaine choisit un profil depuis Sécurité → Filtres. C'est un réglage à part : les règles ci-dessus sont des conditions que tu écris, un profil est un jeu de contrôles tout prêt, appliqué avant elles.

ProfilCe qu'il examineLatence
AutoSuit la posture du domaine : le Bouclier rapide si Renforcé, rien sinon.
AucunRien. Seules les limites de débit de base s'appliquent.aucune
Bouclier rapideMéthode, agent utilisateur, chemin, taille des en-têtes — des valeurs déjà en mémoire.aucune
Inspection profondeTout ce qui précède, plus l'URL, les paramètres, les cookies, le référent ET le corps de la requête : SQL, XSS, traversée de répertoire, commandes shell.notable

« Auto » et « Aucun » ne sont pas la même chose

Auto veut dire « je n'ai rien décidé, suis la posture » ; Aucun est un choix explicite qui l'emporte sur la posture. Un domaine en Renforcé qui choisit Aucun conserve les limites de débit resserrées de sa posture, mais plus le filtre applicatif. Tant que les deux se confondaient, le clic sur Aucun n'avait aucun effet visible.

La limite réelle de l'inspection profonde

Le corps n'est examiné que s'il tient dans le tampon de nginx (128 Ko). Au-delà, il part sur disque et devient invisible pour les règles : un envoi volumineux n'est donc pas inspecté. C'est une limite de nginx, pas un réglage — mieux vaut la connaître que la découvrir.

Ce que ce WAF ne fait pas#

Dit ici plutôt que découvert à l'usage :

  • Les règles sur mesure n'inspectent pas le corps des requêtes. Seule l'Inspection profonde le fait, avec la limite de tampon ci-dessus.
  • Pas d'action « journaliser sans bloquer ». Elle exigerait de modifier le format de journal que l'agent analyse pour les statistiques du proxy.

Suivre les blocages#

Les requêtes refusées remontent dans Sécurité : compteur sur 14 jours, et détail des derniers blocages (adresse, méthode, chemin, agent utilisateur).

La remontée exige un agent 2.16.0 ou plus récent

Le blocage, lui, fonctionne dès que la configuration est appliquée, quelle que soit la version de l'agent : c'est nginx qui refuse la requête. Seule la remontée des évènements vers le tableau de bord a besoin de la 2.16.0.

Si une règle ne semble pas s'appliquer#

La configuration est validée par nginx avant d'être adoptée. Si elle est refusée, l'agent conserve la précédente — le site continue donc de fonctionner, mais la nouvelle règle n'a aucun effet. Une erreur apparaît alors dans Admin → Agents. C'est le premier endroit à regarder après avoir créé une règle qui ne fait rien.

Voir aussi Sécurité pour le durcissement des nodes et le filtrage d'adresses, et Domaines & reverse proxy pour l'anti-DDoS et les en-têtes de sécurité.