Set-OPS-Public/roles/serveur_web_frontal/README.md
Daniel Allaire 3fe7e3cea3 web frontal = reverse proxy + WAF ; le dorsal porte les sites
Le frontal derive ses vhosts des expositions publiques (meme derivation que l edge),
filtre par ModSecurity v3 + OWASP CRS (DetectionOnly d abord, eprouve), refuse les noms
inconnus, et ne sert plus rien lui-meme. Les sites statiques passent au dorsal, relaye
par l edge et par le frontal. Sondes : frontal (nouvelle), sites-servis suit le dorsal.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-29 16:48:42 -04:00

34 lines
1.8 KiB
Markdown

# 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`.