Every process on a Linux system talks to the kernel through system calls. File opens, network connections, privilege changes, process executions — all of it flows through a narrow interface that the kernel controls. If you can observe that interface, you can see everything that happens on the system.
The question is not whether to audit your kernel. The question is which tool to use, what trade-offs you are willing to accept, and how to turn raw telemetry into actionable security signals.
Most organizations either audit too little (and miss critical events) or audit too much (and drown in noise they never look at). This article is about finding the right balance.
This is Part 1 of a three-part series on Linux Kernel Security. Part 2 will cover log collection and centralization pipelines. Part 3 will address detection engineering and incident response workflows built on top of the telemetry we configure here.
The Three Contenders
There are three dominant approaches to Linux kernel auditing in 2026:
| Feature | auditd | Tetragon (eBPF) | Falco (eBPF) |
|---|---|---|---|
| Architecture | Kernel audit subsystem + userspace daemon | eBPF programs attached to kernel hooks | eBPF probe on syscall interface |
| Kernel requirement | Any Linux kernel (2.6+) | Linux 5.x+ (BTF recommended) | Linux 4.14+ (eBPF driver) or kernel module |
| Container awareness | None (sees PIDs only) | Full (namespace, pod, container metadata) | Full (container ID, image, namespace) |
| Enforcement | No (detection only) | Yes (can kill processes, block syscalls) | No (detection only, alert-based) |
| Output format | Custom key=value log lines | JSON (structured events) | JSON or gRPC (structured events) |
| Overhead | Low-moderate (10-15% CPU at aggressive tuning) | Very low (<1-5% typical) | Low (eBPF driver) |
| CNCF status | N/A (Linux kernel project) | Sandbox (Cilium/Isovalent) | Graduated |
| Primary use case | Compliance, forensics | Security observability + enforcement | Runtime threat detection |
Each tool makes fundamentally different architectural choices. Understanding those choices is the key to deploying them effectively.
auditd: The Kernel’s Native Audit Framework
auditd has been part of the Linux kernel since 2.6. It is the reference implementation for system auditing, mandated by compliance frameworks like PCI-DSS, HIPAA, and SOC2. If you run Linux in production, auditd is almost certainly already installed.
Architecture
The audit framework operates at two levels:
- Kernel component — intercepts syscalls, file accesses, and security events based on configured rules, then writes audit records to a netlink socket.
- Userspace daemon (
auditd) — reads events from the netlink socket and writes them to/var/log/audit/audit.log.
Two configuration files control its behavior:
/etc/audit/auditd.conf— daemon settings: log file location, rotation policy, disk full action, flush frequency./etc/audit/rules.d/*.rules— audit rules loaded byauditctlat boot.
| |
Understanding auditd Log Types
This is where most people get lost. auditd does not produce simple, single-line log entries. A single auditable event generates multiple related records tied together by a common audit ID. Understanding these record types is essential for forensic analysis and SIEM rule writing.
| Record Type | Description | When Generated |
|---|---|---|
| SYSCALL | The core record — captures which syscall was invoked, by whom, with what result | Every audited syscall |
| EXECVE | Full command-line arguments for process execution | When execve() is audited |
| PATH | File path information (name, inode, mode, owner) | File-related syscalls |
| CWD | Current working directory of the process | Accompanies PATH records |
| PROCTITLE | Full process title (encoded) | Every audited event |
| USER_AUTH | Authentication attempt (PAM-based) | Login, sudo, su |
| USER_ACCT | Account status check | Login flows |
| USER_CMD | Command executed via sudo | sudo invocations |
| CRED_ACQ | Credential acquisition | Login, su, sudo |
| CRED_DISP | Credential disposal | Logout, session end |
| ANOM_ABEND | Abnormal process termination | Crash, segfault, killed |
| NETFILTER_CFG | Firewall rule modification | iptables/nftables changes |
Here is what a single execve event looks like in the audit log — note how it spans multiple lines:
| |
auid field (audit UID) is one of the most important fields in auditd. It tracks the original login UID of the user, even across su and sudo transitions. If a user logs in as jdoe (uid=1000) and then runs sudo su -, the uid and euid fields will show 0 (root), but auid will still show 1000. This is how you trace actions back to the human who initiated them.Installation
auditd is available on virtually every Linux distribution:
| |
It starts automatically and requires zero external dependencies. This is its greatest strength for compliance-driven environments.
Must-Have auditd Rules
The following ruleset is adapted from Neo23x0’s production auditd configuration, which is the de-facto starting point for security-focused auditd deployments:
| |
-e 2 flag makes the audit rules immutable. Once set, rules cannot be changed without a reboot. This prevents an attacker who gains root from disabling auditing. Always put this as the last rule, and test your configuration thoroughly before enabling it in production.Querying auditd Logs
auditd ships with powerful search and reporting tools:
| |
auditd: Pros and Cons
Pros:
- Universally available on Linux — no dependencies, no kernel version requirements
- Compliance frameworks explicitly reference it (PCI-DSS 10.2, HIPAA audit controls)
- Immutable rules prevent attacker tampering post-compromise
- Tracks
auidacross privilege changes for complete user attribution - Mature tooling (
ausearch,aureport,audispdfor log forwarding)
Cons:
- No container awareness — cannot distinguish container PID namespaces from host processes
- Verbose, multi-line log format requires correlation by audit ID
- Performance impact at aggressive rule sets (10-15% CPU overhead in production)
- Rules operate on syscall numbers, not semantic events — steep learning curve
- No enforcement capability — detection only
Tetragon: eBPF-Powered Kernel Observability and Enforcement
Tetragon, originally developed by Isovalent (the company behind Cilium) and now a CNCF project, represents the eBPF-native approach to kernel security. It attaches eBPF programs directly to kernel functions and tracepoints, collecting security telemetry with minimal overhead.
Architecture
Unlike auditd, which hooks into the kernel’s audit subsystem, Tetragon attaches eBPF programs to:
- Tracepoints — stable kernel instrumentation points
- Kprobes/kretprobes — dynamic hooks on any kernel function
- LSM hooks — Linux Security Module attachment points for enforcement
This means Tetragon can observe not just syscalls, but any internal kernel function — giving it deeper visibility than auditd.
┌─────────────────────────────────────────┐
│ Userspace │
│ ┌──────────┐ ┌──────────────────┐ │
│ │ tetragon │◀────│ TracingPolicy │ │
│ │ agent │ │ (CRD/YAML) │ │
│ └────▲─────┘ └──────────────────┘ │
│ │ │
├───────┼──────────────────────────────────┤
│ │ Kernel Space │
│ ┌────┴─────┐ ┌───────────┐ │
│ │ eBPF │──│ Kprobes / │ │
│ │ programs │ │ LSM hooks │ │
│ └──────────┘ └───────────┘ │
└─────────────────────────────────────────┘
Installation
Tetragon can run as a standalone daemon or as a Kubernetes DaemonSet:
| |
zgrep CONFIG_DEBUG_INFO_BTF /proc/config.gz.Must-Have Tetragon Policies
Tetragon uses TracingPolicy resources (YAML) to define what to observe and enforce:
| |
| |
| |
Where Tetragon truly differentiates itself is enforcement. Unlike auditd and Falco, Tetragon can kill processes or block syscalls directly in the kernel:
| |
Sigkill action on a critical syscall will terminate legitimate processes. Always deploy enforcement policies in observation mode first, analyze the events, and only then enable the kill action. There is no undo for a killed process.Tetragon: Pros and Cons
Pros:
- Extremely low overhead (eBPF runs in kernel space, no context switching)
- Full container and Kubernetes awareness (pod, namespace, container metadata)
- Enforcement capability — can block threats in real-time, not just alert
- Structured JSON output — native integration with modern SIEM/observability stacks
- Deep kernel visibility beyond syscalls (kprobes on internal functions)
Cons:
- Requires modern kernel (5.x+ with BTF) — not available on older enterprise distributions
- Policy language is powerful but complex — steeper learning curve than Falco rules
- Smaller community and rule ecosystem compared to Falco
- Enforcement mode carries operational risk if misconfigured
- Less mature than auditd for compliance and audit trail requirements
Falco: Cloud-Native Runtime Threat Detection
Falco, a CNCF-graduated project, sits between auditd and Tetragon in terms of approach. It uses eBPF (or a kernel module on older systems) to tap into the syscall interface, then applies a human-readable rule engine to generate alerts.
Architecture
Falco’s design prioritizes ease of detection rule authoring:
- eBPF driver captures syscall events in kernel space
- Falco engine in userspace evaluates events against rules
- Output channels route alerts to stdout, files, gRPC, HTTP webhooks, or Slack/PagerDuty
The rule language is Falco’s killer feature — it abstracts away syscall numbers and raw kernel data behind readable conditions:
| |
Installation
Falco supports multiple installation methods:
| |
Falco’s installation story is significantly smoother than Tetragon’s, especially for Kubernetes deployments. The Helm chart includes sensible defaults and ships with a comprehensive default ruleset.
Must-Have Falco Rules
Falco ships with hundreds of default rules. Here are custom additions that cover critical detection gaps:
| |
Falco: Pros and Cons
Pros:
- CNCF-graduated with a large, active community and extensive default rules
- Human-readable rule language — significantly lower barrier than raw auditd or Tetragon policies
- Full container and Kubernetes context in every event
- Rich output ecosystem (Falcosidekick supports 50+ output targets)
- Supports both eBPF driver and kernel module (broader kernel compatibility)
Cons:
- Detection only — cannot enforce or block threats at runtime
- Userspace rule evaluation adds latency compared to pure eBPF enforcement
- High-volume environments may need tuning to avoid alert fatigue
- eBPF driver still requires kernel 4.14+ (kernel module is an alternative but less secure)
- Rules focus on container workloads — bare-metal server monitoring is less mature
Choosing the Right Tool (Or Using Multiple)
The right choice depends on your environment and requirements:
| Scenario | Recommended Tool(s) |
|---|---|
| Compliance-driven bare-metal servers | auditd — it is the standard, auditors know it |
| Kubernetes clusters running microservices | Falco — container-native, great default rules |
| High-security environments needing enforcement | Tetragon — observe and block in kernel space |
| Hybrid (compliance + runtime detection) | auditd + Falco — auditd for audit trail, Falco for alerting |
| Enterprise Kubernetes with zero tolerance | Tetragon + Falco — Tetragon enforces, Falco alerts and integrates with SIEM |
A Practical Starting Point
If you are starting from scratch, here is a pragmatic rollout plan:
Week 1 — Deploy auditd everywhere. Use the Neo23x0 ruleset as your baseline. Focus on execve monitoring, privilege escalation, and credential access. This gives you immediate forensic capability.
Week 2 — Deploy Falco on container hosts. Start with the default rules. Tune out the noise from your known workloads. Connect Falcosidekick to your alerting channel.
Week 3 — Evaluate Tetragon for enforcement. Deploy in observation-only mode on a non-critical cluster. Write policies for your highest-risk scenarios (kernel module loading, namespace manipulation). Only enable enforcement after a full observation cycle.
Ongoing — Iterate on rules. Map your rules to MITRE ATT&CK techniques. Track coverage gaps. Treat your detection rules like code: version-controlled, tested, reviewed.
Conclusion
Linux kernel auditing is not a solved problem with a single tool. auditd gives you the compliance-grade, tamper-resistant audit trail that has been the foundation of Linux security for two decades. Tetragon gives you eBPF-native kernel observability with the unique ability to enforce policy at the kernel level. Falco gives you a cloud-native detection engine with a rule language that security teams can actually read and maintain.
The mature approach is to layer them. Use auditd for compliance and forensic depth. Use Falco or Tetragon for real-time detection and container-aware alerting. And treat all of it as raw telemetry that feeds into a centralized detection pipeline — which is exactly what we will build in Part 2.
The kernel sees everything. Make sure you are watching it back.
References:
- Configure Linux System Auditing with auditd — Red Hat
- Neo23x0 Best Practice auditd Configuration — GitHub
- Mastering Auditd Advanced Usage in Production Environments — Linux Guide
- Linux auditd for Threat Detection — IzyKnows
- Tetragon: eBPF-based Security Observability and Runtime Enforcement
- eBPF: The Silent Security Revolution Inside Your Linux Kernel — DEV Community
- Linux eBPF Security Advisory: Critical Visibility Concerns — Linux Security
- Falco — Cloud Native Runtime Security
- From Observability to Action: Using Falco for Kubernetes Threat Detection — Schoenwald
- How to Implement Falco for Container Security — OneUptime
- Linux Kernel CVEs 2025 — CIQ
