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>
34 lines
1.8 KiB
Markdown
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`.
|