Auditd

Siehe auch

Verwandte Artikel
Offizielle Dokumentation
  • man auditd, man auditd.conf, man auditctl, man audit.rules

  • man ausearch, man aureport, man augenrules

Linuxfabrik

Das Linux Auditing System „auditd“ hilft SysAdmins bei der Erstellung eines „Audit-Trails“, also eines Protokolls für jede Aktion auf dem Server. auditd protokolliert standardmässig SELinux AVCs, Systemanmeldungen, Kontoänderungen und Authentifizierungsereignisse in /var/log/audit/audit.log. Die Aufzeichnung der Ereignisse kann je nach Umfang und Auslastung der Systeme einiges an Speicherplatz beanspruchen (mehrere GByte Textdateien täglich).

Wichtig: auditd bietet keine zusätzliche Sicherheit, aber hilft dabei, Verstösse gegen Systemrichtlinien zu verfolgen und so zusätzliche Sicherheitsmassnahmen zu implementieren. Es ist zudem die einzige Möglichkeit, ohne Zusatzsoftware und Shell-unabhängig sauber und sicher Aktivitäten zu loggen.

Begriffe
  • Audit Event: ein einzelner, im Kernel ausgelöster Eintrag, bestehend aus einem oder mehreren Datensätzen mit gleicher msg=audit(<timestamp>:<id>)-Klammer.

  • auid (audit UID): die UID, unter der der Benutzer ursprünglich eingeloggt war, unabhängig von späteren su/sudo-Wechseln. Dadurch ist auditd die einzige Quelle, die „wer hat die Aktion wirklich veranlasst“ zuverlässig beantwortet.

  • immutable / locked (``-e 2``): sperrt die Audit-Konfiguration bis zum Reboot. Ein Muss auf CIS-gehärteten Systemen.

  • Key / Filter-Key: frei gewählter Tag (-k <name>) an einer Regel, der das Durchsuchen der Logs per ausearch --key ermöglicht.

  • Syscall-Rule: Regel, die beim Aufruf eines bestimmten Systemaufrufs (z.B. unlink, execve) feuert. Architektur-abhängig (arch=b32, arch=b64), daher fast immer paarweise konfiguriert.

  • Watch-Rule: Regel, die beim Zugriff auf eine Datei oder ein Verzeichnis feuert (-w /pfad -p <permissions>). Watches sind intern Syscall-Rules mit Pfad-Filter.

Log-Format

auditd wird für seine kryptischen Eventlogs geliebt. Beispiel mit künstlichen Zeilenumbrüchen und Kommentaren:

type=CRYPTO_KEY_USER                    Was wurde auditiert?
msg=audit(1671611910.534:108057):       Timestamp:Audit Event Number
pid=8940
uid=0
auid=299006                             Audit-ID des Users, der die Meldung getriggert hat
ses=4305
subj=system_u:system_r:sshd_t:s0-s0:c0.c1023
msg='op=destroy  kind=server  fp=SHA256:de:3e:84:f7  direction=?  spid=896440  suid=0   exe="/usr/sbin/sshd"  hostname=?  addr=?  terminal=?  res=success'
UID="root"
AUID="john.doe"
SUID="root"

Wichtige Event-Typen (Auswahl, vollständige Liste in der auditd(8)-Manpage):

  • ANOM_PROMISCUOUS: ein Interface wurde in den Promiscuous-Mode gesetzt (potenziell Sniffer).

  • AVC: SELinux Access Vector Cache Denial.

  • CRED_ACQ / CRED_DISP: Credential-Lifecycle (Acquire, Dispose).

  • PATH: begleitet einen SYSCALL-Record und nennt den betroffenen Pfad.

  • SYSCALL: ein Syscall hat eine Syscall-Rule ausgelöst.

  • USER_AUTH: Authentifizierungsversuch.

  • USER_LOGIN / USER_LOGOUT: Login-/Logout-Ereignisse (pam_loginuid).

  • USYS_CONFIG: Audit-Config wurde geändert (-e 2 wäre dann eigentlich aktiv gewesen).

Für die Anzeige mit aufgelösten IDs (uid → Benutzername) log_format = ENRICHED in der auditd.conf setzen oder ausearch --interpret verwenden.

Konfiguration

Die zentrale Datei ist /etc/audit/auditd.conf. Die wichtigsten Parameter (alphabetisch):

admin_space_left / admin_space_left_action

Härtere Schwelle (Default 50 MiB) mit typischerweise restriktiverer Aktion (single, halt).

flush

none, incremental, incremental_async, data, sync. Produktion zwischen incremental_async (schneller, Default) und sync (paranoid) entscheiden.

log_file

Pfad des Audit-Logs. Default /var/log/audit/audit.log.

log_format

RAW (Kernel-Format, Default) oder ENRICHED (UIDs, Syscalls und Socket-Adressen werden vor dem Schreiben aufgelöst). ENRICHED kostet Plattenplatz, erleichtert aber die nachträgliche Auswertung auf einem anderen Host.

max_log_file

Maximalgrösse der Log-Datei in MiB, bevor max_log_file_action greift.

max_log_file_action

Eine der folgenden Aktionen: ignore, syslog, suspend, rotate, keep_logs, oder exec /pfad. Auf Produktivsystemen fast immer rotate mit num_logs >= 5 kombinieren.

name_format

none, hostname, fqd, numeric, user. Wichtig in zentralen Log-Collectors, damit aggregierte Logs ihre Herkunft behalten.

num_logs

Anzahl rotierter Dateien. Unter 2 findet keine Rotation statt, maximal 999. Ein vernünftiger Start ist num_logs = 5.

space_left / space_left_action

Schwellwert in MiB (Default 75) und die Aktion (syslog, email, exec, halt, single, suspend), wenn die Platte langsam voll läuft.

Regeln

Regeln landen in /etc/audit/rules.d/*.rules und werden beim Start von augenrules --load in der alphabetischen Dateien-Reihenfolge zusammengefügt. Die Reihenfolge ist entscheidend („first-match wins“).

Syscall-Regeln feuern beim Aufruf eines Systemcalls. Beispiel: das Löschen oder Umbenennen von Dateien durch alle echten Benutzer (UID ab 1000) auf 64-Bit-Systemen protokollieren (32-Bit-Variante gleich darunter):

/etc/audit/rules.d/linuxfabrik-deletion.rules
-a always,exit -F arch=b64 -S unlink -S unlinkat -S rename -S renameat -F auid>=1000 -F auid!=4294967295 -k delete
-a always,exit -F arch=b32 -S unlink -S unlinkat -S rename -S renameat -F auid>=1000 -F auid!=4294967295 -k delete

Tipp

-F auid!=4294967295 ignoriert Daemon-Events. Der Wert -1 / 4294967295 steht für „keine audit UID gesetzt“ und erscheint bei allen vom Kernel/Init direkt gestarteten Prozessen.

Watch-Rules feuern beim Zugriff auf einen Pfad und sind kompakter als Syscall-Rules:

/etc/audit/rules.d/linuxfabrik-watch.rules
# log changes to the shadow file
-w /etc/shadow -p wa -k identity
# log changes to the sshd config
-w /etc/ssh/sshd_config -p wa -k sshd
# log kernel module load/unload
-w /usr/sbin/insmod -p x -k module-load
-w /usr/sbin/rmmod  -p x -k module-load

Rechte-Flags bei -p:

  • r: read

  • w: write

  • x: execute

  • a: attribute change (chmod/chown/setxattr/…)

Konfiguration einfrieren (CIS-Vorgabe) in der letzten geladenen Datei (z.B. 99-finalize.rules):

/etc/audit/rules.d/99-finalize.rules
-e 2

Nach Änderungen Regeln neu laden:

augenrules --load
# or
systemctl reload auditd

augenrules --check gibt aus, ob die zusammengesetzten Rules mit dem aktiven Kernel-Regelwerk übereinstimmen.

Abfrage

ausearch

Ereignisse nach verschiedenen Kriterien durchsuchen:

# last 10 minutes, all events with key "delete"
ausearch --start recent --key delete --interpret

# failed login attempts since this morning
ausearch --start today --message USER_LOGIN --success no --interpret

# all events for a given user
ausearch --user-name alice --interpret

# all events for a given PID
ausearch --process 12345 --interpret
aureport

Zusammenfassungen:

# overall summary
aureport --summary

# failed login attempts
aureport --login --failed

# top executables that produced audit events
aureport --executable --summary

# anomalous events (promiscuous mode, abnormal termination, ...)
aureport --anomaly
auditctl

Laufzeit-Abfrage und temporäre Änderungen:

# current audit status
auditctl --status

# list all active rules
auditctl -l

# temporary rule (gone after next reboot)
auditctl -w /etc/passwd -p wa -k identity

CIS-Benchmark-Regelsatz

Die CIS-Benchmark (Abschnitt System Auditing) schlägt einen umfangreichen, produktionstauglichen Satz von Regeln vor. Die Kategorien sind für viele Compliance-Vorgaben (PCI DSS, STIG, BSI IT-Grundschutz) der Referenzpunkt:

Authentifizierung und Privilegien

/etc/sudoers und /etc/sudoers.d/ (Änderungen überwachen), das sudo-Log, Privileged-Commands (Binaries mit SUID/SGID), usermod, /etc/security/opasswd.

Identität und Accounts

/etc/passwd, /etc/shadow, /etc/group, /etc/gshadow, /etc/nsswitch.conf, /etc/pam.conf, /etc/pam.d/.

System- und Zeitkonfiguration

Datum/Zeit-Syscalls (adjtimex, settimeofday, clock_settime), /etc/issue, /etc/issue.net, /etc/hosts, /etc/hostname, /etc/sysconfig/network, /etc/NetworkManager/, sethostname, setdomainname.

Dateisystem

Erfolgreiche Mounts, Löschungen per unlink/unlinkat/rename/ renameat, DAC-Änderungen (chmod, fchmod, fchmodat, chown, fchown, fchownat, lchown, setxattr, lsetxattr, fsetxattr, removexattr, lremovexattr, fremovexattr), chcon, setfacl, chacl.

Session und Audit selbst

/var/log/wtmp, /var/log/btmp, /var/log/lastlog (Session-Initiation, Login/Logout), SELinux / AppArmor MAC-Konfiguration, Kernel-Modul-Syscalls (init_module, finit_module, delete_module, query_module), /etc/audit/audit.rules selbst und das Einfrieren der Config mit -e 2.

Die konkreten Regel-Zeilen stehen im CIS-Benchmark-PDF bzw. in den automatisierten Hardening-Playbooks wie dem linuxfabrik.lfops.audit-Rollen-Beispiel. Beim Ausrollen darauf achten, dass die Regeln am Ende einer Datei 99-finalize.rules mit -e 2 gesperrt werden und die Backlog-Grösse ausreichend ist, sonst verwirft der Kernel Events (lost in auditctl --status).

Best Practices

  • Keine Regel-Inflation. Jede zusätzliche Regel kostet Platz und Performance. Typische Server brauchen keine hundert Regeln; die CIS-Benchmark-Profile oder die STIG-Regelsätze sind ein sinnvoller Startpunkt.

  • Keys verwenden. Jede Regel sollte ein -k <name> haben - das macht ausearch brauchbar.

  • ``log_format = ENRICHED`` auf Systemen, die Logs an einen zentralen Collector weitergeben (z.B. Graylog). Die UID-Auflösung auf dem aggregierenden Host ist sonst nicht möglich.

  • Log-Rotation mit space-Aktionen absichern. space_left_action = syslog + eine adäquate Monitoring-Alarmierung verhindert überraschende Vollplatten.

  • ``-e 2`` am Ende der Regeln. Verhindert, dass ein kompromittiertes root-Konto die Regeln zur Laufzeit deaktiviert. Nachteil: Regeln lassen sich bis zum nächsten Reboot nicht mehr ändern.

RHEL/Debian-Unterschiede

Paketnamen
  • RHEL: audit, audit-libs (out-of-the-box installiert)

  • Debian/Ubuntu: auditd (nicht per Default installiert)

Tools
  • ausearch, aureport, auditctl, augenrules: identisch auf beiden Plattformen.

Default-Regeln
  • RHEL: ab RHEL 9 sind keine Default-Regeln mehr in /etc/audit/rules.d/ aktiv; Red Hat liefert Beispiel-Regelsätze unter /usr/share/audit/sample-rules/.

  • Debian/Ubuntu: ebenfalls keine Default-Regeln, Beispiele unter /usr/share/doc/auditd/examples/.

Troubleshooting

auditctl --status meldet lost > 0

Der Kernel-Backlog ist übergelaufen; einzelne Events wurden verworfen. Ursache ist meist eine zu niedrige backlog_limit oder ein langsames Log-Target. Werte zeitweise hochziehen (auditctl --backlog_limit 8192) und die Regel-Menge durchforsten. failure 1 loggt in syslog, failure 2 macht einen Kernel-Panic (nur für Umgebungen, in denen das gewollt ist).

augenrules --load gibt rule exists zurück

Die Regel ist bereits aktiv. Bei Config-Änderungen zuerst auditctl -D ausführen, dann augenrules --load.

Regel wird beim Boot nicht aktiv

Die Datei in /etc/audit/rules.d/ wurde vermutlich aus der Alphabet-Reihenfolge gekippt. augenrules konkateniert die Dateien in Reihenfolge der Namen; numerische Präfixe (10-, 50-, 99-) sind Standard.

Enorme Log-Menge nach Aktivierung

Entweder ist eine zu breite Syscall-Rule konfiguriert (z.B. -S execve ohne Filter) oder das System ist stark ausgelastet. aureport --executable --summary zeigt die Top-Verursacher.