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

After looking to the future in episode 21 — the 4.1.x maintenance releases, the 5.x era, and the roadmap toward 5.1 — the final episode has arrived. We won't add new tools. We'll put AppArmor in its place within the wider Linux security ecosystem, compare it with real alternatives, recap the journey from episode 0 to 21, and close with a production checklist and a further learning map. This is the final map of this 23-episode series.
Before comparing, let's refresh one framework that underpinned this whole series.
Linux has two layers of access control. DAC (Discretionary Access Control) is the classic Unix model: owner, group, and others, plus the suid bit. The file owner can grant access as they wish — discretionary means it's up to the owner. MAC (Mandatory Access Control) is a decision outside the file owner's control, made by centralized policy; the owner can't grant access the policy forbids.
The analogy we often use: DAC is like a house with one key the owner can copy; MAC is like a building with access cards managed by a single central authority — even if the room owner sticks a card on the door, the security guard still holds the list of who may enter. AppArmor, which you studied for 22 episodes, is one implementation of MAC — and not the only one.
| Mechanism | Rule Basis | Learning Curve | Main Strength | Common Users |
|---|---|---|---|---|
| AppArmor | Path-based profiles | Gentle | Quickly confines a single application | Ubuntu, Debian, SUSE |
| SELinux | Labels + Type Enforcement | Steep | Most detailed and flexible | RHEL, Fedora, and derivatives |
| Smack | Simple labels | Gentle | Lightweight, good for embedded | Industrial and IoT |
| TOMOYO | Path + capability | Gentle | Automatic learning mode | Systems needing quick setup |
A brief explanation of each. AppArmor works with path-based profiles — for example "the application at /usr/sbin/nginx may read /etc/nginx/nginx.conf, nothing else". Because it attaches to paths, it's easy to understand, but less expressive than SELinux labels and can be bypassed if a file is renamed or hard-linked outside the profile's knowledge. SELinux uses labels on objects and processes with Type Enforcement — more powerful and detailed, but with a steep learning curve. Smack uses labels like SELinux but is much simpler, common on embedded devices. TOMOYO is path-based with an automatic learning mode.
This comparison isn't about "who's best", but "what conditions are you facing". Details of each mechanism can be dug out of each project's official documentation.
Beyond LSMs, there are mechanisms often mistaken for AppArmor replacements.
CAP_NET_BIND_SERVICE, CAP_DAC_OVERRIDE, and so on. They limit what root can do, but aren't object-based access control. Think of them as a staff permission list, not a floor plan.The three aren't AppArmor replacements — they layer with it. The safest scenario uses several at once: AppArmor limits object access by path, capabilities trim root rights, seccomp blocks dangerous syscalls, and Landlock adds self-confinement when needed.
With all those options, when is AppArmor the right answer?
Conversely, choose SELinux for RHEL-family workloads, multi-tenant environments needing strict isolation, or label-based audit requirements. And don't forget seccomp and capabilities as complements wherever you are. The right decision is the one that fits the context — not the most popular one.
The twenty-two previous episodes were built in layers, like an AppArmor policy itself. Here's a brief map:
| Range | Theme | Core Content |
|---|---|---|
| 0–3 | Foundations | Setup, history, MAC concepts, status modes & load/unload |
| 4–7 | Profiles & Tools | File rules, aa-genprof, aa-logprof, network & capabilities |
| 8–11 | Service & Container | Tunables, web services, Docker, containerd, Kubernetes |
| 12–15 | Hardening & Observability | Attack surface, sensitive data, CVEs, auditing & monitoring |
| 16–18 | Advanced & Automation | LSM stack, advanced features, tooling & automation |
| 19–21 | Releases & Direction | AppArmor 5, multi-host scale, roadmap & ecosystem |
Across this series one pattern repeats: start from observation — what's forbidden — then narrow permissions to a minimum, then verify the service still runs. That pattern is the most valuable skill you carry out of this series — far more valuable than memorized commands.
Before considering a system "done", run this checklist:
| Item | Description |
|---|---|
| Profiles enforced | aa-status shows active profiles in enforce mode, not complain |
| Logs monitored | aa-notify active, denials sent to an aggregator, alerts for odd patterns |
| Parser & daemon updated | Userspace 4.1.7 or 5.0.1 and up; kernel follows distro updates |
| Profiles versioned | All profiles in git, versioned artifacts in CI (episode 18) |
| Coverage of all services | aa-unconfined shows no exposed service without a profile |
| Profile backup | Profiles can be restored from the repository at any time |
A quick verification you can run right now — status and coverage with aa-status, and unconfined processes with aa-unconfined:
sudo aa-statussudo aa-unconfinedNote
This checklist isn't a judgment tool, it's a fix tool. No system is born perfect; what exists is systems maintained toward perfection. Run this checklist regularly — a quarterly rhythm is reasonable — mark what doesn't pass, and make a plan to close the gaps.
Your AppArmor journey doesn't stop at episode 22. Here are the resources we recommend:
man apparmor.d, man apparmor_parser, and man aa-genprof are the most accurate and closest references.And here is the endpoint. Over 23 episodes — from episode 0 to 22 — you've built your understanding of AppArmor from zero: why MAC is needed, how path-based profiling works, how to write profiles with file rules, using interactive tools, configuring network and capabilities, confining web services and containers, reducing the attack surface, securing sensitive data, understanding CVEs, auditing and monitoring, diving into the LSM stack and advanced features, automating policy in CI, following the AppArmor 5 transition, managing across many hosts, and now placing AppArmor in the wider ecosystem. That is a complete journey — not just a collection of commands, but a way of thinking.
Let's close with the three most important messages.
First, AppArmor is a tool, not a goal. It answers the question "what may this application touch" in a simple and effective way. On the right systems — Debian, Ubuntu, SUSE, container hardening — it's a real advantage; elsewhere, alternatives like SELinux can be a more sensible choice. True expertise is choosing the tool that fits the context.
Second, security is built from observation and iteration, not boldness. This whole series taught one pattern: look at the denial, understand it, allow the minimum, verify. There's no such thing as a denial that's "fixed without reading it" — and that pattern is what will save you in production, over and over.
Third, keep practicing. A healthy AppArmor policy is one that's tested and maintained, not one written once and forgotten. Build a lab, simulate incidents, test rollouts, and update the userspace regularly. This skill is rare and very valuable — in the world of DevOps, SRE, and infrastructure security, an admin who understands MAC is an irreplaceable asset.
Thank you for following this series to the end. You now have a complete map not only to understand AppArmor, but to manage it with confidence. Build something secure, record what you learn, and share it back with the community. See you in the next learning series — and happy building as a Linux security practitioner!