#!/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