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>
40 lines
2.1 KiB
Django/Jinja
40 lines
2.1 KiB
Django/Jinja
#!/bin/bash
|
|
# GENERE par Set-OPS (role serveur_web_frontal). Ne pas editer a la main.
|
|
#
|
|
# SONDE « frontal » — le reverse proxy public tient, son WAF est charge, et chaque
|
|
# exposition publique repond a travers lui.
|
|
#
|
|
# Contrat : docs/supervision-conception.md (API des greffons Nagios) — une ligne, 0/1/2.
|
|
# Mise en defaut PAR PARAMETRE : `serveur_web_frontal_waf_mode` (une valeur que le moteur
|
|
# refuse fait echouer `nginx -t`).
|
|
set -uo pipefail
|
|
|
|
MODE='{{ serveur_web_frontal_waf_mode }}'
|
|
EXPOSITIONS="{{ serveur_web_frontal_expositions | default([]) | map(attribute='fqdn') | unique | sort | join(' ') }}"
|
|
|
|
systemctl is-active --quiet nginx || { echo "Le frontal (nginx) n'est pas actif : les services publics sont injoignables."; exit 2; }
|
|
nginx -t >/dev/null 2>&1 \
|
|
|| { echo "Le frontal sert, mais sa configuration sur disque est INVALIDE : le prochain demarrage echouera."; exit 2; }
|
|
|
|
# LE WAF EST-IL VRAIMENT DANS LE CHEMIN ? Un module non charge, ou des regles absentes,
|
|
# laissent passer tout le trafic sans rien dire : le frontal reste « vert ».
|
|
conf=$(nginx -T 2>/dev/null)
|
|
grep -q "ngx_http_modsecurity_module" <<<"${conf}" \
|
|
|| { echo "Le module ModSecurity n'est pas charge : le frontal relaie SANS filtrer."; exit 2; }
|
|
grep -q "modsecurity-crs/rules" '{{ serveur_web_frontal_waf_dir }}/main.conf' 2>/dev/null \
|
|
|| { echo "Les regles OWASP CRS ne sont pas chargees : le WAF n'a rien a appliquer."; exit 2; }
|
|
|
|
servies=0; en_defaut=()
|
|
for n in ${EXPOSITIONS}; do
|
|
code=$(curl -s -o /dev/null -w '%{http_code}' --max-time 8 -H "Host: ${n}" http://127.0.0.1/ 2>/dev/null)
|
|
if [[ "${code}" =~ ^[234][0-9][0-9]$ ]]; then servies=$((servies + 1)); else en_defaut+=("${n}=${code:-000}"); fi
|
|
done
|
|
if [[ -n "${en_defaut[*]:-}" ]]; then
|
|
echo "Le frontal repond, mais des expositions publiques ne sont PAS servies : ${en_defaut[*]} (000 = silence, 5xx = amont en defaut). WAF ${MODE}."
|
|
exit 2
|
|
fi
|
|
if [[ -z "${EXPOSITIONS}" ]]; then
|
|
echo "Frontal pret (WAF CRS en ${MODE}) : aucune exposition publique declaree pour l'instant."
|
|
exit 0
|
|
fi
|
|
echo "Frontal : ${servies} exposition(s) publique(s) servie(s), WAF CRS en ${MODE}."
|