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.d
max_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.
auditctl
man
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