Auditctl: Intercepting Kernel Syscall Events, Auditing Sensitive File Mutations, and Enforcing Linux Security Compliance in Production
When standard log files are easily erased or spoofed by someone with root access, you need a witness that lives deeper inside the machine than any user-space application can reach. You need the Linux kernel itself to keep an honest record of every file opened, every clock change, and every elevated command executed on the box.
This is where auditctl comes into play. It is the control tool for the Linux Kernel Audit framework (kauditd), giving you the power to set unshakeable tripwires around your most critical files and system calls.
If you want to immediately see what the audit system is doing right now and check whether the kernel is actively monitoring events, run this status command:
auditctl -s
enabled 1
failure 1
pid 842
rate_limit 0
backlog_limit 8192
lost 0
backlog 0
backlog_wait_time 60000
backlog_wait_time_actual 0
This single command tells you if the audit subsystem is alive (enabled 1), tracks how many security events are waiting in memory (backlog 0), and confirms whether any security telemetry has been dropped (lost 0).
What It Does in Plain English
At its core, auditctl is the command-line steering wheel for the Linux kernel's internal security camera. Rather than trusting applications or users to truthfully report what they did, the kernel audit subsystem sits right at the boundary between software applications and the hardware core of the operating system.
Whenever a program tries to read a file, spawn a new process, alter the system clock, or switch user accounts, the kernel pauses for a microsecond to check that action against your audit rules. If the action matches a rule you configured, the kernel writes an immutable, structured record directly into protected kernel memory. Even if an attacker gains root privileges and wipes /var/log/syslog, they cannot retroactively erase events that the kernel has already logged and forwarded.
Architectural Mechanics & Core Flags
The Linux Audit framework operates via deep integration with the kernel's system call dispatch tables. When a program asks the operating system to perform an actionβsuch as opening a file or executing a binaryβit makes a system call (syscall). Understanding how the kernel processes these calls allows you to craft precise rules that catch intruders without slowing down your system.
1. Netlink Socket Communication (NETLINK_AUDIT)
The user-space audit daemon (auditd) and its configuration client (auditctl) communicate with the kernel through a dedicated bidirectional netlink socket family: NETLINK_AUDIT (protocol family AF_NETLINK, protocol number 9). When you run auditctl, it formats a command payload (such as AUDIT_SET or AUDIT_ADD_RULE) and transmits it across the socket boundary.
In the reverse direction, the kernel background thread, kauditd, pulls audit records from its internal ring buffer and delivers them via netlink unicast to auditd. If auditd falls behind or locks up, kauditd holds records in a finite queue in kernel memory; if that queue fills completely, the kernel enforces a configurable failure policy (-f).
2. Rule Evaluation Order & Filter Lists
The kernel evaluates rules systematically across five dedicated filter lists:
* user: Evaluates messages originating in user space before they enter kernel processing (such as authentication attempts from PAM or login managers).
* task: Evaluated during process creation (fork, clone, vfork). This list tracks process lifecycle events and cannot filter on file paths or syscall arguments.
* filesystem: Evaluated during filesystem mount and unmount transitions.
* exit: The primary engine. Evaluated upon exit from a system call. This is the only filter list that can inspect syscall return codes (-F exit=-EACCES), syscall parameters, and dynamically resolved filesystem inodes.
* exclude: A terminal filter list used to discard unwanted, noisy record types (such as repetitive cryptographic status checks or benign SELinux/AppArmor AVC records) before they hit the ring buffer.
3. Performance Overhead Considerations
Because the exit filter evaluates every system call executed by every thread on the system, broad or sloppy rules will cause high CPU overhead. Rules should always specify the target architecture (-F arch=b64 or -F arch=b32) to prevent the kernel from evaluating rules against incompatible ABI numbers.
Furthermore, monitoring entire directory trees with generic path string matches is far costlier than using targeted file watch descriptors or directory inode anchors.
Core Flags Reference
| Flag | Argument | Description |
|---|---|---|
-a / -A |
list,action |
Append (-a) or Prepend (-A) a rule to a filter list (exit, task, etc.) with action (always, never). |
-d |
list,action |
Delete a specific rule from the specified filter list. |
-D |
none | Flush (delete) all audit rules and watches immediately. |
-w |
/path/to/file |
Insert a filesystem watch on a specific file or directory. |
-p |
r\|w\|x\|a |
Set permission triggers for watches: r (read), w (write), x (execute), a (attribute change). |
-S |
syscall_name |
Specify system call(s) to intercept (e.g., execve, unlinkat, settimeofday). |
-F |
field=value |
Define rule criteria filters (arch, auid, euid, path, exit, dir, key). |
-k |
identifier |
Attach an arbitrary tracking string (audit key) for rapid log searching. |
-b |
integer |
Set the kernel audit event backlog buffer limit (maximum outstanding records). |
-f |
0 \| 1 \| 2 |
Define kernel action on buffer saturation: 0 (silent drop), 1 (printk warning), 2 (kernel panic). |
-e |
0 \| 1 \| 2 |
Audit subsystem control: 0 (disable), 1 (enable), 2 (lock configuration immutably). |
-s |
none | Query the live kernel audit subsystem status and queue metrics. |
Five Production Use Cases
| Defense Pattern | Primary Purpose | Monitored Target | Command Syntax Summary |
|---|---|---|---|
| 1. Configuration Shield | Detect tampering with user credentials & sudo access | /etc/shadow, /etc/sudoers, /etc/pam.d/ |
auditctl -w /path -p wa -k identity_tamper |
| 2. Temporal Tamper Guard | Prevent clock manipulation used to break logs & certificates | settimeofday, clock_settime, adjtimex |
auditctl -a always,exit -F arch=b64 -S clock_settime -k system_time_tamper |
| 3. Inode Deletion Audit | Track mass file deletion and sneaky renames | unlink, unlinkat, rename, renameat |
auditctl -a always,exit -F arch=b64 -S unlinkat -F dir=/path -k shared_storage_deletion |
| 4. Execution Provenance | Catch non-root users running root-privileged binaries | execve, execveat with euid=0 |
auditctl -a always,exit -F arch=b64 -S execve -F euid=0 -F auid>=1000 -k root_escalation |
| 5. Immutable Lockdown | Prevent attackers from disabling auditing | Audit subsystem control & buffer tuning | auditctl -b 65536 -f 1 -e 2 |
1. Monitoring Unauthorized Access and Mutation to Critical Identity & PAM Paths
Operational Scenario
In production server environments, unauthorized modifications to identity stores (/etc/shadow, /etc/passwd) or privilege escalation configuration files (/etc/sudoers, /etc/pam.d/) represent severe compromise vectors. System administrators need immediate, tamper-evident notification whenever any processβincluding automated deployment scripts or compromised daemonsβattempts to read or alter these files.
Exact Command-Line Invocations
# Flush legacy rules to establish a clean state
auditctl -D
# Watch authentication and privilege configuration files for writes and attribute modifications
auditctl -w /etc/shadow -p wa -k identity_tamper
auditctl -w /etc/gshadow -p wa -k identity_tamper
auditctl -w /etc/passwd -p wa -k identity_tamper
auditctl -w /etc/sudoers -p wa -k sudoers_tamper
auditctl -w /etc/sudoers.d/ -p wa -k sudoers_tamper
auditctl -w /etc/pam.d/ -p wa -k pam_tamper
Realistic Terminal Output (ausearch -k identity_tamper -i)
----
type=PROCTITLE msg=audit(18/08/2026 02:14:22.418:1042) : proctitle=sed -i -e $a attacker ALL=(ALL) NOPASSWD:ALL /etc/sudoers
type=PATH msg=audit(18/08/2026 02:14:22.418:1042) : item=1 name=/etc/sudoers.tmp inode=524291 dev=fc:01 mode=file,0440 ouid=root ogid=root rdev=00:00 nametype=CREATE cap_fp=none cap_fi=none cap_fe=0 cap_fver=0 cap_frootid=0
type=PATH msg=audit(18/08/2026 02:14:22.418:1042) : item=0 name=/etc/sudoers inode=524289 dev=fc:01 mode=file,0440 ouid=root ogid=root rdev=00:00 nametype=PARENT cap_fp=none cap_fi=none cap_fe=0 cap_fver=0 cap_frootid=0
type=CWD msg=audit(18/08/2026 02:14:22.418:1042) : cwd=/root
type=SYSCALL msg=audit(18/08/2026 02:14:22.418:1042) : arch=x86_64 syscall=rename success=yes exit=0 a0=0x55d7f1a3b820 a1=0x55d7f1a3b8a0 a2=0x7ffc75e81cb0 a3=0x0 items=2 ppid=1420 pid=2891 auid=deployer uid=root gid=root euid=root suid=root fsuid=root egid=root sgid=root fsgid=root tty=pts0 ses=3 comm=sed exe=/usr/bin/sed key=sudoers_tamper
Line-by-Line Telemetry Breakdown
type=PROCTITLE: Shows the full command string executed in user space. Here, someone usedsed -ito quietly append a passwordless root entry into the sudoers file.type=PATH (item=1): Identifies the temporary file (/etc/sudoers.tmp, inode524291) created bysedto perform an atomic write-and-replace operation.type=PATH (item=0): Points to the target parent directory and target file inode being manipulated.type=SYSCALL:arch=x86_64: Confirms the binary executed on a 64-bit architecture.syscall=rename: The exact kernel operation used to overwrite the real/etc/sudoerswith the modified temporary file.success=yes exit=0: Confirms the kernel allowed the modification to succeed.auid=deployer: Crucial evidence. The audit user ID (auid) preserves the original login identity of the human or SSH key (deployer), even though the process was operating with effective root permissions (euid=root).comm="sed" exe="/usr/bin/sed": Identifies the exact executable that carried out the change.key="sudoers_tamper": The custom tag assigned by ourauditctlrule, making this event easy to extract from millions of log lines.
What the Admin Does Next
- Terminate the active SSH session (
ses=3) and kill the rogue process tree associated with PID2891. - Inspect the audit log with
ausearchfor all commands executed by that login identity over the last two hours:bash ausearch -ua deployer -ts recent -i - Restore
/etc/sudoersimmediately from an immutable, version-controlled configuration backup.
2. Auditing Dynamic System Time and Clock Adjustments to Prevent Log Tampering
Operational Scenario
Adversaries who gain elevated privileges often try to manipulate the system clock using system calls like settimeofday, clock_settime, or adjtimex. By rolling time backward or fast-forwarding into the future, attackers attempt to bypass time-based one-time passwords (TOTP), invalidate TLS certificates, skirt log expiration rules, and scramble log timelines to make forensic correlation impossible.
Exact Command-Line Invocations
# Capture 64-bit architecture time alteration system calls
auditctl -a always,exit -F arch=b64 -S adjtimex,settimeofday,clock_settime -k system_time_tamper
# Capture 32-bit architecture time alteration calls (preventing 32-bit compatibility bypasses)
auditctl -a always,exit -F arch=b32 -S adjtimex,settimeofday,clock_settime,stime -k system_time_tamper
# Watch the hardware clock device directly
auditctl -w /dev/rtc -p wa -k rtc_tamper
Realistic Terminal Output (ausearch -k system_time_tamper -i)
----
type=PROCTITLE msg=audit(18/08/2026 03:00:10.115:3089) : proctitle=date -s 2021-01-01 00:00:00
type=SYSCALL msg=audit(18/08/2026 03:00:10.115:3089) : arch=x86_64 syscall=clock_settime success=yes exit=0 a0=CLOCK_REALTIME a1=0x7ffcf812eb30 items=0 ppid=1980 pid=3145 auid=ubuntu uid=root gid=root euid=root suid=root fsuid=root egid=root sgid=root fsgid=root tty=pts1 ses=5 comm=date exe=/usr/bin/date key=system_time_tamper
Line-by-Line Telemetry Breakdown
type=PROCTITLE: Documents the command executed (date -s 2021-01-01 00:00:00), attempting to roll the clock back several years.type=SYSCALL:syscall=clock_settime: Pinpoints the POSIX system call used to overwrite the hardware-synchronized system clock.a0=CLOCK_REALTIME: The target clock parameter, decoded byausearch -ifrom integer0into human-readable text.auid=ubuntu: Identifies the human account that originally authenticated over SSH (ses=5) before elevating to root.exe="/usr/bin/date": Identifies the binary used to invoke the system call.
What the Admin Does Next
- Re-synchronize the host clock against an authenticated Network Time Protocol (NTP) source:
bash chronyc makestep - Verify whether the local time synchronization configuration was altered:
bash ausearch -f /etc/chrony/chrony.conf -i - Restrict clock-setting capabilities within virtual machines and containers by stripping the
CAP_SYS_TIMEcapability.
3. Tracking File Deletion, Renaming, and Unlinking Events Across Shared Application Directories
Operational Scenario
In shared application servers and multi-tenant storage volumes, a compromised service or an errant automated cleanup script can cause widespread data loss by quietly deleting files (unlink, unlinkat) or renaming directories (rename, renameat). Standard file monitoring tools often miss these events because once the file is unlinked, its metadata is gone. Kernel auditing catches the system call in real time.
Exact Command-Line Invocations
# Intercept 64-bit inode unlinking and renaming system calls in the target directory
auditctl -a always,exit -F arch=b64 -S unlink,unlinkat,rename,renameat,renameat2 -F dir=/srv/shared/data -k shared_storage_deletion
# Intercept 32-bit compatibility equivalents
auditctl -a always,exit -F arch=b32 -S unlink,unlinkat,rename,renameat,renameat2 -F dir=/srv/shared/data -k shared_storage_deletion
Realistic Terminal Output (ausearch -k shared_storage_deletion -i)
----
type=PROCTITLE msg=audit(18/08/2026 03:45:01.884:4512) : proctitle=python3 -c import os; os.unlink('/srv/shared/data/production.db')
type=PATH msg=audit(18/08/2026 03:45:01.884:4512) : item=1 name=/srv/shared/data/production.db inode=918274 dev=fc:01 mode=file,0640 ouid=www-data ogid=www-data rdev=00:00 nametype=DELETE cap_fp=none cap_fi=none cap_fe=0 cap_fver=0 cap_frootid=0
type=PATH msg=audit(18/08/2026 03:45:01.884:4512) : item=0 name=/srv/shared/data inode=918200 dev=fc:01 mode=dir,0755 ouid=www-data ogid=www-data rdev=00:00 nametype=PARENT cap_fp=none cap_fi=none cap_fe=0 cap_fver=0 cap_frootid=0
type=CWD msg=audit(18/08/2026 03:45:01.884:4512) : cwd=/srv/shared/data
type=SYSCALL msg=audit(18/08/2026 03:45:01.884:4512) : arch=x86_64 syscall=unlinkat success=yes exit=0 a0=0xffffff9c a1=0x7f43db199040 a2=0x0 items=2 ppid=801 pid=5412 auid=4294967295 uid=www-data gid=www-data euid=www-data suid=www-data fsuid=www-data egid=www-data sgid=www-data fsgid=www-data tty=(none) ses=4294967295 comm=python3 exe=/usr/bin/python3.10 key=shared_storage_deletion
Line-by-Line Telemetry Breakdown
type=PATH (item=1):name=/srv/shared/data/production.db: The specific file that was deleted.inode=918274: The exact filesystem inode number. This is critical for disk recovery tools if blocks haven't been overwritten.nametype=DELETE: Proves the kernel processed a directory entry deletion.
type=SYSCALL:syscall=unlinkat: Confirms the directory-relative deletion syscall was invoked.a0=0xffffff9c: Represents the special constantAT_FDCWD(use current working directory).auid=4294967295: Decodes asunset(-1). This confirms the command was triggered by an automated background worker or web server rather than an interactive human login.comm="python3" exe="/usr/bin/python3.10": Indicates a Python process executed the deletion.
What the Admin Does Next
- Identify the systemd service or container unit managing the parent PID
801:bash systemctl status $(ps -o unit= -p 801) - Generate an audit summary report of all file deletion activity on the server over the past 24 hours using
aureport:bash aureport --syscall --summary -ts yesterday | grep -E "unlink|rename" - If data recovery is required, immediately unmount the filesystem or remount it read-only to protect inode
918274before its raw disk blocks are overwritten.
4. Logging Privileged Process Executions and SUID Binaries Across Multi-Tenant Hosts
Operational Scenario
When attackers gain unprivileged shell access, their first priority is privilege escalation. They frequently execute SetUID binaries (such as /usr/bin/sudo, /usr/bin/pkexec, or /usr/bin/passwd) or exploit zero-day vulnerabilities to elevate their effective user ID to root (euid=0). Engineers must log every instance where an unprivileged user executes a process that transitions to root privileges.
Exact Command-Line Invocations
# Capture execution of all execve and execveat calls where effective user is root, but login user is non-root
auditctl -a always,exit -F arch=b64 -S execve,execveat -F euid=0 -F auid>=1000 -F auid!=unset -k root_escalation
# Audit 32-bit execution paths
auditctl -a always,exit -F arch=b32 -S execve,execveat -F euid=0 -F auid>=1000 -F auid!=unset -k root_escalation
Realistic Terminal Output (ausearch -k root_escalation -i)
----
type=PROCTITLE msg=audit(18/08/2026 04:12:09.912:6781) : proctitle=pkexec /tmp/cve-exploit
type=EXECVE msg=audit(18/08/2026 04:12:09.912:6781) : argc=2 a0=pkexec a1=/tmp/cve-exploit
type=PATH msg=audit(18/08/2026 04:12:09.912:6781) : item=1 name=/tmp/cve-exploit inode=131075 dev=fc:01 mode=file,0777 ouid=testuser ogid=testuser rdev=00:00 nametype=NORMAL cap_fp=none cap_fi=none cap_fe=0 cap_fver=0 cap_frootid=0
type=PATH msg=audit(18/08/2026 04:12:09.912:6781) : item=0 name=/usr/bin/pkexec inode=262148 dev=fc:01 mode=file,setuid,04755 ouid=root ogid=root rdev=00:00 nametype=NORMAL cap_fp=none cap_fi=none cap_fe=0 cap_fver=0 cap_frootid=0
type=SYSCALL msg=audit(18/08/2026 04:12:09.912:6781) : arch=x86_64 syscall=execve success=yes exit=0 a0=0x7ffe9e320490 a1=0x7ffe9e320d80 a2=0x7ffe9e320d98 items=2 ppid=6712 pid=6781 auid=testuser uid=testuser gid=testuser euid=root suid=root fsuid=root egid=testuser sgid=testuser fsgid=testuser tty=pts2 ses=7 comm=pkexec exe=/usr/bin/pkexec key=root_escalation
Line-by-Line Telemetry Breakdown
type=EXECVE:argc=2: Exactly two arguments were passed to the program entry point.a0="pkexec" a1="/tmp/cve-exploit": Shows that usertestuserpassed a custom binary in world-writable/tmpto Polkit's SUID utility.
type=PATH (item=0):name=/usr/bin/pkexec mode=file,setuid,04755: Explicitly notes that the target executable had its SetUID permission bit (04755) set and is owned by root.
type=SYSCALL:auid=testuser: The authenticated login user who initiated the command.uid=testuservseuid=root: Proves a privilege boundary crossing occurredβthe process is now operating with the full authority of the superuser (euid=0).comm="pkexec" exe="/usr/bin/pkexec": Confirms the exact execution pathway.
What the Admin Does Next
- Identify the origin IP address and login method for session
ses=7:bash ausearch --session 7 -i - Quarantine and calculate the cryptographic hash of the suspicious binary:
bash sha256sum /tmp/cve-exploit >> /var/log/incident-hashes.log - Audit all other files modified by that user across the system:
bash ausearch -u testuser -ts today -i
5. Locking Audit Configurations into Immutable Mode (auditctl -e 2) for Compliance & Tuning Backlog Buffers
Operational Scenario
In enterprise environments governed by strict compliance mandates (such as PCI-DSS v4.0 Requirement 10, SOC 2 Type II, or FedRAMP High), audit trails must be completely tamper-proof. If an adversary manages to obtain full root privileges, their immediate instinct is to disable logging using auditctl -D or systemctl stop auditd.
To prevent this, security architects lock the audit subsystem into immutable mode (-e 2) and configure kernel ring buffers so telemetry is never dropped during traffic spikes.
Exact Command-Line Invocations
# 1. Expand the kernel audit backlog buffer to prevent event loss under I/O saturation
auditctl -b 65536
# 2. Set the kernel response behavior on buffer saturation to rate-limited syslog output
auditctl -f 1
# 3. Configure the backlog wait time (milliseconds) when queue is saturated
auditctl --backlog_wait_time 10000
# 4. Inject baseline audit watch on audit rules themselves
auditctl -w /etc/audit/ -p wa -k audit_rules_tamper
auditctl -w /etc/audit/auditd.conf -p wa -k audit_config_tamper
auditctl -w /etc/audit/rules.d/ -p wa -k audit_rules_tamper
# 5. ENGAGE IMMUTABLE MODE (CRITICAL: Must be the absolute final command)
auditctl -e 2
Realistic Terminal Output
Attempting to modify or clear audit rules once immutable mode is activated yields:
auditctl -D
Error sending delete rule request (Operation not permitted)
Querying the system status via auditctl -s:
enabled 2
failure 1
pid 912
rate_limit 0
backlog_limit 65536
lost 0
backlog 2
backlog_wait_time 10000
backlog_wait_time_actual 0
Line-by-Line Telemetry Breakdown
enabled 2: Confirms the kernel audit subsystem is in locked immutable mode. The kernel will reject all subsequent Netlink socket messages attempting to add, remove, or modify rules.failure 1: If the backlog buffer fills up, the kernel emits rate-limitedprintkdiagnostic warnings rather than silently dropping records (0) or inducing a kernel panic (2).backlog_limit 65536: The memory ring buffer is expanded from its small default to hold up to 65,536 unhandled audit events.lost 0: Proves zero audit messages have been discarded due to buffer exhaustion.backlog 2: Indicates the instantaneous queue length of records waiting to be consumed byauditd.Error sending delete rule request (Operation not permitted): Confirms that even therootsuperuser cannot clear or disable audit rules without rebooting the system.
What the Admin Does Next
- Record the configuration state in compliance documentation, verifying the locked status:
bash auditctl -s | grep "enabled 2" - Make sure all persistent rules are mirrored in
/etc/audit/rules.d/audit.rulesso they survive system reboots (see theaudit.rules(7)manual). - If rules need to be updated in the future, schedule an authorized server reboot; rules can only be modified before
auditctl -e 2executes during the boot sequence.
What Can Go Wrong: Architectural Pitfalls & Recovery
Implementing kernel-level auditing without understanding the underlying mechanics can cause serious operational headaches. Below are three critical traps to avoid:
| Failure Mode | Root Cause | Real-World Impact | Recommended Mitigation |
|---|---|---|---|
| The System Panic Trap | Setting -f 2 on production hosts |
High traffic saturates buffer, causing immediate server crash | Set -f 1, expand backlog to -b 65536, and alert on buffer growth |
| The Immutability Lock-in | Running auditctl -e 2 before loading all rules |
Kernel rejects all subsequent rule additions until reboot | Always place -e 2 as the very last line in configuration files |
| Performance Collapse | Missing architecture filters (-F arch=b64) |
Kernel parses syscall names against all ABIs on every invocation | Always qualify syscall rules with -F arch=b64 and -F arch=b32 |
1. The Kernel Panic Trap: Misconfiguration of the Failure Flag (-f 2)
- The Danger: Setting
auditctl -f 2instructs the kernel to trigger an immediate kernelpanic()if the audit backlog buffer ever fills up. Under high network traffic or heavy disk I/O, an unexpected surge in events can instantly take down your entire server fleet. - The Recovery: Avoid
-f 2unless operating in ultra-secure, air-gapped facilities where complete recording outweighs system uptime. Use-f 1(kernel log warning) combined with a generous buffer (-b 65536or-b 131072), and monitor thelostcounter via your monitoring system orauditctl -s.
2. The Premature Immutability Trap (-e 2)
- The Danger: If
auditctl -e 2is placed near the beginning of a startup script or run interactively in the terminal before all rules are loaded, the kernel locks down instantly. Any rules defined after that command will fail withOperation not permitted. - The Recovery: Immutability cannot be disabled on a running system. No command, flag, or signal can downgrade
enabled 2back toenabled 1without rebooting the server. Always ensure-e 2is the very last directive executed.
3. Performance Collapse: Missing Architecture Selectors
- The Danger: Writing system call rules without specifying the architecture (for example,
auditctl -a always,exit -S open) forces the kernel to look up syscall tables across multiple binary interfaces without context. On 64-bit systems, this can cause false matches against 32-bit compatibility tables and significantly degrade system call throughput. - The Mitigation: Always explicitly define the target architecture using
-F arch=b64and provide separate rules with-F arch=b32where 32-bit compatibility is required.
Essential Documentation & References
To deepen your understanding of the Linux Kernel Audit framework and its accompanying toolchain, consult these primary sources:
- Audit Subsystem Controller:
auditctl(8) Manual Page - Kernel Architecture Guide:
Linux Kernel Audit Subsystem Documentation - Persistent Rule Syntax:
audit.rules(7) Configuration Manual - Forensic Event Querying:
ausearch(8) Forensic Search Utility - Security Reporting Engine:
aureport(8) Audit Summary Generator - Community Reference Architecture:
ArchWiki Audit Framework Implementation Guide
Today's Takeaway
The Linux Kernel Audit subsystem transforms your operating system from a passive platform into an active, forensic-grade recording witness. To establish immediate baseline security on your machine right now in five minutes, run auditctl -w /etc/shadow -p wa -k identity_watch and verify that the rule is live with auditctl -l. From that moment on, whenever any process touches your system's master password file, you can instantly reveal the culprit by running ausearch -k identity_watch -i.