laurel-audit-rules - Advice for writing Audit rulesets for use with laurel(8)
Contents
File Watches
Authentication/authorization
-w /etc/group -p wa -k wr_group
-w /etc/passwd -p wa -k wr_passwd
-w /etc/shadow -p wa -k wr_passwd
-w /etc/pam.conf -p wa -k wr_pam
-w /etc/pam.d/ -p wa -k wr_pam
-w /etc/ssh/sshd_config -p wa -k wr_sshd
-w /etc/sudoers -p wa -k wr_sudo
-w /etc/sudoers.d -p wa -k wr_sudo
cron,at
-w /etc/crontab -p wa -k wr_cron
-w /etc/cron.d/ -p wa -k wr_cron
-w /etc/cron.daily/ -p wa -k wr_cron
-w /etc/cron.hourly/ -p wa -k wr_cron
-w /etc/cron.monthly/ -p wa -k wr_cron
-w /etc/cron.weekly/ -p wa -k wr_cron
-w /etc/cron.yearly/ -p wa -k wr_cron
-w /etc/cron.allow -p wa -k wr_cron
-w /etc/cron.deny -p wa -k wr_cron
-w /var/spool/cron/crontabs/ -p wa -k wr_cron
-w /etc/at.allow -p wa -k wr_cron
-w /etc/at.deny -p wa -k wr_cron
-w /var/spool/cron/atjobs/ -p wa -k wr_cron
systemd
Systemd also has cron-like timer mechanism. udev triggers have also been abused for persistence. Note
that watching the files in /etc is not sufficient.
-w /etc/systemd -p wa -k wr_systemd
-w /lib/systemd -p wa -k wr_systemd
-w /usr/lib/systemd -p wa -k wr_systemd
-w /etc/udev -p wa -k wr_systemd
-w /lib/udev -p wa -k wr_systemd
-w /usr/lib/udev -p wa -k wr_systemd
Dynamiclinkers
-w /lib/ld-linux.so.2 -p wa -k wr_ldso
-w /lib64/ld-linux-x86-64.so.2 -p wa -k wr_ldso
-w /lib/ld-musl-x86_64.so.1 -p wa -k wr_ldso
-w /lib/ld-musl-i386.so.1 -p wa -k wr_ldso
-w /etc/ld.so.conf -p wa -k wr_ldso
-w /etc/ld.so.conf.d -p wa -k wr_ldso
-w /etc/ld.so.preload -p wa -k wr_ldso
Mandatoryaccesscontrol(SELinux,AppArmor)manipulation
-w /etc/selinux -p wa -k wr_selinux
-w /usr/share/selinux -p wa -k wr_selinux
-w /usr/libexec/selinux -p wa -k wr_selinux
-w /etc/apparmor.d -p wa -k wr_apparmor
-w /usr/lib/apparmor -p wa -k wr_apparmor
-w /usr/share/apparmor -p wa -k wr_apparmor
-w /usr/share/apparmor-features -p wa -k wr_apparmor
Kernelmodules
-w /etc/modprobe.conf -p wa -k wr_modules
-w /etc/modprobe.d/ -p wa -k wr_modules
-w /lib/modules/ -p wa -k wr_modules
Auditd+Laurel
-w /etc/audit/ -p wa -k wr_audit_config
-w /etc/libaudit.conf -p wa -k wr_audit_config
-w /etc/audisp/ -p wa -k wr_audit_config
-w /etc/laurel/ -p wa -k wr_laurel_confg
Log Specific Program Executions
Possibletamperingwithauditd,laurel
-w /sbin/auditctl -p x -k wr_audit_tools
-w /sbin/auditd -p x -k wr_audit_tools
-w /usr/sbin/laurel -p x -k wr_audit_tools
Log Specific “Harmless” Programs Executions
Adding context to system service activities is useful because together with Laurel’s process labels
(label-process.label-keys, label-process.propagate-labels), it enables more accurate detection rules that
can help recognize benign system management activity.
-w /usr/sbin/sshd -p x -k sshd
-w /usr/bin/yum -p x -k pkg_mgmt
-w /usr/bin/rpm -p x -k pkg_mgmt
-w /usr/bin/dnf -p x -k pkg_mgmt
-w /usr/bin/dpkg -p x -k pkg_mgmt
-w /usr/bin/apt -p x -k pkg_mgmt
-w /usr/bin/apt-get -p x -k pkg_mgmt
-w /usr/bin/apt-key -p x -k pkg_mgmt
-w /usr/bin/apt-add-repository -p x -k pkg_mgmt
-w /usr/bin/aptitude -p x -k pkg_mgmt
-w /usr/bin/aptitude-curses -p x -k pkg_mgmt
-w /usr/bin/wajig -p x -k pkg_mgmt
-w /usr/bin/snap -p x -k pkg_mgmt
-w /usr/sbin/yast2 -p x -k pkg_mgmt
-w /usr/bin/zypper -p x -k pkg_mgmt
-w /usr/bin/containerd -p x -k container
-w /usr/bin/podman -p x -k container
-w /usr/bin/runc -p x -k container
-w /usr/bin/dockerd -p x -k container
-w /usr/bin/docker -p x -k container
-w /usr/bin/docker-containerd -p x -k container
-w /usr/bin/docker-runc -p x -k container
-w /usr/sbin/cron -p x -k sched_task
-w /usr/sbin/atd -p x -k sched_task
-w /usr/sbin/httpd -p x -k apache-httpd
-w /usr/local/apache2/bin/httpd -p x -k apache-httpd
-w /usr/sbin/nginx -p x -k nginx
-w /usr/local/nginx/sbin/nginx -p x -k nginx
-w /usr/local/openresty/nginx/sbin/nginx -p x -k nginx
Name
laurel-audit-rules - Advice for writing Audit rulesets for use with laurel(8)
Note About Auditctl (8) Error Messages
It is not possible for /auditctl(8)/ ro load file watches for files or directories that are not present.
Depending on the rule set, it will spam possibly lots of error messages to standard error. The specific
file watches are not installed, but those error messages can be ignored otherwise.
See Also
audit.rules(7), laurel(8)
Synopsis
This page contains suggestions for Linux Audit rulesets that are useful to aid in detecting common
attacker’s tactics.
Syscalls
Logallforkandexeccallsforreliableprocesstracking
For reliable process tracking that is required for assigning and propagating process labels, it is useful
to have the Linux Audit subsystem produce events for all fork/exec style syscalls.
## Ignore clone( flags=CLONE_VM|... ), log other process-creating calls
-a never,exit -F arch=b32 -S clone -F a2&0x100
-a never,exit -F arch=b64 -S clone -F a2&0x100
-a always,exit -F arch=b32 -S fork,vfork,clone,clone3 -k fork
-a always,exit -F arch=b64 -S fork,vfork,clone,clone3 -k fork
-a always,exit -F arch=b32 -S execve,execveat
-a always,exit -F arch=b64 -S execve,execveat
It is only important that Laurel gets to observe these events. To reduce log volume, Laurel’s filtering
settings should be used, e.g.:
[filter]
filter-keys = ["fork"]
filter-action = drop
keep-first-per-process = true
Logusageofptrace
We are interested in ptrce usage, but not in every transaction (PEEK, POKE, CONT)
-a never,exit -F arch=b32 -S ptrace -F a0>=1 -F a0<=7
-a never,exit -F arch=b64 -S ptrace -F a0>=1 -F a0<=7
-a always,exit -F arch=b32 -S ptrace
-a always,exit -F arch=b64 -S ptrace
LogBPFusage
Usage of BPF should be restricted to few processes; log everything except data transfer operations
because they would put too much load on the system.
-a never,exit -F arch=b32 -S bpf -F a0>=1 -F a0<=4
-a never,exit -F arch=b64 -S bpf -F a0>=1 -F a0<=4
-a never,exit -F arch=b32 -S bpf -F a0>=0xb -F a0<=0xf
-a never,exit -F arch=b64 -S bpf -F a0>=0xb -F a0<=0xf
-a never,exit -F arch=b32 -S bpf -F a0=0x13
-a never,exit -F arch=b64 -S bpf -F a0=0x13
-a always,exit -F arch=b32 -S bpf -F success=1
-a always,exit -F arch=b64 -S bpf -F success=1
Logkernelmoduleloading,unloading
-a always,exit -F arch=b32 -S init_module,finit_module,delete_module -k module
-a always,exit -F arch=b64 -S init_module,finit_module,delete_module -k module
