Auditd et Journald : un socle de journaux
Construire une journalisation resistante a l'effacement sous Linux : journald persistant, framework auditd, surveillance de fichiers sensibles et export distant.
Des journaux ne servent que s'ils survivent a un redemarrage, a un disque plein et a un attaquant. Une installation Linux par defaut echoue sur au moins un de ces points. Ce socle rend journald persistant et borne, deploie le framework d'audit du noyau pour surveiller les fichiers sensibles, puis exporte tout hors de la machine afin que rien ne puisse etre efface en silence. C'est la fondation sur laquelle s'appuie le reste de la serie.
Rendre journald persistant et borne
Sur beaucoup de distributions le journal reside dans /run et disparait au redemarrage. Rendez-le persistant et plafonnez sa taille pour qu'il ne sature jamais le disque. Editez /etc/systemd/journald.conf :
[Journal]
Storage=persistent
Compress=yes
SystemMaxUse=2G
SystemKeepFree=1G
MaxRetentionSec=1month
ForwardToSyslog=yes
Storage=persistent ecrit dans /var/log/journal, SystemMaxUse fixe le plafond strict et ForwardToSyslog=yes permet a rsyslog de recuperer les evenements pour les transmettre. Appliquez et verifiez :
sudo mkdir -p /var/log/journal
sudo systemctl restart systemd-journald
journalctl --disk-usage
journalctl -p err -b # toutes les erreurs depuis le demarrage courant
Installer et configurer auditd
Le sous-systeme d'audit du noyau enregistre les appels systeme et les acces fichiers que journald seul ne couvre pas. Installez et activez le demon :
sudo apt install auditd audispd-plugins # Debian/Ubuntu
sudo systemctl enable --now auditd
Definissez une retention saine dans /etc/audit/auditd.conf pour ne jamais perdre de donnees d'audit en silence :
max_log_file = 50
num_logs = 10
max_log_file_action = keep_logs
space_left = 500
space_left_action = email
admin_space_left_action = halt
max_log_file_action = keep_logs empeche auditd d'ecraser d'anciennes preuves, et les actions space_left alertent un administrateur avant la saturation de la partition.
Surveiller les fichiers qui comptent
Les regles d'audit se trouvent dans /etc/audit/rules.d/audit.rules. Surveillez les fichiers d'identite, les chemins d'escalade et l'horloge, c'est-a-dire ce qu'un attaquant manipule. Creez /etc/audit/rules.d/hardening.rules :
## Identite et authentification
-w /etc/passwd -p wa -k identity
-w /etc/shadow -p wa -k identity
-w /etc/group -p wa -k identity
-w /etc/sudoers -p wa -k privesc
-w /etc/sudoers.d/ -p wa -k privesc
## Configuration d'acces distant
-w /etc/ssh/sshd_config -p wa -k sshd
## Escalade de privileges
-a always,exit -F arch=b64 -S execve -F euid=0 -F auid>=1000 -F auid!=4294967295 -k privesc
## Changements d'heure
-a always,exit -F arch=b64 -S adjtimex,settimeofday,clock_settime -k time-change
-w /etc/localtime -p wa -k time-change
## Verrouiller la configuration jusqu'au redemarrage
-e 2
Chargez les regles et confirmez qu'elles sont actives :
sudo augenrules --load
sudo auditctl -l
Le -e 2 final active le mode immuable. Gardez-le en dernier, car aucune regle ne peut plus etre ajoutee une fois qu'il est defini. Interrogez les evenements collectes par leur cle :
sudo ausearch -k identity --start today
sudo ausearch -k privesc -i
sudo aureport --auth --summary
Exporter les journaux hors de la machine
Le journal d'audit est lui-meme une cible : un attaquant root peut modifier ou supprimer /var/log/audit/audit.log. Pour contrer cela, transmettez les evenements en temps reel vers un collecteur distinct. ForwardToSyslog=yes etant deja en place, pointez rsyslog vers un hote distant dans /etc/rsyslog.d/90-remote.conf :
*.* @@logcollector.internal:6514 # @@ = TCP ; utilisez TLS en production
sudo systemctl restart rsyslog
Ainsi, meme si les journaux locaux sont effaces, le collecteur conserve les preuves. Cela se combine naturellement avec la surveillance d'integrite traitee dans la detection d'intrusion, et la piste d'audit alimente les rapports attendus par les referentiels de conformite.
Verifier
journalctl --disk-usage # le journal est borne et persistant
sudo auditctl -s | grep enabled # attendu "enabled 2" (immuable)
sudo auditctl -l | wc -l # regles chargees
sudo ausearch -k privesc -i | tail # evenements d'escalade enregistres
logger "test socle audit" && journalctl -n1 | grep test # chemin de transmission ok
Si enabled renvoie 2, que le journal est persistant et que vos cles remontent des evenements, le socle tient. A partir de la, affinez ce que rapporte auditd avec les refus du controle d'acces obligatoire et correlez les identites d'audit avec l'hygiene des comptes et privileges.