{"id":4666,"date":"2026-09-21T03:01:02","date_gmt":"2026-09-20T21:31:02","guid":{"rendered":"https:\/\/cpanelfree.com\/blog\/linux-auditd-framework-writing-custom-audit-rules-to-detect-unauthorized-file-access\/"},"modified":"2026-09-21T03:01:02","modified_gmt":"2026-09-20T21:31:02","slug":"linux-auditd-framework-writing-custom-audit-rules-to-detect-unauthorized-file-access","status":"publish","type":"post","link":"https:\/\/cpanelfree.com\/blog\/linux-auditd-framework-writing-custom-audit-rules-to-detect-unauthorized-file-access\/","title":{"rendered":"Linux Auditd Framework: Writing Custom Audit Rules to Detect Unauthorized File Access"},"content":{"rendered":"<p>Detecting stealthy tampering, unauthorized privilege escalations, and unauthenticated file access in enterprise Linux environments requires a deterministic kernel-level auditing mechanism rather than reactive userland log scrapers. When multi-tenant hosts or mission-critical servers handle sensitive data on platforms like <a href=\"https:\/\/cpanelfree.com\">CpanelFree<\/a>, administrators must isolate and trace every file system interaction down to the syscall invocation without degrading I\/O throughput. Deploying precision audit rules within the Linux Audit Daemon (<code>auditd<\/code>) provides real-time visibility into unauthorized reads, writes, and inode modifications while maintaining sub-millisecond execution overhead.<\/p>\n<p><!-- more --><\/p>\n<h2>What is the Linux Auditd Framework and How Does It Detect File Access?<\/h2>\n<div style=\"background:#1e293b;border-left:4px solid #38bdf8;padding:16px 20px;margin:24px 0;border-radius:0 8px 8px 0;color:#e2e8f0\">\n  <strong style=\"color:#38bdf8\">Direct Answer:<\/strong> The Linux Auditd framework intercepts kernel system calls (such as <code>open<\/code>, <code>openat<\/code>, <code>truncate<\/code>, and <code>unlink<\/code>) via the Linux kernel audit subsystem (<code>kauditd<\/code>) before userland execution completes. By defining deterministic file-watch rules (<code>-w<\/code>) or exit-code filtered syscall rules (<code>-a always,exit -F arch=b64 -S ... -F exit=-EACCES<\/code>), auditd captures the actor UID, immutable login AUID, process PID, executable path, and file inode directly into <code>\/var\/log\/audit\/audit.log<\/code> without application-level cooperation.\n<\/div>\n<h3>The Architecture of the Linux Kernel Audit Subsystem<\/h3>\n<p>To write performant audit rules, systems architects must understand the path a file request traverses across the Linux kernel boundary. The audit architecture consists of three operational tiers:<\/p>\n<ul>\n<li><strong>Kernel Audit Subsystem (<code>kauditd<\/code>):<\/strong> Hooked directly into the system call dispatch table and the Virtual File System (VFS) layer. When an application invokes a syscall to access a file, <code>kauditd<\/code> evaluates the request against active in-memory filter lists (<code>task<\/code>, <code>exit<\/code>, <code>user<\/code>, and <code>exclude<\/code>). If a rule matches, the kernel packages an audit event and places it onto a high-speed netlink socket ring buffer.<\/li>\n<li><strong>Userland Daemon (<code>auditd<\/code>):<\/strong> A dedicated background process that consumes raw netlink datagrams from the kernel buffer, applies formatting, writes chronologically to <code>\/var\/log\/audit\/audit.log<\/code>, and rotates log files according to disk pressure policies.<\/li>\n<li><strong>Audit Dispatcher &amp; Plugins (<code>audispd<\/code> \/ <code>auditd-plugins<\/code>):<\/strong> A real-time multiplexer that forwards events to external consumers, such as centralized SIEM endpoints, Syslog daemons, or anomaly detection pipelines.<\/li>\n<\/ul>\n<p>The primary advantage of this architecture over file integrity monitoring tools (such as AIDE or Tripwire) is temporal immediacy: while integrity checkers only detect changes after the fact via periodic cron hashes, <code>auditd<\/code> captures both successful and <em>denied<\/em> access attempts at the exact microsecond they occur.<\/p>\n<h2>Comparing Audit Methods: Naive File Watches vs. Precision Syscall Filters<\/h2>\n<p>Many administrators configure basic file watches using the <code>-w \/path\/to\/file -p rwa -k key<\/code> syntax. While straightforward, naive file watches generate immense log volume on busy servers because they trigger on <em>every single access<\/em>, regardless of whether the operation was authorized or failed due to permission constraints. In high-density hosting or database environments, logging millions of routine reads exhausts I\/O buffers and creates severe performance bottlenecks.<\/p>\n<p>By contrast, enterprise-grade audit configurations leverage <strong>exit-filtered system call rules<\/strong>. By instructing the kernel to log only when a system call terminates with <code>-EACCES<\/code> (Permission Denied) or <code>-EPERM<\/code> (Operation Not Permitted), administrators isolate genuine unauthorized access attempts while ignoring millions of legitimate operations.<\/p>\n<table style=\"width:100%;border-collapse:collapse;margin:24px 0;background:#1e293b;color:#e2e8f0;font-size:14px;border-radius:8px;overflow:hidden\">\n<thead style=\"background:#0f172a;color:#38bdf8\">\n<tr>\n<th style=\"padding:12px 16px;border-bottom:2px solid #334155;text-align:left\">Architectural Metric<\/th>\n<th style=\"padding:12px 16px;border-bottom:2px solid #334155;text-align:left\">Standard File Watch (<code>-w<\/code>)<\/th>\n<th style=\"padding:12px 16px;border-bottom:2px solid #334155;text-align:left\">Tuned Syscall Filter (<code>-a always,exit<\/code>)<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"padding:12px 16px;border-bottom:1px solid #334155\">Target Scope<\/td>\n<td style=\"padding:12px 16px;border-bottom:1px solid #334155\">Specific path or directory tree<\/td>\n<td style=\"padding:12px 16px;border-bottom:1px solid #334155;color:#10b981;font-weight:600\">VFS syscalls across selected files or globally<\/td>\n<\/tr>\n<tr>\n<td style=\"padding:12px 16px;border-bottom:1px solid #334155\">Event Filtering<\/td>\n<td style=\"padding:12px 16px;border-bottom:1px solid #334155\">Triggers on all matching permissions (r\/w\/x\/a)<\/td>\n<td style=\"padding:12px 16px;border-bottom:1px solid #334155;color:#10b981;font-weight:600\">Filters by exit code (e.g. <code>exit=-EACCES<\/code>, <code>exit=-EPERM<\/code>)<\/td>\n<\/tr>\n<tr>\n<td style=\"padding:12px 16px;border-bottom:1px solid #334155\">Log Volume &amp; Noise<\/td>\n<td style=\"padding:12px 16px;border-bottom:1px solid #334155\">Extremely High (Gigabytes\/hr on active files)<\/td>\n<td style=\"padding:12px 16px;border-bottom:1px solid #334155;color:#10b981;font-weight:600\">Minimal (Zero noise during normal operations)<\/td>\n<\/tr>\n<tr>\n<td style=\"padding:12px 16px;border-bottom:1px solid #334155\">CPU &amp; Storage Overhead<\/td>\n<td style=\"padding:12px 16px;border-bottom:1px solid #334155\">Moderate to High under sustained I\/O<\/td>\n<td style=\"padding:12px 16px;border-bottom:1px solid #334155;color:#10b981;font-weight:600\">Negligible (&lt; 1% CPU utilization on NVMe arrays)<\/td>\n<\/tr>\n<tr>\n<td style=\"padding:12px 16px;border-bottom:1px solid #334155\">Forensic Depth<\/td>\n<td style=\"padding:12px 16px;border-bottom:1px solid #334155\">Path, PID, UID, Comm<\/td>\n<td style=\"padding:12px 16px;border-bottom:1px solid #334155;color:#10b981;font-weight:600\">Syscall args, AUID, EUID, FSUID, Inode, Return Code<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<div style=\"background:#1e293b;border-left:4px solid #38bdf8;padding:16px 20px;margin:24px 0;border-radius:0 8px 8px 0;color:#e2e8f0\">\n  <strong style=\"color:#38bdf8\">Architecture Note &mdash; The Critical Role of AUID:<\/strong> The Audit Login User ID (<code>auid<\/code>) is recorded by the kernel when a user first authenticates via SSH, console, or display manager. Even if an attacker executes <code>sudo su -<\/code> or uses a setuid binary to switch their effective UID to 0 (root), their <code>auid<\/code> remains permanently tied to their original authentication identity. Never rely solely on <code>uid<\/code> or <code>euid<\/code> when analyzing security logs; <code>auid<\/code> represents the immutable chain of custody.\n<\/div>\n<h2>Production Configuration: Daemon Optimization &amp; Ruleset Deployment<\/h2>\n<p>Deploying audit rules requires two complementary configuration files: the daemon performance profile (<code>\/etc\/audit\/auditd.conf<\/code>) and the rule definition set (<code>\/etc\/audit\/rules.d\/50-unauthorized-access.rules<\/code>). Modern Linux distributions utilizing <code>auditd<\/code> 3.x+ compile individual rule files in <code>\/etc\/audit\/rules.d\/<\/code> into a single contiguous ruleset loaded into the kernel using <code>augenrules<\/code>.<\/p>\n<h3>1. Production Daemon Tuning (<code>\/etc\/audit\/auditd.conf<\/code>)<\/h3>\n<p>Before loading rules, optimize the userland daemon to prevent disk starvation and ensure high-throughput event processing during sustained traffic spikes:<\/p>\n<pre><code style=\"background:#0f172a;color:#38bdf8;padding:16px;border-radius:8px;display:block;font-family:monospace;font-size:13px;line-height:1.6\"># \/etc\/audit\/auditd.conf - Enterprise Production Profile\nlocal_events = yes\nwrite_logs = yes\nlog_file = \/var\/log\/audit\/audit.log\nlog_group = root\nlog_format = ENRICHED\nflush = INCREMENTAL_FLUSH\nfreq = 50\nmax_log_file = 200\nnum_logs = 10\npriority_boost = 4\nname_format = HOSTNAME\n\n## Space Management &amp; Failure Resilience\nmax_log_file_action = ROTATE\nspace_left = 500\nspace_left_action = SYSLOG\nadmin_space_left = 100\nadmin_space_left_action = SUSPEND\ndisk_full_action = SUSPEND\ndisk_error_action = SUSPEND\nuse_libwrap = yes\nverify_email = yes\naction_mail_acct = root\n<\/code><\/pre>\n<h3>2. Custom Audit Ruleset (<code>\/etc\/audit\/rules.d\/50-unauthorized-access.rules<\/code>)<\/h3>\n<p>The following ruleset establishes a hardened security baseline. It monitors critical configuration repositories, sensitive authentication databases, and kernel-level file access syscalls, flagging every operation that fails with <code>EACCES<\/code> or <code>EPERM<\/code> across both 64-bit and 32-bit execution layers.<\/p>\n<pre><code style=\"background:#0f172a;color:#38bdf8;padding:16px;border-radius:8px;display:block;font-family:monospace;font-size:13px;line-height:1.6\">## \/etc\/audit\/rules.d\/50-unauthorized-access.rules\n## Enterprise Unauthorized File Access &amp; Integrity Detection Rules\n\n# 1. Reset existing rules and set buffer size\n-D\n-b 8192\n\n# 2. Failure mode: 1 = printk notice, 2 = kernel panic (for ultra-high-security)\n-f 1\n\n# 3. Rate limiting (0 = unconstrained)\n-r 0\n\n## ====================================================================\n## SECTION A: Precision Syscall Monitoring for Unauthorized Access\n## Logs ANY file open\/truncate\/delete that terminates in EACCES or EPERM\n## ====================================================================\n\n# 64-bit Architecture - File Access Denials\n-a always,exit -F arch=b64 -S open,openat,openat2,creat,truncate,ftruncate -F exit=-EACCES -k unauthorized_file_access\n-a always,exit -F arch=b64 -S open,openat,openat2,creat,truncate,ftruncate -F exit=-EPERM  -k unauthorized_file_access\n\n# 32-bit Compatibility Layer - File Access Denials\n-a always,exit -F arch=b32 -S open,openat,creat,truncate,ftruncate -F exit=-EACCES -k unauthorized_file_access\n-a always,exit -F arch=b32 -S open,openat,creat,truncate,ftruncate -F exit=-EPERM  -k unauthorized_file_access\n\n# 64-bit Architecture - Unauthorized File Deletion &amp; Renaming Attempts\n-a always,exit -F arch=b64 -S unlink,unlinkat,rename,renameat,renameat2 -F exit=-EACCES -k unauthorized_file_deletion\n-a always,exit -F arch=b64 -S unlink,unlinkat,rename,renameat,renameat2 -F exit=-EPERM  -k unauthorized_file_deletion\n\n# 64-bit Architecture - Unauthorized Permission &amp; Ownership Modification\n-a always,exit -F arch=b64 -S chmod,fchmod,fchmodat,chown,fchown,fchownat,lchown -F exit=-EACCES -k unauthorized_attr_change\n-a always,exit -F arch=b64 -S chmod,fchmod,fchmodat,chown,fchown,fchownat,lchown -F exit=-EPERM  -k unauthorized_attr_change\n\n## ====================================================================\n## SECTION B: Targeted Watches on High-Value System Assets\n## ====================================================================\n\n# Authentication &amp; Identity Repositories\n-w \/etc\/passwd -p wa -k identity_tampering\n-w \/etc\/shadow -p rwa -k credentials_access\n-w \/etc\/gshadow -p rwa -k credentials_access\n-w \/etc\/security\/opasswd -p rwa -k credentials_access\n-w \/etc\/sudoers -p wa -k privilege_escalation\n-w \/etc\/sudoers.d\/ -p wa -k privilege_escalation\n\n# SSH Infrastructure\n-w \/etc\/ssh\/sshd_config -p wa -k sshd_config_modification\n-w \/etc\/ssh\/sshd_config.d\/ -p wa -k sshd_config_modification\n-w \/root\/.ssh\/ -p rwa -k root_ssh_keys\n\n# System Configuration &amp; Service Control\n-w \/etc\/systemd\/ -p wa -k systemd_unit_modification\n-w \/etc\/ld.so.conf -p wa -k dynamic_linker_tampering\n-w \/etc\/ld.so.conf.d\/ -p wa -k dynamic_linker_tampering\n-w \/etc\/pam.d\/ -p wa -k pam_tampering\n\n# Storage &amp; Mount Configurations\n-w \/etc\/fstab -p wa -k filesystem_mount_tampering\n\n## ====================================================================\n## SECTION C: Audit Configuration Immutability (Self-Defense)\n## ====================================================================\n-w \/etc\/audit\/ -p wa -k audit_config_tampering\n-w \/var\/log\/audit\/ -p wa -k audit_log_tampering\n\n# Make configuration immutable until system reboot (uncomment in production)\n# -e 2\n<\/code><\/pre>\n<div style=\"background:#1e293b;border-left:4px solid #38bdf8;padding:16px 20px;margin:24px 0;border-radius:0 8px 8px 0;color:#e2e8f0\">\n  <strong style=\"color:#38bdf8\">Security Hardening Alert &mdash; The <code>-e 2<\/code> Directive:<\/strong> Adding <code>-e 2<\/code> as the final rule locks the audit configuration directly in the kernel. Once active, no process&mdash;not even <code>root<\/code>&mdash;can add, delete, or modify audit rules, nor stop the audit daemon. Any attempt to modify rules requires a full system reboot. Always verify your rules thoroughly before enabling this flag in production.\n<\/div>\n<h2>Testing, Verification, and Forensic Log Analysis<\/h2>\n<p>After creating the ruleset, load it into the active kernel and verify that the rules are operational without syntax errors:<\/p>\n<pre><code style=\"background:#0f172a;color:#38bdf8;padding:16px;border-radius:8px;display:block;font-family:monospace;font-size:13px;line-height:1.6\"># Compile rules from \/etc\/audit\/rules.d\/ into \/etc\/audit\/audit.rules and load\naugencules --load\n\n# Verify active rules in the running kernel\nauditctl -l\n<\/code><\/pre>\n<h3>Simulating an Unauthorized Access Attempt<\/h3>\n<p>To confirm that our syscall rules trigger accurately on permission denial, create a test file restricted to root permissions, switch to an unprivileged account, and attempt to read it:<\/p>\n<pre><code style=\"background:#0f172a;color:#38bdf8;padding:16px;border-radius:8px;display:block;font-family:monospace;font-size:13px;line-height:1.6\"># Create restricted test file\ntouch \/opt\/restricted_payroll_data.db\nchmod 600 \/opt\/restricted_payroll_data.db\n\n# Attempt unauthorized access as an unprivileged user\nsu - testuser -c \"cat \/opt\/restricted_payroll_data.db\"\n# Expected output: cat: \/opt\/restricted_payroll_data.db: Permission denied\n<\/code><\/pre>\n<h3>Parsing the Generated Audit Log with <code>ausearch<\/code> and <code>aureport<\/code><\/h3>\n<p>Query the audit log specifically for events tagged with our custom key <code>unauthorized_file_access<\/code>:<\/p>\n<pre><code style=\"background:#0f172a;color:#38bdf8;padding:16px;border-radius:8px;display:block;font-family:monospace;font-size:13px;line-height:1.6\"># Query events with enriched, human-readable translation (-i)\nausearch -k unauthorized_file_access -ts recent -i\n<\/code><\/pre>\n<p>The resulting log output reveals the full anatomical context of the intercepted system call:<\/p>\n<pre><code style=\"background:#0f172a;color:#38bdf8;padding:16px;border-radius:8px;display:block;font-family:monospace;font-size:13px;line-height:1.6\">type=PROCTITLE msg=audit(09\/21\/2026 02:45:12.894:1042) : proctitle=cat \/opt\/restricted_payroll_data.db\ntype=PATH msg=audit(09\/21\/2026 02:45:12.894:1042) : item=0 name=\/opt\/restricted_payroll_data.db inode=524312 dev=fd:00 mode=file,600 ouid=root ogid=root rdev=00:00 nametype=NORMAL cap_fp=none cap_fi=none cap_fe=0 cap_fver=0\ntype=CWD msg=audit(09\/21\/2026 02:45:12.894:1042) : cwd=\/home\/testuser\ntype=SYSCALL msg=audit(09\/21\/2026 02:45:12.894:1042) : arch=x86_64 syscall=openat success=no exit=EACCES(Permission denied) a0=0xffffff9c a1=0x7ffe42b91870 a2=O_RDONLY a3=0x0 items=1 ppid=14201 pid=14202 auid=admin_alice uid=testuser gid=testuser euid=testuser suid=testuser fsuid=testuser egid=testuser sgid=testuser fsgid=testuser tty=pts1 ses=12 comm=cat exe=\/usr\/bin\/cat subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 key=unauthorized_file_access\n<\/code><\/pre>\n<h3>Deconstructing the Audit Record for Incident Response<\/h3>\n<p>Notice how thoroughly the record exposes the incident details:<\/p>\n<ul>\n<li><code>syscall=openat success=no exit=EACCES<\/code>: Confirms the exact kernel call failed due to permission denial.<\/li>\n<li><code>name=\/opt\/restricted_payroll_data.db<\/code>: Identifies the exact file path and inode targeted.<\/li>\n<li><code>exe=\/usr\/bin\/cat<\/code> &amp; <code>comm=cat<\/code>: Identifies the executable binary invoked by the actor.<\/li>\n<li><code>uid=testuser<\/code>: Identifies the effective user account executing the command.<\/li>\n<li><code>auid=admin_alice<\/code>: Exposes that the user who originally authenticated via SSH was <code>admin_alice<\/code>, establishing non-repudiation even if account hopping occurred.<\/li>\n<li><code>key=unauthorized_file_access<\/code>: Links the event directly to our custom monitoring rule for streamlined aggregation.<\/li>\n<\/ul>\n<h2>Automating Forensic Reporting &amp; Anomaly Detection<\/h2>\n<p>In high-throughput enterprise setups, reading raw audit logs is impractical. Use built-in tools like <code>aureport<\/code> to generate executive anomaly summaries, or integrate with automated parsing scripts:<\/p>\n<pre><code style=\"background:#0f172a;color:#38bdf8;padding:16px;border-radius:8px;display:block;font-family:monospace;font-size:13px;line-height:1.6\"># Summarize failed system calls across the entire fleet\naureport --syscall --failed --summary\n\n# Generate a summary of file access events\naureport --file --summary\n\n# Report all events associated with a specific audit key\nausearch --key unauthorized_file_access --format text\n<\/code><\/pre>\n<p>By scheduling periodic summaries or streaming audit netlink events directly to your security information and event management (SIEM) solution, you can automatically generate alerts when an unusual spike in <code>EACCES<\/code> events originates from a single <code>auid<\/code> or process tree.<\/p>\n<h2>Frequently Asked Questions<\/h2>\n<details style=\"background:#1e293b;border:1px solid #334155;border-radius:8px;padding:14px;margin-bottom:12px\">\n<summary style=\"cursor:pointer;font-weight:600;color:#38bdf8\">What is the performance overhead of monitoring syscalls with auditd on NVMe servers?<\/summary>\n<p style=\"margin-top:10px;color:#cbd5e1\">When configured with precise syscall exit-code filters (e.g., <code>exit=-EACCES<\/code>), auditd evaluates criteria in kernel space and only emits an event to the netlink queue when a call fails. On modern multicore servers with NVMe storage, this introduces less than 1.5% CPU overhead and zero perceptible I\/O penalty. Conversely, naive file watches (<code>-w<\/code>) that log every successful read can introduce substantial I\/O overhead under heavy workloads.<\/p>\n<\/details>\n<details style=\"background:#1e293b;border:1px solid #334155;border-radius:8px;padding:14px;margin-bottom:12px\">\n<summary style=\"cursor:pointer;font-weight:600;color:#38bdf8\">Why should I use syscall filters instead of simple file watches (-w) for unauthorized access?<\/summary>\n<p style=\"margin-top:10px;color:#cbd5e1\">Simple file watches trigger whenever a file is accessed according to the permission flag specified (e.g., <code>r<\/code>, <code>w<\/code>, <code>x<\/code>, <code>a<\/code>). They cannot distinguish between authorized operational access and unauthorized permission denials. Syscall filters allow you to inspect the return code (<code>exit=-EACCES<\/code> or <code>exit=-EPERM<\/code>), capturing exclusively the security anomalies that matter while discarding routine operational noise.<\/p>\n<\/details>\n<details style=\"background:#1e293b;border:1px solid #334155;border-radius:8px;padding:14px;margin-bottom:12px\">\n<summary style=\"cursor:pointer;font-weight:600;color:#38bdf8\">How does auditd preserve the original login identity (AUID) across sudo or su sessions?<\/summary>\n<p style=\"margin-top:10px;color:#cbd5e1\">The login user ID (AUID) is assigned to a process by PAM during the initial login session (e.g., SSH or console login) and written to <code>\/proc\/self\/loginuid<\/code>. The Linux kernel prohibits unprivileged processes from modifying this attribute. When a user runs <code>sudo<\/code> or <code>su<\/code> to become root, their effective UID changes to 0, but their AUID remains fixed to their original login identity throughout the entire process lineage.<\/p>\n<\/details>\n<details style=\"background:#1e293b;border:1px solid #334155;border-radius:8px;padding:14px;margin-bottom:12px\">\n<summary style=\"cursor:pointer;font-weight:600;color:#38bdf8\">How can I safely test new audit rules without risking kernel panics or buffer saturation?<\/summary>\n<p style=\"margin-top:10px;color:#cbd5e1\">Always set the audit failure flag to <code>-f 1<\/code> (printk warning) rather than <code>-f 2<\/code> (kernel panic) during testing. Configure a generous backlog buffer (<code>-b 8192<\/code> or higher) in your ruleset, and test rules in a non-production staging environment first. Never append <code>-e 2<\/code> (immutable lock) until you have fully verified that the ruleset compiles cleanly, causes no performance degradation, and generates expected log structures.<\/p>\n<\/details>\n<div style=\"background:linear-gradient(135deg, #0f172a 0%, #1e293b 100%);border:1px solid #334155;border-radius:12px;padding:32px;margin:40px 0;text-align:center\">\n<h3 style=\"color:#ffffff;margin-top:0;font-size:22px\">Ready to Deploy High-Performance Infrastructure?<\/h3>\n<p style=\"color:#cbd5e1;font-size:16px;line-height:1.6;max-width:680px;margin:12px auto 24px auto\">Experience blazing-fast NVMe storage, unmetered bandwidth, and enterprise LiteSpeed caching on CpanelFree.<\/p>\n<p>  <a href=\"https:\/\/cpanelfree.com\" style=\"background:#38bdf8;color:#0f172a;font-weight:700;padding:12px 28px;border-radius:6px;text-decoration:none;display:inline-block;font-size:15px\">Get Started with Free Cloud Hosting &rarr;<\/a>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Master the Linux Auditd framework with production-grade custom rules to detect unauthorized file access, trace kernel syscalls, and eliminate forensic blind spots.<\/p>\n","protected":false},"author":1,"featured_media":4665,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[172],"tags":[57,177,87,173,101],"class_list":["post-4666","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-security-hardening","tag-almalinux","tag-databases-performance","tag-devops","tag-security-hardening","tag-sysadmin"],"_links":{"self":[{"href":"https:\/\/cpanelfree.com\/blog\/wp-json\/wp\/v2\/posts\/4666","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cpanelfree.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/cpanelfree.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/cpanelfree.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/cpanelfree.com\/blog\/wp-json\/wp\/v2\/comments?post=4666"}],"version-history":[{"count":0,"href":"https:\/\/cpanelfree.com\/blog\/wp-json\/wp\/v2\/posts\/4666\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cpanelfree.com\/blog\/wp-json\/wp\/v2\/media\/4665"}],"wp:attachment":[{"href":"https:\/\/cpanelfree.com\/blog\/wp-json\/wp\/v2\/media?parent=4666"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cpanelfree.com\/blog\/wp-json\/wp\/v2\/categories?post=4666"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cpanelfree.com\/blog\/wp-json\/wp\/v2\/tags?post=4666"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}