Mandatory Access Control (MAC) zählt zu den robustesten Sicherheitsmechanismen des Linux-Ökosystems. Während Namespaces, Capabilities und Seccomp isolieren, kontrolliert MAC den tatsächlichen Zugriff auf Dateien, Prozesse und Systemobjekte. SELinux und AppArmor sind dabei die zwei dominierenden Implementierungen, mit grundverschiedenen Philosophien, aber ähnlichem Ziel: präzise, regelbasierte Beschränkung dessen, was Containerprozesse tun dürfen – auch dann, wenn sie bereits in Namespaces laufen oder Capabilities besitzen. Podman und Kubernetes integrieren MAC-Profile auf unterschiedlichen Abstraktionsebenen und machen sie zu unverzichtbaren Bausteinen eines sicheren Containerbetriebs.
MAC-Systeme funktionieren nicht wie klassische UNIX-Permissions oder ACLs. Sie deklarieren nicht „was darf ein User?“, sondern „was darf ein Prozesskontext?“. Das heißt: Ein Containerprozess wird nicht über UID/GID oder Capabilities beurteilt, sondern über sein Sicherheitslabel (SELinux) oder sein Profil (AppArmor).
Der Schutzmechanismus wirkt unabhängig von Benutzerrechten oder Namespaces. Selbst ein Container-Root (UID 0 im User Namespace) ist vollständig kontrolliert.
Modellhaft:

Egal wie viele Privilegien der Prozess besitzt – das Label entscheidet.
SELinux arbeitet mit Kontexten, die aus vier Teilen bestehen:
user:role:type:level
Container arbeiten praktisch immer mit type-basierten
Regeln. Podman setzt automatisch geeignete Labels, wenn SELinux aktiv
ist (z. B. in Fedora, RHEL, CentOS Stream).
Standardlabel für Containerprozesse:
system_u:system_r:container_t:s0
Standardlabel für Containerdateisysteme:
system_u:object_r:container_file_t:s0
typeDer Type definiert, welche Interaktionen erlaubt sind.
container_t darf beispielsweise:
container_file_t-Bereiche schreibenDamit wird verhindert, dass ein Container, selbst mit eskalierten Capabilities, unautorisiert auf Hostressourcen zugreift.
Podman erkennt SELinux automatisch und zwingt korrekte Labels:
-v /data/app:/app:Z
Varianten:
:Z → exklusives Label für diesen Container:z → Shared-Label für mehrere ContainerFehlt dieses Labeling, verweigert SELinux jeden Zugriff. Der Container sieht das Verzeichnis – aber der Kernel blockiert alle Operationen.
Kubernetes übergibt Labels über den securityContext:
securityContext:
seLinuxOptions:
type: container_tIn OpenShift wird dies noch umfangreicher genutzt:
AppArmor arbeitet anders als SELinux. Statt Labels für jedes Objekt existieren feste Profile für Programme und Container. Eine AppArmor-Regel definiert:
ptrace erlaubt istEin vereinfachtes Beispielprofil:
profile my-container-default {
network inet,
deny /etc/shadow r,
deny /proc/sys/** w,
/app/** r,
/data/** rw,
}
AppArmor denkt nicht in Typen, sondern in „Policies pro Prozess“.
Podman kann AppArmor-Profile explizit übergeben:
podman run --security-opt apparmor=my-container-default ...
Fehlt ein Profil, nutzt Podman in AppArmor-Distributionen das Profil:
docker-default
Ein konservatives, aber brauchbares Sicherheitsprofil.
Kubernetes aktiviert AppArmor per Annotation:
metadata:
annotations:
container.apparmor.security.beta.kubernetes.io/app: localhost/my-profileAppArmor ist im Kubernetes-Umfeld vor allem in Ubuntu-basierten Clustern relevant.
| Aspekt | SELinux | AppArmor |
|---|---|---|
| Modell | Label-basiert | Profil-basiert |
| Zugriffskontrolle | Mandatory + systemweit kohärent | Mandatory, aber pro Prozess |
| Granularität | sehr hoch (object-level) | mittel (path-level) |
| Konfiguration | komplex | vergleichsweise einfach |
| Einsatz in Enterprise | RHEL/Fedora/OpenShift | Ubuntu/Debian |
| Integration in Podman | automatisch | optional |
| Kubernetes-Unterstützung | komplett, besonders in OpenShift wichtig | gut, aber weniger verbreitet |
Beide Modelle haben Stärken – SELinux ist mächtiger, AppArmor zugänglicher.
MAC-Systeme sind der letzte Verteidigungswall, wenn alle anderen Mechanismen versagen. Die Isolationsarchitektur lässt sich so ausdrücken:

Auf jeder Ebene kann ein Prozess eingeschränkt werden:
MAC ist die instanzielle „Hard Enforcement Layer“.
Beispiel:
-v /var/lib/data:/data
Ohne :Z oder :z darf der Container nicht
schreiben – und Administratoren deaktivieren aus Frust SELinux.
Stattdessen: korrekt labeln.
Wird oft getan, wenn Logs unverständlich erscheinen. Konsequenz: Der gesamte Sicherheitsgewinn verpufft.
Profile müssen regelmäßig an neue Pfade, Versionen und Binärdateien angepasst werden.
CAP_SYS_ADMIN + lax MAC → fatalWer Capabilities aufweicht, aber MAC deaktiviert, zerstört das gesamte Sicherheitsmodell.
docker-default zu nutzenSELinux und AppArmor sind keine optionalen Add-ons, sondern die höchste Ebene der Container-Sicherheitsschichten. Sie greifen, wenn alles andere bereits versagt hat. Wer Containerarchitekturen ernsthaft schützt, muss MAC-Profile verstehen, einsetzen und regelmäßig überprüfen – unabhängig davon, ob Podman, Docker oder Kubernetes im Spiel sind.