40 lines
2.2 KiB
Django/Jinja
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}."
|