Set-OPS-Public/roles/auditd/templates/sonde-audit.sh.j2

49 lines
1.9 KiB
Text
Raw Normal View History

#!/bin/bash
# GENERE par Set-OPS (role auditd). Ne pas editer a la main.
#
# SONDE « audit » — QUELQU'UN COLLECTE-T-IL, vraiment ?
#
# ELLE NE COMPTE PAS LES REGLES, ET C'EST TOUT SON OBJET. Le 2026-08-30, sur les quinze
# machines de Chezlepro, `auditctl -l` affichait onze regles armees dans le noyau pendant
# qu'`auditd` etait mort : un doublon dans `rules.d/` faisait echouer `audit-rules.service`,
# dont le demon depend. Une sonde qui aurait compte les regles aurait dit « vert » pendant
# toute la panne. On mesure donc la COLLECTE — le service, puis l'ecriture.
#
# Contrat : docs/supervision-conception.md (API des greffons Nagios) — une ligne, 0/1/2.
# Mise en defaut PAR PARAMETRE : `auditd_sonde_age_max` (le baisser a 1).
set -uo pipefail
JOURNAL=/var/log/audit/audit.log
AGE_MAX={{ auditd_sonde_age_max }}
# Les regles ne sont PAS le verdict : elles partent en perfdata, pour que le diagnostic
# distingue « rien d'arme » de « arme mais personne ne collecte ».
regles=$(auditctl -l 2>/dev/null | grep -cvE '^No rules$' || true)
regles=${regles:-0}
if ! systemctl is-active --quiet auditd; then
echo "auditd ne tourne pas : ${regles} regle(s) peuvent etre armees, personne ne collecte." \
"| regles=${regles} age=U taille=0B"
exit 2
fi
if [[ ! -f "${JOURNAL}" ]]; then
echo "auditd tourne mais ${JOURNAL} n'existe pas : rien n'est ecrit." \
"| regles=${regles} age=U taille=0B"
exit 2
fi
taille=$(stat -c%s "${JOURNAL}" 2>/dev/null || echo 0)
age=$(( $(date +%s) - $(stat -c%Y "${JOURNAL}" 2>/dev/null || echo 0) ))
if (( age > AGE_MAX )); then
echo "auditd tourne mais n'a rien ecrit depuis ${age} s (seuil ${AGE_MAX} s) :" \
"collecte suspendue, disque plein ou regles vides." \
"| regles=${regles} age=${age}s;${AGE_MAX} taille=${taille}B"
exit 1
fi
echo "Audit collecte : ecriture il y a ${age} s, ${regles} regle(s) armee(s)." \
"| regles=${regles} age=${age}s;${AGE_MAX} taille=${taille}B"
exit 0