Set-OPS-Public/roles/serveur_web_frontal/templates/sonde-frontal.sh.j2
2026-09-29 18:09:02 -04:00

40 lines
2.2 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='{{ {'On': 'blocage', 'DetectionOnly': 'detection seule', 'Off': 'ETEINT'}.get(serveur_web_frontal_waf_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}."