The final episode: comparing seccomp with AppArmor, SELinux, capabilities, Landlock, and virtual machines; when to choose seccomp; a recap of the 23-episode journey; a production checklist; and learning resources to go further.

After looking at modern libseccomp features and the roadmap ahead in episode 21, we've reached the final episode. We won't add new tools; we'll put seccomp in its place within the broader Linux security ecosystem, compare it with real alternatives, recap the entire journey from episode 0 to 21, and close with a production checklist and a map for further learning. This is the final map of this 23-episode series.
Linux provides many security tools working at different layers. Each answers a different question.
| Mechanism | Working Layer | What It Restricts | Main Strength |
|---|---|---|---|
| seccomp | Kernel, per syscall | Which syscalls may be called | Cheap, universal, right for containers |
| AppArmor | LSM, path-based | Path-based object access | Fast to understand, suits one application |
| SELinux | LSM, label-based | Label-based object access | Most detailed, strong for multi-tenant |
| Capabilities | Kernel, privileges | Rights held by root processes | Trims superuser rights into small pieces |
| Landlock | LSM, path-based | Filesystem access without root | Simple, safe filesystem locking |
| VM / sandbox | Above the kernel | The entire virtual kernel surface | Strongest isolation for untrusted code |
A short explanation of each:
CAP_NET_BIND_SERVICE. It doesn't control object access, but process privileges.The most common mistake is treating these mechanisms as competitors that replace each other. In reality they layer: seccomp restricts syscalls at the bottom layer, capabilities trim root privileges, AppArmor or SELinux restrict object access, and Landlock locks the filesystem — all can be active at once.
A fitting analogy: seccomp is the guard at the building gate, capabilities are the set of keys each employee carries, AppArmor or SELinux is the per-room access card, and the virtual machine is a truly separate building. Posting a guard doesn't replace access cards — both work to cover each other's mistakes.
The safest scenario inside a container uses all of them: seccomp blocks dangerous syscalls, capabilities trim root privileges, the filesystem is made read-only, and AppArmor or SELinux locks object access.
With all those options, when is seccomp the right answer?
If your need is really detailed object-access control, AppArmor or SELinux is the honest choice. If the code is truly untrusted, a full sandbox or virtual machine is the answer. There's no compulsion to use seccomp everywhere — the right decision is the one that fits the context.
The twenty-two episodes before this were built in layers, just like a seccomp filter itself. Here's a short map:
| Range | Theme | Core Content |
|---|---|---|
| 0–3 | Foundations | Setup, kernel 2.6.12 history, seccomp-bpf concepts, modes and return actions |
| 4–7 | API and Filters | Basic libseccomp, arg filter and architecture, NOTIFY, debugging and testing |
| 8–12 | Integration | Docker and runc profiles, systemd, Kubernetes, applications and daemons, capabilities combination |
| 13–17 | Deep Dive | Blocking attack surfaces, CVEs and 2.6.1 patches, audit and monitoring, kernel interface and prctl, advanced filter design |
| 18–21 | Production and Direction | Performance, sandboxing projects, policy-as-code, modern features and roadmap |
Notice the pattern repeated throughout this series: always start from observation (which syscalls are actually used), then narrow permissions to the minimum, then verify (denials gone, application still working). That pattern is the most valuable skill you take out of this series.
Before considering a system "done", run this checklist:
| Item | Description |
|---|---|
| Latest libseccomp | Version 2.6.1 or newer; syscall table in sync with the kernel (episode 21) |
| Minimal, validated profile | Curated syscall list, passes CI validation (episode 20) |
| NOTIFY and LOG installed | Risky syscalls use NOTIFY, scheduled LOG observation period |
| Kubernetes RuntimeDefault | Or localhost for custom profiles, not unconfined (episode 10) |
| Layer combination | capabilities + seccomp + read-only filesystem active together |
| Denial monitoring | Denial spikes as early alarm, wired to monitoring (episode 15) |
A quick verification you can run right now:
grep Seccomp /proc/self/status
pkg-config --modversion libseccomp
scmp_sys_resolver -tCheck installed filters on important processes with grep Seccomp /proc/<pid>/status' and monitor denials through the audit log as you learned in episode 15.
Note
This checklist isn't a judgment tool, it's an improvement tool — exactly as we've emphasized throughout the series. No system is born perfect; what exists are systems maintained toward perfection. Run this checklist periodically, mark what doesn't pass, and make a plan to close the gaps.
Your journey with seccomp doesn't stop at episode 22. Here are the resources we recommend:
man seccomp, man seccomp_notify, and man libseccomp are the most accurate and closest references.Documentation/userspace-api/seccomp_filter.rst officially explains filters, architectures, and flags.default.json file in the moby repository is an example production profile you can study and imitate.And here is the endpoint. Over 23 episodes — from episode 0 to 22 — you've built your understanding of seccomp from zero: why kernel 2.6.12 gave birth to the first mode, how BPF works as a filter, how to write filters with libseccomp, operating NOTIFY, managing profiles in Docker, Kubernetes, and systemd, combining with capabilities, blocking attack surfaces, following the 2.6.1 security patches, measuring performance, seeing seccomp work in sandboxing projects, managing profiles as code, reviewing the roadmap, and now placing it in the broader ecosystem. That's a complete journey — not just a collection of commands, but a way of thinking.
Let's close with the three most important messages.
First, seccomp is a tool, not a goal. It answers "which kernel operations may this process perform" in a way that's cheap, deterministic, and layered alongside other mechanisms. In containers it's the standard; in daemons it's a cheap safeguard; in sandboxes it's the innermost gate. True expertise is choosing and combining the right tool for the context.
Second, security is built from observation and iteration, not from boldness. This entire series taught one pattern: record the real syscalls, allow the minimum, verify, then tighten. No single denial is "justified without being read" — and that pattern is what will save you in production, again and again.
Third, keep practicing. A healthy seccomp filter is one that's tested and maintained, not one written once and forgotten. Build a lab, simulate incidents, measure overhead, test rollback, and update libseccomp regularly. This skill is rare and very valuable — in the DevOps, SRE, and infrastructure security world, practitioners who understand seccomp are an irreplaceable asset.
Thank you for joining this series to the end. You now have a complete map to not only understand seccomp, but also manage it with confidence. Build something secure, record what you learn, and share it back to the community. See you in the next learning series — and happy building as a Linux security practitioner!