# serveur_web_frontal **Reverse proxy et WAF devant les services web PUBLICS du locataire.** C'est la porte publique : la frontière redirige l'adresse publique que le site attribue au locataire (80/443) vers lui ; il filtre et relaie. **Il ne sert rien lui-même** — les sites et les applications vivent sur le web **dorsal** (`serveur_web_dorsal`). L'**edge** (`serveur_nginx`) est l'autre porte : les services **internes** (`*.internal`), pour la zone d'administration. Les deux ne se remplacent pas. ## Ce que le rôle fait 1. nginx + **ModSecurity v3** (`libnginx-mod-http-modsecurity`) + **OWASP CRS** (`modsecurity-crs`), tous paquets Debian, tout libre ; 2. compose le WAF (`/etc/nginx/setops-waf/main.conf`) : moteur, mode, CRS et ses exclusions — l'inclusion livrée par Debian ne charge que le moteur ; 3. un vhost par **exposition publique** : les FQDN que `applications.yml` expose dans un domaine dont `plan/domaines.yml` désigne ce frontal (`edge: serveur_web_frontal`) — la même dérivation que l'edge ; 4. un serveur par défaut qui **refuse tout nom inconnu** (`return 444`) ; 5. la sonde `frontal` : nginx actif et configuration valide, WAF chargé et CRS présent, chaque exposition publique servie à travers lui. ## Le WAF `serveur_web_frontal_waf_mode: DetectionOnly` d'abord : le CRS journalise ce qu'il aurait bloqué (`/var/log/nginx/modsec_audit.log`) sans rien refuser. On lit, on ajuste les exclusions pour les applications réelles, **puis** `On`. Éprouvé le 2026-09-29 (Debian 13, nginx 1.26, CRS 3.3.7) : une injection SQL est journalisée (942100) en détection, refusée (403) en blocage ; une requête saine passe dans les deux cas. ## TLS En clair (80) tant que le certificat **Let's Encrypt** des noms publics n'est pas en place. ## Validation `ansible-lint` profil production + `--syntax-check` ; sonde `frontal`.