Das hier vorgestellte Audit-Framework ist Bestandteil des Linux-Kernels und daher in der Lage, Zugriffe auf einem Rechner bis auf Systemcall-Ebene zu kontrollieren. Dank der Integration in den Kernel entgeht dem Subsystem tatsächlich nichts. Sämtliche Zugriffe auf Dateien, Netzwerkports oder sonstige Ereignisse lassen sich hiermit überwachen. Auch das Security-Enhanced Linux (SELinux), das ebenfalls im Kernel integriert ist, greift zum Logging auf das Audit-Framework zurück.
Die Regeln für das Logging legen Sie mit dem Tool "auditctl" fest. Es ist, ebenso wie alle anderen hier erwähnten Tools, Bestandteil des "audit"-Pakets, das im Software-Repository Ihrer Linux-Distribution enthalten ist. Der im Userspace laufende "auditd" wird über das Netlink-Protokoll über aufgetretende Events benachrichtigt. Diese schreibt der Audit-Daemon dann in die Datei . Über "aureport" und "ausearch" können Sie sich die Ergebnisse anschließend anzeigen lassen und diese auswerten.
Teil des Frameworks ist ebenfalls ein Event-Dispatcher. Hierbei handelt es sich um eine Art Event-Multiplexer, der Audit-Events in Realtime an ein anderes Programm (Plug-In) weiterreichen kann. Diese Plug-Ins lassen sich über Dateien im Verzeichnis "/etc/audisp/plugins.d/" konfigurieren. Die Datei beispielsweise ist dafür verantwortlich, Audit-Events einfach an einen Unix-Domain-Socket weiterzureichen. Dieser Socket wird vom "setroubleshoot"-Daemon dazu verwendet, leicht lesbare Meldungen aus den rohen SELinux-Logs zu erzeugen. Auch Intrusion-Detection/Prevention-Systeme können auf diese Schnittstelle zurückgreifen, um auf Audit-Events entsprechend reagieren zu können.
Den "auditd"-Server konfigurieren Sie über zwei Dateien in "/etc/audit/": (siehe Listing) und "audit.rules". Erstere legt allgemeine Informationen über den Dienst fest, Letztere enthält die eigentlichen Regeln, die festlegen, was genau Sie auf dem System überwachen wollen. Regeln können Sie ebenfalls über mehrere Dateien trennen und diese dann im Verzeichnis "/etc/audit/rules.d/" ablegen. Dies ist dann sinnvoll, wenn Sie Regeln nach deren Einsatzzweck in eigenen Dateien verwalten wollen. Das Tool augenrules generiert aus allen Dateien in diesem Verzeichnis dann eine globale Datei . Diese wird dann beim Start des auditd eingelesen. Eine Beschreibung der einzelnen Anweisungen finden Sie in der sehr ausführlichen Manpage von "auditd.conf".
Listing: auditd.conf
log_file = /var/log/audit/audit.log log_format = RAW log_group = root priority_boost = 3 flush = INCREMENTAL freq = 20 num_logs = 5 disp_qos = lossy dispatcher = /sbin/audispd name_format = NONE max_log_file = 6 max_log_file_action = ROTATE space_left = 75 space_left_action = SYSLOG action_mail_acct = root admin_space_left = 50 admin_space_left_action = SUSPEND disk_full_action = SUSPEND disk_error_action = SUSPEND tcp_listen_queue = 5 tcp_max_per_addr = 1 ##tcp_client_ports = 1024-65535 tcp_client_max_idle = 0 enable_krb5 = no krb5_principal = auditd
Um die eigentlichen Audit-Regeln zu bestimmen, greifen Sie entweder auf das Tool "auditctl" zurück oder hinterlegen sie in der Datei . Mittels "auditctl -R" lesen Sie die dort definierten Regeln dann ein. Möchten Sie beispielsweise die Datei überwachen, können Sie dafür den folgenden Befehl verwenden:
auditctl -w /etc/hosts -p war -k hosts-file
Die Option "-w" legt den Pfad zu der Datei fest, die Sie überwachen wollen (File-Watch). Mittels "-p" definieren Sie die zu überwachenden Operationen, wobei "r" für Lesen, "w" für Schreiben, "x" für Ausführen und "a" für Attribut-Änderungen steht. Schließlich setzt die Option "-k" einen Filter-Key. Mittels "au-search" können Sie sich später die Events der Datei anzeigen lassen.
Möchten Sie den gleichen Wert dauerhaft setzen, fügen Sie den folgenden Eintrag der Datei hinzu:
-w /etc/hosts -p war -k hosts-file
Alle aktuell aktiven Regeln zeigt das Tool "auditctl" an:
# auditctl -l
w /etc/hosts -p rwa -k hosts-file
Neben diesen einfachen File-Watches lassen sich auch komplexere Zugriffe überwachen. Hierfür stehen vier verschiedene Listen zur Verfügung: "task", "exit", "user" und "exclude". "task" wird für das Erzeugen neuer Prozesse mittels "fork()" oder "clone()" verwendet, "exit" bei jedem Syscall Aufruf, "user" filtert Meldungen aus dem Userspace und mittels "exclude" lassen sich bestimmte Meldungen unterdrücken. Das ist beispielsweise hilfreich, wenn Sie bestimmte Syscalls loggen, jedoch keine SELinux AVC (Access Vector Cache) Meldungen in den Logs sehen wollen.