Created: 2023-02-09 Thu 10:17
/etc/audit/auditd.conf wurde vom Audit-Subsystem Projekt in den
letzten 20 Jahren nicht aktualisiert und sollte daher vor der
Inbetriebnahme des Audit-Subsystems (oder SELinux) auf sinnvolle
Werte überprüft werdenDer Audit-Daemon kann Log-Events vom Linux-Kernel oder über das Netzwerk von einem anderen Linux System per Remote-Audit Logging empfangen (Remote Audit Logging ist ein anderes Protokoll als syslog)
local_events = yes # "no" to receive
# remote log-data only
yes
In der Standard-Konfiguration werden die Log-Daten in die Datei
/var/log/audit/audit.log geschrieben. Für zentrale
Audit-Logserver ist es sinnvoll wenn diese Datei auf einem
separaten Dateisystem liegt
write_logs = yes # set to "no" for
# only remote logging
log_file = /var/log/audit/audit.log
Sollen die Log-Informationen von anderen Benutzer als dem Superuser
root gelesen werden, so sollte die Gruppen-Zugehörigkeit der
Log-Datei angepasst werden (z.B. auf die Gruppe wheel)
log_group = root log_format = ENRICHED # "enriched" or "raw"
enriched werden die Log-Daten vom Audit-Daemon
mit Metadaten versehen, welche die Auswertung der Log-Daten
vereinfachen. Bei der Einstellung raw werden die Log-Daten wie
vom Linux-Kernel gesendet gespeichert
Der Parameter flush zusammen mit dem Parameter freq bestimmt,
wann die Log-Daten vom Audit-Daemon in die Log-Datei geschrieben
werden. In der Standard-Einstellung werden die Log-Daten spätestens
nach 50 Meldungen im Puffer geschrieben.
priority_boost definiert die Prozess-Priorität
des Audit-Daemon gegenüber normalen Benutzerprogrammen im System
(vergleichbar mit einem negativen nice Wert) und verhindert,
das der Audit-Daemon von einem Benutzerprogramm ausgebremst wirdflush = INCREMENTAL_ASYNC freq = 50 priority_boost = 4
Der Audit-Daemon kann selbstständig die Log-Dateien rotieren, wenn die Log-Datei eine definierte Größe erreicht.
space-left Event gelöscht(!)max_log_file = 8 # Max Groesse der Log-Datei in MB num_logs = 5 # Anzahl Generationen der Log-Datei # Aktion beim Erreichen der max. Log-Groesse max_log_file_action = ROTATE
Der Audit-Log-Daemon kann die Log-Informationen um den Rechnernamen des Quell-Hosts anreichern
name ist der Hostname / Domain, welche den Log-Daten hinzugefügt
wird wenn bei name_format der Wert user eingetragen wurdename_format = NONE ##name = mydomain
name_format:| Wert | Beschreibung |
|---|---|
| NONE | Keine Quell-Host Metadaten |
| HOSTNAME | Der Hostname des Systems (gethostname) |
| FQDN | Voller Domain-Name durch DNS Auflösung |
| NUMERIC | IP(v4) Adresse des Hosts |
| USER | Wert des name Parameters |
Der Audit-Daemon kann bei außergewöhnlichen Systemzuständen (Fehler im Dateisystem oder in der Storage Hardware, kein Platz auf dem Speichermedium) E-Mail Warnungen an die Administratoren versenden
action_mail_acct ist ein lokaler E-Mail Benutzer, oder eine
externe E-Mail Adresse. Ein MTA Programm muss unter
/usr/lib/sendmail installiert seinverify_email prüft ob der Domain-Name der angegebenen E-Mail
Adresse per DNS aufgelöst werden kannverify_email = yes action_mail_acct = root
Der space_left Wert gibt an, ab welchem Limit an freiem Speicher
auf dem Speichermedium der Log-Datei der Audit-Daemon eine Warnung
absetzen soll
syslog
geschrieben25%)space_left = 75 space_left_action = SYSLOG
Der admin_space_left Wert gibt an, ab welchem Limit an freiem
Speicher auf dem Speichermedium der Log-Datei der Audit-Daemon
seine Arbeitsweise ändern soll. Dieser Wert sollte geringer als
space_left sein.
5%)admin_space_left = 50 admin_space_left_action = SUSPEND
disk_full_action = SUSPEND disk_error_action = SUSPEND
| Schlüsselwort | Beschreibung |
|---|---|
| ignore | Zustand ignorieren, keine Aktion |
| syslog | Zustand via syslog melden |
| rotate | Log-Dateien rotieren, überflüssige Log-Dateien entfernen |
| exec | Ein Skript ausführen |
| suspend | Keine Log-Daten mehr schreiben |
| single | System in den Single-User-Mode versetzen, Netzwerk deaktivieren |
| halt | System herunterfahren (shutdown) |
Hierzu werden Plugins geladen welche das jeweilige Logging-Protokoll implementieren
/etc/audit/plugins.dmax_restarts gibt an wie oft ein Plugin nach einen Crash von
Audit-Daemon neu gestartet wirdmax_restarts = 10 plugin_dir = /etc/audit/plugins.d
Um ein Plugin zu aktivieren wird der Wert active auf yes
gesetzt und danach der Audit-Daemon neu gestartet
active = no direction = out path = /sbin/audisp-syslog type = always args = LOG_INFO format = string
auditd.conf
werden für den Empfang von Audit-Log-Daten über das Netzwerk benötigt
# systemctl status auditd
● auditd.service - Security Auditing Service
Loaded: loaded (/usr/lib/systemd/system/auditd.service; enabled; vendor preset: enabled)
Active: active (running) since Sun 2022-10-16 08:25:40 UTC; 12h ago
Docs: man:auditd(8)
https://github.com/linux-audit/audit-documentation
Main PID: 645 (auditd)
Tasks: 4 (limit: 2506)
Memory: 8.1M
CPU: 960ms
CGroup: /system.slice/auditd.service
├─645 /sbin/auditd
└─647 /usr/sbin/sedispatch
Oct 16 08:25:40 localhost augenrules[660]: enabled 1
Oct 16 08:25:40 localhost augenrules[660]: failure 1
Oct 16 08:25:40 localhost augenrules[660]: pid 645
Oct 16 08:25:40 localhost augenrules[660]: rate_limit 0
Oct 16 08:25:40 localhost augenrules[660]: backlog_limit 8192
Oct 16 08:25:40 localhost augenrules[660]: lost 0
Oct 16 08:25:40 localhost augenrules[660]: backlog 4
Oct 16 08:25:40 localhost augenrules[660]: backlog_wait_time 60000
Oct 16 08:25:40 localhost augenrules[660]: backlog_wait_time_actual 0
Oct 16 08:25:40 localhost systemd[1]: Started Security Auditing Service.
autrace kann ein Audit-Trace
eines Prozesses (hier 4 x ICMP Echo per ping) erzeugt werden
# autrace /bin/ping -c 4 8.8.8.8 Waiting to execute: /bin/ping PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data. 64 bytes from 8.8.8.8: icmp_seq=1 ttl=60 time=1.11 ms 64 bytes from 8.8.8.8: icmp_seq=2 ttl=60 time=0.807 ms 64 bytes from 8.8.8.8: icmp_seq=3 ttl=60 time=0.666 ms 64 bytes from 8.8.8.8: icmp_seq=4 ttl=60 time=0.726 ms --- 8.8.8.8 ping statistics --- 4 packets transmitted, 4 received, 0% packet loss, time 3045ms rtt min/avg/max/mdev = 0.666/0.827/1.110/0.170 ms Cleaning up... Trace complete. You can locate the records with 'ausearch -i -p 26107'
Audit Log für einen speziellen autrace Aufruf anschauen
ausearch -i -p <audit-id>
/etc/audit/rules.d//etc/audit/audit.rules zusammengefasst und in den
Linux-Kernel geladen/etc/audit/audit.rules sollte nicht manuell editiert
werden, Änderungen werden überschrieben/usr/share/audit/sample-rules
mitgeliefert und können in /etc/audit/rules.d/ kopiert werden.
auditctlman Page zu auditctl# man auditctl
Audit-Regelwerke können nach dem Laden in den Kernel als unveränderbar (immutable) markiert werden
# Make the auditd Configuration Immutable -e 2
Das Programm augenrules prüft die Regelwerke, fasst diese
zusammen und lädt die Regeln in den Linux-Kernel
# augenrules --check # augenrules --load
Status des Audit-Subsystems anzeigen
# auditctl -s enabled 2 failure 1 pid 12901 rate_limit 0 backlog_limit 8192 lost 0 backlog 0 backlog_wait_time 0 loginuid_immutable 0 unlocked
# auditctl -l -a always,exit -F arch=b32 -S stime,settimeofday,adjtimex -F key=time-change -a always,exit -F arch=b64 -S adjtimex,settimeofday -F key=time-change -a always,exit -F arch=b32 -S clock_settime -F a0=0x0 -F key=time-change -a always,exit -F arch=b64 -S clock_settime -F a0=0x0 -F key=time-change [...]
ausearch lässt sich das lokale Audit-Log
abfragenAlle Audit-Einträge zum Thema "sudo" zeigen
ausearch -i -x sudo
Report über fehlgeschlagene Anmeldeversuche
ausearch -m USER_AUTH,USER_ACCT --success no
Alle Audit-Meldungen für Benutzer UID 1000
ausearch -ua 1000 -i
ausearch --start yesterday --end now -m SYSCALL -sv no -i
ausearch erlaubt die Ausgabe der Abfrage-Ergebnisse als CSV-Datei
# ausearch --start today --format csv 2>/dev/null > audit-today.csv
aureport bietet viele zusammengefasste Reports auf den
Audit-Log-Dateien. Hier zum Beispiel ein Report über Verstöße
gegen LSM (AVC) Richtlinien:
# aureport -a AVC Report =============================================================== # date time comm subj syscall class permission obj result event =============================================================== 1. 10/16/22 08:25:41 chronyd system_u:system_r:chronyd_t:s0 262 lnk_file read system_u:object_r:unlabeled_t:s0 denied 22 2. 10/17/22 00:01:01 logrotate system_u:system_r:logrotate_t:s0 262 file getattr system_u:object_r:unlabeled_t:s0 denied 6127 3. 10/17/22 00:01:01 logrotate system_u:system_r:logrotate_t:s0 262 file getattr system_u:object_r:unlabeled_t:s0 denied 6128
| Befehl | Report |
|---|---|
| aureport -s | Syscall Report |
| aureport -p | Prozess Report |
| aureport -x | Report nach ausführbaren Dateien |
| aureport -f | Report nach Dateizugriffen |
| aureport -u | Report über Benutzeraktivitäten |
| aureport -l -i | Report über Logins |
Die letzten Logins auf dem System anzeigen
# aulast
Wann haben sich Benutzer zum letzten Mal am System angemeldet?
# aulastlog
Zusammenfassung des Audit-Log
# aureport
gnuplot zu funktionieren, und das Ausgabeformat wurde
von Postscript auf PNG-Dateien geändert$ sudo dnf install epel-release $ sudo dnf install graphviz gnuplot git $ git clone https://github.com/cstrotm/audit-visualize $ cd audit-visualize $ chmod +x ./mkgraph $ chmod +x ./mkbar
$ sudo aureport -s -i --summary | bash ./mkbar syscall $ sudo aureport -f -i --summary --failed | bash ./mkbar failed-access $ sudo aureport -e -i --summary | egrep -vi '(syscall|change)' $ sudo aureport -e -i --summary | egrep -vi '(syscall|change)' | bash ./mkbar events2
$ sudo aureport -s -i | awk '/^[0-9]/ { printf "%s %s\n", $6, $4 }' | sort | uniq | bash ./mkgraph
Gzipping graph...
Graph was written to gr.png
sudo aureport -u -i | awk '/^[0-9]/ { printf "%s %s\n", $4, $7 }' | sort | uniq | bash ./mkgraph
sudo aureport -f -i | awk '/^[0-9]/ { printf "%s %s\n", $8, $4 }' | sort | uniq | bash ./mkgraph