đĄïž WAF / WAAP â Protection applicative, OWASP Top 10 & API Security
Guide technique orienté production : protection contre OWASP Top 10, injections, XSS, abus HTTP, bots, L7 DDoS, sécurité API, gouvernance des rÚgles, observabilité SOC et déploiement reverse proxy / edge / Kubernetes.
WAF vs WAAP
Positionnement WAF historique, WAAP moderne, protection Web + API + bots + L7 DDoS.
WAFWAAPEdgeOWASP Top 10
Cartographie 2025 : ce quâun WAF couvre, ce quâil attĂ©nue, ce quâil ne peut pas rĂ©soudre seul.
OWASP 2025CoverageRiskInjections
SQLi, NoSQLi, command injection, template injection : détection, scoring, virtual patching.
SQLiRCEA05XSS & Client-side
Reflected, stored, DOM XSS, CSP, cookie hardening, filtrage sorties et défense navigateur.
XSSCSPCookiesAccess Control
Broken Access Control, IDOR, BOLA : ce que WAAP peut dĂ©tecter et ce que lâapp doit garantir.
IDORBOLAAuthZAPI Security
OpenAPI, JSON schema, BOLA, rate limits, inventory, tokens, GraphQL et API drift.
APIOpenAPIGraphQLAbus HTTP
HTTP smuggling, traversal, méthodes, headers, protocol anomalies, SSRF signals et upload abuse.
HTTPSmugglingTraversalBot Defense
Credential stuffing, scraping, fake accounts, carding, challenges, bot score et fingerprinting.
BotsAbuseChallengeL7 DDoS
HTTP flood, expensive endpoints, slow attacks, quotas, backpressure, cache et protection origine.
DDoS L7Rate LimitCachePositive Model
Allowlist par route, schémas, méthodes, content-types, paramÚtres et contrats applicatifs.
AllowlistSchemaZero TrustRules Engine
Signatures, OWASP CRS, scoring, exceptions, ordre de rĂšgles et cycle de vie des politiques.
CRSRulesTuningTLS & Headers
TLS termination, HSTS, cookies, CORS, CSP, sécurité des headers et chaßne proxy.
TLSHSTSCORSObservabilité SOC
Logs, métriques, dashboards, SIEM, détection, forensic, alertes et playbooks incidents.
SIEMLogsSOCDéploiement
CDN, reverse proxy, Kubernetes ingress, Nginx, origin shield, fail-open/fail-closed.
CDNIngressNginxExploitation & Gouvernance
Runbook, tuning, release, ownership, KPIs, exceptions, maturité et intégration DevSecOps.
RunbookDevSecOpsKPIsWAF : Web Application Firewall
Un WAF protĂšge les applications web en inspectant les requĂȘtes HTTP/HTTPS entre les clients et lâapplication. Il cherche les motifs dâattaques applicatives : injection SQL, XSS, traversal, payloads suspects, mĂ©thodes HTTP dangereuses, headers anormaux, encodages multiples ou comportements incompatibles avec lâapplication.
- Mode reverse proxy : le WAF termine le trafic entrant, inspecte, applique une dĂ©cision, puis relaie vers lâorigine.
- Mode transparent / bridge : insertion plus discrÚte dans le chemin réseau, souvent plus délicate à exploiter.
- Mode CDN / edge : protection distribuĂ©e au plus prĂšs dâInternet, utile pour volumĂ©trie et attaques globales.
WAAP : Web Application & API Protection
Le WAAP Ă©tend le WAF classique avec la sĂ©curitĂ© API, la dĂ©couverte dâAPI, la protection des bots, lâanti-abus mĂ©tier, le rate limiting avancĂ©, la dĂ©tection comportementale et la tĂ©lĂ©mĂ©trie SOC.
| Couche | RĂŽle | Exemple |
|---|---|---|
| WAF | Bloque les attaques HTTP connues | SQLi, XSS, RFI/LFI |
| API Security | Valide schémas, auth, inventaire | BOLA, mass assignment |
| Bot Defense | ContrĂŽle automatisation hostile | credential stuffing |
| L7 DDoS | Absorbe pics applicatifs | HTTP flood, login flood |
Traitement dâune requĂȘte HTTP par un WAF / WAAP
Negative security model
Le modĂšle nĂ©gatif bloque ce qui ressemble Ă une attaque. Câest efficace pour dĂ©marrer vite, mais cela dĂ©pend des signatures, de la qualitĂ© de normalisation et du tuning.
- TrĂšs utile contre les patterns connus.
- Sensible aux faux positifs sur applications riches.
- Doit ĂȘtre maintenu avec mises Ă jour de rĂšgles.
Positive security model
Le modÚle positif décrit ce qui est autorisé : routes, méthodes, paramÚtres, schémas JSON, types, tailles, enumérations, structure attendue.
- TrĂšs fort pour APIs et endpoints critiques.
- Demande inventaire, contrats OpenAPI, connaissance métier.
- RĂ©duit fortement lâespace dâattaque.
| Mode | Avantage | Limite | Usage recommandé |
|---|---|---|---|
| Detection only | Pas dâimpact prod | Ne bloque rien | Phase dâapprentissage |
| Blocking | Protection active | Risque FP | Endpoints stabilisés |
| Challenge | Filtre bots | UX variable | Login, checkout, search |
| Adaptive | Décision contextuelle | Complexité | WAAP mature |
Indicateurs Ă collecter dans les logs WAF / WAAP
timestamp=2026-07-06T14:21:09Z client_ip=203.0.113.50 method=POST host=app.example.com uri=/api/v1/orders status=403 rule_id=942100 rule_group=SQLI anomaly_score=12 action=blocked bot_score=18 trace_id=req-7fd4d1 upstream_status=- reason="SQL injection pattern in parameter q"
à corréler cÎté SOC
- IP, ASN, pays, réputation
- Compte utilisateur / session
- URI, méthode, statut upstream
- Rule ID + payload tronqué
- Décision finale et latence
à éviter
- Logger des secrets complets
- Stocker des tokens Bearer en clair
- Bloquer sans trace exploitable
- Créer des exceptions globales non documentées
Référentiel OWASP Top 10 Web 2025
Un guide WAF / WAAP sĂ©rieux doit Ă©viter le marketing âprotĂšge contre toutâ. La bonne approche consiste Ă mapper chaque risque OWASP avec le niveau de couverture rĂ©el : blocage direct, rĂ©duction dâexposition, dĂ©tection, ou responsabilitĂ© applicative.
| Risque OWASP | Couverture WAF/WAAP | Commentaire opérationnel |
|---|---|---|
| A01 Broken Access Control | Partielle | Détection IDOR/BOLA limitée sans contexte métier. |
| A02 Security Misconfiguration | Partielle | Headers, méthodes, erreurs, mais config app reste clé. |
| A03 Supply Chain Failures | Faible | Virtual patching possible sur CVE exposée. |
| A04 Cryptographic Failures | Partielle | TLS, HSTS, ciphers ; pas le chiffrement interne. |
| A05 Injection | Forte | SQLi, command injection, template injection, LDAPi. |
| A06 Insecure Design | Faible à partielle | Abus métier et logique applicative difficiles. |
| A07 Authentication Failures | Partielle | Brute force, stuffing, session abuse, mais pas design auth. |
| A08 Integrity Failures | Partielle | Upload filtering, checksum, signatures cÎté pipeline nécessaires. |
| A09 Logging & Alerting | Forte sur runtime | TrÚs bon levier SOC si logs normalisés. |
| A10 Exceptional Conditions | Partielle | Bloque anomalies, mais la robustesse est applicative. |
Ce que le WAF peut faire trĂšs bien
- Bloquer patterns dâinjection et payloads connus.
- RĂ©duire lâexposition dâune CVE par virtual patching.
- Filtrer méthodes, headers, tailles, content-types.
- Limiter le débit sur login, recherche, panier, API coûteuse.
- Détecter scans automatisés et comportements non humains.
Ce que lâapplication doit corriger
- ContrĂŽles dâautorisation serveur, jamais cĂŽtĂ© client.
- Validation métier et invariants de domaine.
- Gestion des secrets, stockage, chiffrement interne.
- Design dâauthentification, rotation tokens, MFA.
- Chaßne CI/CD, dépendances, signatures de build.
Prioriser les rĂšgles selon lâexposition rĂ©elle
| Surface | Risque dominant | ContrĂŽle WAAP prioritaire | Signal SOC |
|---|---|---|---|
| /login | Credential stuffing | Rate limit + bot challenge + reputation | Ăchecs massifs, rotation IP |
| /search | SQLi, XSS reflected | CRS SQLi/XSS + anomaly scoring | Rule IDs 941/942, variations payload |
| /api/* | BOLA, schema abuse | OpenAPI validation + JWT checks | IDs séquentiels, 403/404 patterns |
| /upload | Malware, polyglot, path abuse | Type allowlist + AV + size cap | MIME mismatch, extension suspecte |
| /checkout | Business logic abuse | Bot defense + velocity rules | Panier/transaction anormaux |
# Exemple de logique de priorisation
risk_score = exposure * exploitability * business_impact * confidence
if endpoint == "login" and failed_attempts_per_ip > threshold:
action = "challenge_or_throttle"
if rule_group in ["SQLI", "RCE"] and anomaly_score >= 8:
action = "block"Les limites Ă assumer explicitement
Risques invisibles pour le WAF
- Autorisation manquante mais requĂȘte syntaxiquement normale.
- Fraude métier lente et distribuée.
- Secrets exposés cÎté backend ou logs internes.
- Faille dans un job asynchrone non exposé HTTP.
- Supply chain compromise sans endpoint vulnérable visible.
Compensations nécessaires
- SAST/DAST/IAST dans CI/CD.
- Tests dâautorisation API systĂ©matiques.
- Threat modeling et abus cases.
- EDR/Runtime hardening cÎté serveur.
- SIEM/SOAR pour corrélation multi-sources.
Familles dâinjection applicative
Les injections apparaissent lorsquâune donnĂ©e contrĂŽlĂ©e par lâutilisateur est interprĂ©tĂ©e comme une instruction par un moteur : SQL, shell, template, LDAP, XPath, NoSQL, ORM, expression language. Le WAF cherche Ă reconnaĂźtre ces transitions dangereuses dans les paramĂštres, headers, cookies et bodies.
| Type | Surface courante | Signal WAF | Correction durable |
|---|---|---|---|
| SQL Injection | search, login, filters | UNION, boolean logic, commentaires SQL | Prepared statements + ORM safe |
| Command Injection | admin tools, export, ping | séparateurs shell, commandes systÚme | pas de shell, allowlist stricte |
| NoSQL Injection | JSON API, Mongo filters | opérateurs inattendus, types objets | schema validation + binding |
| SSTI | templates, emails, previews | délimiteurs template, introspection | template sandbox + escaping |
| LDAP/XPath | auth, directory search | wildcards, opérateurs, parenthÚses | encoding contextuel |
Détection par signatures
Les signatures cherchent des tokens dangereux et des combinaisons : opĂ©rateurs, fonctions, commentaires, encodages, concatĂ©nations, payloads obfusquĂ©s. Elles sont utiles mais doivent ĂȘtre accompagnĂ©es dâun score dâanomalie pour Ă©viter un blocage brutal sur un seul indice faible.
- Normalisation avant matching.
- Décodage URL/Unicode contrÎlé.
- Inspection multi-champs : args, headers, cookies, body.
- Seuils différents selon endpoint.
Anomaly scoring
rule 942100: SQL keyword pattern +5 rule 942110: SQL comment sequence +3 rule 942150: Boolean tautology +5 rule 920272: invalid character +2 ---------------------------------------- score_total = 15 threshold_block = 8 action = block
Virtual patching : rĂ©duire lâexposition avant correction applicative
Lorsquâune vulnĂ©rabilitĂ© est identifiĂ©e en production, une rĂšgle WAF ciblĂ©e peut bloquer lâexploitation pendant que lâĂ©quipe corrige le code, teste et dĂ©ploie. Cela ne remplace pas le patch, mais rĂ©duit la fenĂȘtre dâexposition.
# Pseudo-rÚgle ciblée IF uri == "/legacy/report" AND method == "GET" AND args["filter"] matches suspicious_sql_pattern THEN block WITH reason="virtual_patch_legacy_report_sqli"
Réduire les faux positifs sans ouvrir la porte
| SymptÎme | Mauvaise réaction | Bonne réaction |
|---|---|---|
| Un paramÚtre contient du JSON complexe | Désactiver SQLi globalement | Exclure uniquement ce paramÚtre sur cette route |
| Recherche texte avec apostrophes | Abaisser le seuil partout | Créer seuil endpoint spécifique |
| Body trÚs volumineux | Bypass complet | Limiter taille + scanner métadonnées + upload policy |
| API legacy bruyante | Whitelist IP globale | Contrat minimal + rĂšgles compensatoires |
Comprendre les trois grandes formes de XSS
| Type | Origine | Détection WAF | Correction durable |
|---|---|---|---|
| Reflected XSS | ParamÚtre renvoyé immédiatement | TrÚs bonne si payload visible | Output encoding par contexte |
| Stored XSS | DonnĂ©e stockĂ©e puis rendue | Bonne Ă lâentrĂ©e, limitĂ©e Ă la sortie | Sanitization + encoding + validation |
| DOM XSS | JS client manipule le DOM | Limitée si payload dans fragment ou logique client | Audit frontend + Trusted Types |
Un WAF dĂ©tecte trĂšs bien des motifs XSS classiques dans query strings, formulaires, cookies et JSON. En revanche, il ne voit pas toujours la transformation qui se produit dans le navigateur, surtout si le problĂšme vient dâun JavaScript client qui interprĂšte une donnĂ©e comme HTML.
Ce que le WAF cherche
- Balises script, événements HTML, URLs javascript:, SVG abusifs.
- Encodages mixtes et caractĂšres de contrĂŽle.
- Attributs dangereux et fragments HTML inattendus.
- Payloads dans JSON, XML, multipart et cookies.
Exemple de trace normalisée
rule_group=XSS rule_id=941100 location=ARGS:comment matched_var="<script>..." anomaly_score=9 action=blocked message="XSS attack detected via libinjection"
Durcissement navigateur complémentaire
La Content Security Policy et les headers de sĂ©curitĂ© limitent lâimpact dâun XSS qui passerait malgrĂ© le WAF. Le WAAP peut injecter ou vĂ©rifier certains headers, mais lâidĂ©al est de les gĂ©rer au niveau applicatif avec une politique cohĂ©rente.
| ContrĂŽle | Objectif | Exemple dâeffet |
|---|---|---|
| CSP | Limiter sources scripts/styles | Bloque script inline non autorisé |
| HttpOnly | Protéger cookie contre JS | Réduit vol de session via XSS |
| SameSite | Limiter CSRF/session abuse | ContrĂŽle envoi cross-site |
| Secure | Cookie uniquement HTTPS | Ăvite fuite sur HTTP |
| X-Content-Type-Options | Ăviter MIME sniffing | RĂ©duit interprĂ©tation abusive |
Content-Security-Policy: default-src 'self'; script-src 'self' 'nonce-{random}'; object-src 'none'; base-uri 'self'; frame-ancestors 'none'
Set-Cookie: session=...; HttpOnly; Secure; SameSite=LaxCas particulier des SPA React/Vue/Angular
Angles morts WAF
- Payload dans fragment URL non envoyé au serveur.
- DonnĂ©e reçue dâune API puis injectĂ©e dans le DOM.
- Usage dangereux de innerHTML / dangerouslySetInnerHTML.
- Dépendance npm vulnérable cÎté front.
Défenses complémentaires
- Lint sécurité frontend.
- Trusted Types si applicable.
- Sanitizer robuste cÎté client et serveur.
- CSP nonce stricte et pas de wildcard.
Une requĂȘte malveillante peut ĂȘtre syntaxiquement parfaite
Les failles dâautorisation sont souvent invisibles pour un WAF classique, car la requĂȘte respecte le protocole, le schĂ©ma et les contraintes de taille. Le problĂšme est mĂ©tier : lâutilisateur A ne devrait pas accĂ©der Ă la ressource de lâutilisateur B.
GET /api/invoices/124785 HTTP/1.1 Authorization: Bearer valid_token_user_A Accept: application/json
Le WAF voit une requĂȘte propre. Seule lâapplication connaĂźt normalement la relation : âinvoice 124785 appartient-elle Ă user_A ?â.
| Risque | Détection WAF | Détection WAAP avancée |
|---|---|---|
| IDOR/BOLA | Faible | Anomalies dâĂ©numĂ©ration, sĂ©quences IDs, 403/404 |
| Privilege escalation | Faible | Routes admin appelées par profil non admin |
| Mass assignment | Partielle | Champs JSON inattendus |
Détection comportementale utile
Indices dâĂ©numĂ©ration
- Grand nombre dâIDs consĂ©cutifs consultĂ©s.
- Ratio 403/404 inhabituel.
- Changement rapide de tenants, org_id, user_id.
- AccĂšs Ă des ressources jamais vues pour ce compte.
RĂšgle comportementale
IF endpoint matches "/api/invoices/{id}"
AND distinct_path_ids_per_user_5min > 30
AND error_ratio_403_404 > 0.45
THEN action = challenge_or_block
reason = "possible_id_enumeration"Réduire BOLA et mass assignment par schéma
Un WAAP moderne peut utiliser OpenAPI/JSON Schema pour refuser des paramĂštres et champs inattendus. Cela ne prouve pas lâautorisation, mais empĂȘche de nombreuses manipulations opportunistes.
| ContrĂŽle | Exemple | Effet |
|---|---|---|
| Champs autorisés | PATCH /profile autorise display_name, phone | Bloque is_admin=true |
| Types stricts | invoice_id integer | Bloque objets ou arrays inattendus |
| Longueur | comment max 5000 | Réduit abus mémoire |
| Enum | status in [draft, paid] | Bloque états non prévus |
# Exemple de champ interdit détecté method=PATCH uri=/api/users/me json_field="role" expected_schema="UserSelfUpdate" action=blocked reason="unexpected_sensitive_field"
ContrÎles indispensables cÎté backend
- Autorisation objet par objet : vĂ©rifier lâappartenance de chaque ressource cĂŽtĂ© serveur.
- RBAC/ABAC : centraliser les décisions, éviter les if dispersés.
- IDs non devinables : UUID ou opaque IDs ne remplacent pas lâautorisation mais rĂ©duisent lâĂ©numĂ©ration.
- Tests de sécurité : scénarios user A / user B automatisés.
- Journalisation mĂ©tier : Ă©vĂ©nement dâaccĂšs refusĂ© avec ressource et sujet pseudonymisĂ©s.
Le WAAP doit savoir ce quâil protĂšge
La sĂ©curitĂ© API commence par lâinventaire : hosts, versions, routes, mĂ©thodes, schĂ©mas, propriĂ©taires, criticitĂ©, auth attendue, exposition publique/interne. Sans inventaire, impossible de distinguer une API lĂ©gitime dâun endpoint oubliĂ©.
| ĂlĂ©ment | Question | ContrĂŽle WAAP |
|---|---|---|
| Endpoint | Existe-t-il dans le contrat ? | Découverte + drift detection |
| Méthode | POST attendu ou GET anormal ? | Method allowlist |
| Auth | JWT/OAuth requis ? | Token presence + issuer/audience |
| Schéma | Body conforme ? | JSON schema validation |
| Version | v1 exposée encore ? | Deprecated endpoint alert |
OpenAPI comme contrat de sécurité
Un contrat OpenAPI bien maintenu permet au WAAP de refuser mĂ©thodes, paramĂštres, types et champs non documentĂ©s. Câest un modĂšle positif trĂšs efficace pour les APIs stables.
- Reject unknown paths.
- Reject unknown query/body fields.
- Enforce content-type.
- Limit array length and body size.
Exemple de rejet
POST /api/v2/users
Content-Type: application/json
{
"email": "a@example.com",
"display_name": "Alice",
"is_admin": true
}
WAAP: block
reason: field_not_allowed:is_adminGraphQL : surface compacte, risque concentré
GraphQL expose souvent un seul endpoint HTTP, mais la complexité est dans la query. Le WAAP doit comprendre profondeur, coût, introspection, fragments, aliases et mutations sensibles.
| Risque | ContrĂŽle WAAP | ContrĂŽle app |
|---|---|---|
| Query trop profonde | Depth limit | Resolvers optimisés |
| Coût CPU élevé | Query cost analysis | Pagination obligatoire |
| Introspection publique | Bloquer en prod | Config serveur |
| Mutation sensible | Route/rĂŽle/mutation policy | AuthZ resolver |
graphql.max_depth = 8 graphql.max_aliases = 20 graphql.block_introspection = true graphql.require_auth_for_mutations = true
Abus métier des APIs
Cas fréquents
- Scraping de catalogue.
- Credential stuffing sur endpoint auth.
- Abus de reset password / OTP.
- Création massive de comptes.
- Exploitation de quotas coûteux.
ContrĂŽles runtime
- Quota par user, token, IP, ASN.
- Velocity rules par action métier.
- Détection de séquence anormale.
- Challenge progressif selon risque.
- Blocage par clé API compromise.
La normalisation est le socle du WAF
Avant toute rĂšgle, le WAF doit transformer la requĂȘte en reprĂ©sentation canonique. Sans cela, une mĂȘme intention peut apparaĂźtre sous de nombreuses formes encodĂ©es, ambiguĂ«s ou incompatibles entre proxy et backend.
| ContrÎle | Objectif | Décision |
|---|---|---|
| URL decoding | Réduire obfuscation | Bloquer encodage invalide |
| Path canonicalization | Détecter traversal | Normaliser /../ |
| Header validation | Ăviter ambiguĂŻtĂ©s | Rejeter doublons dangereux |
| Method allowlist | Limiter surface | GET/POST/PUT selon route |
| Content-Length / TE | Prévenir desync | Politique stricte |
HTTP Request Smuggling / Desynchronization
Le request smuggling exploite des diffĂ©rences dâinterprĂ©tation entre composants HTTP : CDN, WAF, reverse proxy, serveur applicatif. La dĂ©fense est surtout une politique stricte sur framing, headers et versions HTTP.
Signaux
- Content-Length multiples.
- Transfer-Encoding ambigu.
- Combinaisons CL/TE incohérentes.
- Headers avec espaces ou caractĂšres invalides.
- Keep-alive anormal et réponses désalignées.
ContrĂŽles
- Rejeter ambiguĂŻtĂ©s, ne pas ârĂ©parerâ.
- Uniformiser HTTP/1.1/HTTP/2 cÎté edge.
- Désactiver comportements legacy.
- Aligner WAF et upstream proxy.
- Tests de non-régression sur chaßnes proxy.
Path traversal et signaux SSRF
| Abus | Signal WAF | ContrÎle recommandé |
|---|---|---|
| Path traversal | ../, encodages, chemins systĂšme | Canonicalisation + allowlist fichiers |
| LFI/RFI | URLs ou paths dans paramĂštres | Bloquer schemes inattendus |
| SSRF | ParamÚtre URL ciblant IP interne | Interdire private ranges cÎté app |
| Open redirect | redirect_uri externe | Allowlist domaines |
# Signaux Ă surveiller args.url contains "http://169.254.169.254" args.path contains encoded_traversal host header != expected_host redirect_uri domain not in allowlist
Uploads : surface critique
Risques
- Webshell ou script uploadé.
- MIME spoofing.
- Archive bomb / fichier trop gros.
- Polyglot file.
- Path manipulation dans filename.
ContrĂŽles WAF/WAAP
- Content-type allowlist.
- Extension allowlist.
- Taille max par route.
- AV/sandbox connector.
- Blocage filename dangereux.
IF uri == "/upload/avatar" AND NOT file.extension IN ["jpg", "png", "webp"] THEN block IF file.size > 5MB THEN block IF file.mime != detected_mime THEN quarantine
Du bot simple au bot sophistiqué
| Type | Comportement | Risque | Réponse |
|---|---|---|---|
| Script basique | User-Agent faible, débit régulier | Scan, brute force | Rate limit + block |
| Headless browser | Exécute JS, imite navigateur | Scraping, fake accounts | Fingerprint + challenge |
| Residential proxy bot | IP distribuées, faible débit par IP | Credential stuffing | Compte/session velocity |
| Human farm assisted | Résout challenges | Fraude persistante | Analyse comportementale |
Protection du login
Le credential stuffing utilise des couples login/mot de passe compromis sur dâautres services. Lâattaque peut ĂȘtre lente, distribuĂ©e et apparemment normale par IP.
Signaux
- Ăchecs sur nombreux comptes.
- Un compte essayé depuis nombreux ASN.
- User-Agent homogĂšne sur IP diverses.
- Absence de navigation pré-login.
- Rotation de proxies résidentiels.
ContrĂŽles
- Rate limit par compte + IP + subnet.
- MFA adaptatif.
- Challenge selon bot score.
- Credential intelligence si disponible.
- Protection de reset password.
IF endpoint == "/login" AND failed_logins_for_account_10min > 5 THEN require_mfa_or_delay IF distinct_accounts_per_ip_5min > 20 THEN block_or_challenge
Détecter le scraping sans bloquer Google ni partenaires
| Signal | Interprétation | Action |
|---|---|---|
| Navigation sans assets | Client ne charge pas CSS/JS/images | Augmenter bot score |
| Pagination exhaustive | Collecte catalogue | Throttle progressif |
| Temps inter-page constant | Automatisation | Challenge |
| Volume par session élevé | Extraction | Quota session/user |
| Robots légitimes | SEO/monitoring | Allowlist signée/validée |
Choisir le bon niveau de friction
Allow + log. Pas de friction inutile.
JS challenge, proof-of-work léger, rate limit.
Captcha, MFA, temporary block, review SOC.
risk = bot_score + reputation_score + velocity_score + endpoint_sensitivity if risk < 30: action = "allow" elif risk < 70: action = "challenge" else: action = "block_or_mfa"
Pourquoi le L7 est différent
Une attaque L7 peut utiliser des requĂȘtes HTTP valides qui coĂ»tent cher au backend : recherche, export, login, gĂ©nĂ©ration PDF, GraphQL complexe, panier, calcul tarifaire. Le volume rĂ©seau peut ĂȘtre modĂ©rĂ© mais lâimpact CPU/DB massif.
| Niveau | Signal | Défense |
|---|---|---|
| L3/L4 | pps/bps, SYN flood | Scrubbing, Anycast, ACL |
| L7 simple | RPS élevé sur une route | Rate limit, cache, challenge |
| L7 coûteux | RPS modéré, coût backend élevé | Cost-based limiting |
| Slow HTTP | Connexions lentes | Timeouts, header/body limits |
Rate limit multi-dimensionnel
Clés de limitation
- IP / subnet / ASN.
- Session / cookie / device fingerprint.
- User ID / tenant / API key.
- Endpoint / méthode / coût.
- Pays / réputation / bot score.
Exemple de politiques
/login 10 req/min/account /search 60 req/min/session /export 3 req/hour/user /graphql max_cost=1000/min/token /api/order 20 req/min/user
Préserver le backend
| ContrĂŽle | But | Exemple |
|---|---|---|
| Cache edge | Absorber lectures publiques | Catalogues, assets, pages statiques |
| Request coalescing | Ăviter stampede | 1 requĂȘte origine pour N clients |
| Connection pooling | Stabiliser upstream | Limiter connexions backend |
| Circuit breaker | Ăviter effondrement | 503 contrĂŽlĂ© si DB saturĂ©e |
| Origin shield | Masquer IP origine | Origine nâaccepte que WAAP/CDN |
# Principe réseau origin firewall allow only: - WAAP edge IP ranges - deployment pipeline - admin VPN block direct internet traffic to origin
Slowloris, slow POST, connexions lentes
Certaines attaques ne cherchent pas le dĂ©bit, mais lâoccupation de ressources : sockets, workers, buffers. Le WAF/reverse proxy doit imposer des timeouts et limites cohĂ©rentes.
Limites utiles
- Header read timeout.
- Body read timeout.
- Max header size.
- Max body size par route.
- Max concurrent connections par client.
Alertes
- Connexions ouvertes sans requĂȘte complĂšte.
- Body rate trĂšs faible.
- Upstream queue en hausse.
- Workers saturés, RPS stable.
Le modĂšle positif comme âcontrat runtimeâ
Au lieu de seulement bloquer ce qui ressemble à une attaque, le modÚle positif définit ce qui est normal : routes, méthodes, paramÚtres, types, tailles, headers, content-types, pays, clients, rÎles. Tout écart devient suspect.
Politiques par famille dâendpoints
| Endpoint | Méthodes | Body | ContrÎle fort |
|---|---|---|---|
| /login | POST | JSON court | Rate limit compte/IP/device |
| /api/orders/{id} | GET, PATCH | Schema strict | JWT + schema + velocity |
| /upload/avatar | POST | multipart | Type/size allowlist |
| /admin/* | GET/POST | variable | IP/VPN + MFA + role |
| /health | GET | none | Allow monitoring IP only |
IF uri startswith "/admin" AND NOT client_ip IN trusted_admin_ranges THEN block
Construire le modĂšle sans casser la production
Phase 1 : Observe
- Log-only sur 7 Ă 14 jours selon trafic.
- Identifier endpoints, méthodes, content-types.
- Comparer avec code / routes / OpenAPI.
- Repérer clients légitimes atypiques.
Phase 2 : Enforce
- Activer sur endpoints stables.
- Commencer par méthodes et tailles.
- Ajouter schémas JSON.
- Exceptions documentées et datées.
PiĂšges du modĂšle positif
- Applications trÚs dynamiques : routes et paramÚtres changent souvent ; le modÚle dérive vite.
- Clients mobiles anciens : versions dâAPI non homogĂšnes, formats historiques.
- Partenaires : intégrations B2B hors contrat ou mal documentées.
- GraphQL : un endpoint unique cache une grande variĂ©tĂ© de requĂȘtes.
- Uploads : trop de contraintes peuvent bloquer des fichiers métiers légitimes.
Une rĂšgle WAF doit ĂȘtre explicable
id: 942100 phase: request scope: ARGS|REQUEST_BODY|COOKIES detector: libinjection_sqli severity: critical score: +5 action: block if anomaly_score >= threshold tags: attack-sqli, owasp-a05
Une rĂšgle exploitable en production doit avoir un identifiant stable, un niveau de sĂ©vĂ©ritĂ©, une portĂ©e claire, un message comprĂ©hensible, un tag de risque et une stratĂ©gie dâexception.
Pipeline logique des rĂšgles
Exceptions : chirurgicales, temporaires, auditées
| Mauvaise exception | Bonne exception |
|---|---|
| Désactiver SQLi globalement | Désactiver rÚgle 942100 sur ARGS:query pour /search uniquement |
| Whitelist IP partenaire entiÚre | Créer policy partenaire avec auth + schéma + quotas |
| Abaisser seuil global | Seuil spécifique endpoint + logs renforcés |
| Bypass /api/* | Contrat OpenAPI route par route |
exception: route: /search parameter: q rule_id: 942100 reason: "texte libre avec apostrophes légitimes" owner: "team-search" expires: "2026-09-01"
Gouverner les rĂšgles comme du code
- Versionning : chaque changement de policy doit ĂȘtre tracĂ©.
- Review : double validation pour exceptions critiques.
- Staging : tester sur préproduction et replay de logs.
- Canary : appliquer dâabord Ă un pourcentage faible ou log-only.
- Metrics : faux positifs, blocages, top rules, latence.
- Expiration : toute exception doit avoir une date de revue.
Terminaison TLS au niveau WAAP
Le WAF/WAAP peut terminer TLS pour inspecter les requĂȘtes. Il doit ensuite protĂ©ger le lien vers lâorigine, idĂ©alement en TLS Ă©galement, avec validation du certificat upstream et restriction IP origine.
| Point | Bonne pratique | Risque si absent |
|---|---|---|
| Ciphers | Suites modernes uniquement | Downgrade, conformité faible |
| TLS origin | HTTPS edge â origin | Clair interne exposĂ© |
| Cert origin | Validation stricte | MITM interne possible |
| mTLS | Pour admin/API sensibles | Client non authentifié |
Headers Ă contrĂŽler ou injecter
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload X-Content-Type-Options: nosniff Referrer-Policy: strict-origin-when-cross-origin Permissions-Policy: geolocation=(), microphone=(), camera=() Content-Security-Policy: default-src 'self'; object-src 'none'; frame-ancestors 'none'
CORS : souvent mal compris
| Configuration | Risque | Correction |
|---|---|---|
| Access-Control-Allow-Origin: * | Données exposées si credentials mal gérés | Allowlist domaines |
| Reflect Origin automatiquement | Bypass de politique | Validation stricte |
| Allow-Credentials: true large | Risque session cross-site | Limiter origines + SameSite |
| Methods trop larges | Surface augmentée | GET/POST par route |
IF response.header["Access-Control-Allow-Origin"] == request.header["Origin"] AND origin NOT IN cors_allowlist THEN alert_or_strip_header
Durcissement des cookies
Attributs critiques
- HttpOnly : non accessible JS.
- Secure : uniquement HTTPS.
- SameSite=Lax/Strict selon flux.
- Path/Domain minimisés.
- Expiration raisonnable.
Détection WAAP
- Cookies de session sans Secure.
- Domain trop large.
- Absence HttpOnly.
- Session fixation suspecte.
- Cookie volumineux/anormal.
Un log WAF doit permettre une enquĂȘte
| Champ | Pourquoi |
|---|---|
| trace_id | Corréler WAF, app, gateway, SIEM |
| client_ip / forwarded_for | Attribution réseau prudente |
| user_id hashé | Contexte session sans exposer PII |
| rule_id / group | Comprendre la détection |
| action | allow/block/challenge/log-only |
| payload_sample | Extrait tronqué et masqué |
| upstream_status | Impact cÎté application |
Dashboards utiles
RÚgles les plus déclenchées par app et endpoint.
Tickets, exceptions, endpoints bruyants.
Pays, ASN, IP, bot score, réputation.
Latence, 5xx, timeouts, saturation.
KPIs hebdo: - blocked_requests_by_category - challenged_vs_solved - false_positive_rate - top_attacked_endpoints - policy_exceptions_expiring - mean_time_to_tune
Alertes Ă forte valeur
| Scénario | Condition | Sévérité |
|---|---|---|
| RCE attempt | Command injection ou exploit CVE bloqué | High/Critical |
| Credential stuffing | Ăchecs distribuĂ©s sur comptes multiples | High |
| API enumeration | IDs massifs + 403/404 | Medium/High |
| WAF bypass suspected | 5xx app aprĂšs payload suspect allow | Critical |
| Rule disabled | Exception critique créée | Medium |
Reconstituer un incident applicatif
incident_query: trace_id: req-* src_ip: 203.0.113.50 time_range: 2026-07-06T13:00Z..15:00Z rule_groups: [SQLI, RCE, XSS] include_upstream_5xx: true
Principales topologies
| Topologie | Avantage | Limite |
|---|---|---|
| CDN WAAP | Scalabilité, Anycast, DDoS | Dépendance fournisseur, IP origine à masquer |
| Reverse proxy interne | ContrÎle fin, proximité app | Absorbe moins bien attaques volumétriques |
| Kubernetes Ingress WAF | Intégration cloud native | Tuning par ingress/namespace |
| Sidecar/API gateway | Contexte service riche | Complexité service mesh |
| On-prem appliance | ContrÎle réseau fort | Capacité matérielle, HA nécessaire |
MaĂźtriser les headers de chaĂźne
Le WAF doit savoir quelle IP est réellement le client. Une mauvaise confiance dans X-Forwarded-For peut permettre de contourner des contrÎles par IP.
Client â CDN/WAAP â Load Balancer â Nginx â App Ă sĂ©curiser: - trusted_proxy_ranges - X-Forwarded-For overwrite au premier proxy de confiance - X-Real-IP cohĂ©rent - Forwarded header normalisĂ© - trace_id propagĂ©
Fail-open vs fail-closed
| Mode | Comportement | Usage |
|---|---|---|
| Fail-open | Si WAF indisponible, trafic passe | Apps oĂč disponibilitĂ© prime |
| Fail-closed | Si WAF indisponible, trafic bloqué | Admin, paiement, données sensibles |
| Degraded mode | ContrÎles légers + rate limits | Compromis temporaire |
WAAP dans Kubernetes
Points dâintĂ©gration
- Ingress Controller avec module WAF.
- API Gateway avec OpenAPI.
- Service mesh / sidecar selon criticité.
- External WAAP devant Load Balancer.
Risques
- Multiplication des exceptions par namespace.
- Drift entre ingress et application.
- Secrets TLS mal gérés.
- Bypass via service exposé directement.
Checklist Kubernetes: [ ] Services non exposés directement Internet [ ] Ingress annoté avec policy WAF [ ] OpenAPI versionnée [ ] Logs ingress corrélés avec app trace_id [ ] NetworkPolicy limite accÚs origine
Runbook opérationnel WAF / WAAP
Qui possĂšde quoi ?
| Ăquipe | ResponsabilitĂ© |
|---|---|
| App team | Corriger code, maintenir contrats, valider FP métier |
| Security | Politiques, rĂšgles globales, incident response |
| Platform/DevOps | Déploiement, TLS, HA, logs, CI/CD |
| SOC | Alertes, triage, corrélation, escalade |
| Product | Arbitrer friction UX vs risque métier |
Mesurer la maturité
| KPI | Pourquoi | Cible |
|---|---|---|
| False Positive Rate | Qualité tuning | Tendance baisse |
| Exceptions expirées | Dette sécurité | 0 critique |
| Endpoints inconnus | API drift | 0 public |
| MTTR virtual patch | Réactivité vulnérabilité | Heures, pas jours |
| Coverage blocking | Surface protégée activement | Par criticité |
| Alert precision | Utilité SOC | High signal |
Roadmap de maturité WAAP
WAF en log-only, rÚgles de base, visibilité initiale.
Blocking sur OWASP, tuning, SIEM, runbook FP.
API schema validation, bot defense, rate limits métier.
Policy as code, replay tests, canary, ownership par équipe.
WAAP adaptatif, risk scoring, SOAR, feedback DevSecOps.
