SELinux AppArmor entscheidet auf modernen Linux-Servern, wie streng Prozesse agieren dürfen, selbst wenn sie Root-Rechte erhalten. Ich zeige die praktischen Unterschiede zwischen labelbasierter und pfadbasierter Zugriffskontrolle und bewerte ihren Nutzen für Container, Server-Härtung und Compliance.
Zentrale Punkte
- MAC-Prinzip: Beide begrenzen Prozesse zusätzlich zu Unix-Rechten.
- Modell: SELinux nutzt Labels, AppArmor Pfade.
- Container: SELinux trennt Container feiner via MCS.
- Bedienung: AppArmor gilt als leichter handhabbar.
- Einsatz: Wahl folgt oft der Distribution.
SELinux und AppArmor kurz erklärt
Ich setze auf Mandatory Access Control, wenn ich Linux-Server absichere. SELinux erweitert den Kernel um ein labelbasiertes Modell, das Prozesse, Dateien, Sockets und Ports mit Sicherheitskontexten versieht. Eine globale Policy legt fest, welche Typen interagieren dürfen und welche Zugriffe strikt blockieren. AppArmor verfolgt ein profil- und pfadbasiertes Konzept, das pro Anwendung erlaubt, welche Pfade, Fähigkeiten und Schnittstellen genutzt werden. Beide ergänzen klassische DAC-Rechte, damit kompromittierte Prozesse nur das Zugelassene ausführen und kein Seitwärtsbewegen gelingt.
Sicherheitsmodell: Labels vs. Pfade
Ich bewerte das Sicherheitsmodell zuerst, weil es die Wartbarkeit prägt und Fehler minimiert. SELinux hängt Regeln an Labels, die mit der Datei wandern und daher bei Umzügen im Dateisystem konsistent bleiben. AppArmor bindet Regeln an Pfade, was sehr greifbar ist, aber bei Umbenennungen Nachpflege verlangt. Das labelbasierte Denken wirkt systemzentriert, das pfadbasierte eher applikationszentriert und nah am Werkzeugkasten der Administratoren. Beide Ansätze kontrollieren dieselbe Realität, doch sie strukturieren die Policy unterschiedlicher und erzwingen verschiedene Arbeitsweisen, die ich je nach Teamreife wähle.
| Aspekt | SELinux | AppArmor |
|---|---|---|
| Kontrollmodell | Label-/Typ-basiert (Type Enforcement) | Pfad-/Profil-basiert je Anwendung |
| Policy-Reichweite | Globales, systemweites Regelwerk | Prozess- und anwendungsbezogene Profile |
| Datei verschieben | Label bleibt erhalten | Pfad muss ggf. angepasst werden |
| MLS/MCS | Vorhanden (feine Trennung) | Nicht vorhanden |
| Container-Isolation | Host- und Inter-Container-Abschirmung | Primär Host-Abschirmung |
| Einstieg | Steilere Lernkurve | Schneller anwendbar |
Komplexität und Bedienbarkeit
Ich plane die Einführung entlang der Teamfähigkeiten und der Fehlertoleranz des Betriebs. SELinux liefert enorme Detailtiefe, verlangt dafür aber ein gutes Verständnis von Typen, Rollen und Domänen sowie solide Diagnosewerkzeuge. Die globale Sicht erhöht die Konsistenz, doch Fehlregeln können Auswirkungen auf viele Dienste haben und müssen strukturiert entschärft werden. AppArmor bietet mir einen sanften Start, da ich Profile pro Dienst schreibe und Verstöße gezielt diesem Dienst zuordne. Diese Transparenz senkt den Frustfaktor und lässt mich Änderungen zügig und mit Überblick in Produktion bringen.
Bedrohungsmodell und typische Szenarien
Ich entscheide anhand konkreter Risiken, die ich adressiere. Beide MAC-Mechanismen reduzieren nachhaltig:
- RCE-Folgeschäden: Ein entführter Webprozess liest nicht automatisch beliebige Schlüssel oder Konfigs.
- Privilege Escalation: Selbst mit Root-Rechten verhindern Policies unautorisierte Zugriffe auf sensible Ressourcen.
- Seitwärtsbewegung: Prozesse kommen nicht an benachbarte Datenbestände, Sockets oder Geräte.
- Exfiltration: Unerlaubte Datei- und Netzpfade werden früh blockiert oder geloggt.
- Supply-Chain-Risiken: Fremde oder aktualisierte Binaries bleiben im Sandkasten der definierten Rechte.
Ich definiere diese Risiken vorab, denn sie bestimmen die Schärfe der Profile, die Tiefe der Protokollierung und meine Akzeptanz von anfänglichen Fehlalarmen.
Policy-Artefakte, Booleans und Profile
Ich nutze bei SELinux das etablierte Type-Enforcement mit Modulen, die ich paketiert und versioniert ausrolle. Booleans erlauben mir, Features sicher ein- oder auszuschalten (z. B. ob ein HTTP-Server Netzwerkverbindungen initiieren darf), ohne das Modul zu forken. Die Wahl zwischen targeted und MLS/MCS-Policies richtet sich nach Compliance- und Mandantenanforderungen. Bei AppArmor arbeite ich mit klaren, prozessbezogenen Profilen, die Dateipfade, Capabilities, Netz- und DBus-Zugriffe fein steuern. Für dynamische Pfade nutze ich Wildcards oder abstrahierte Verzeichnisse und halte Profile modular, damit Updates wartbar bleiben.
Funktionen: MLS/MCS und Container
Ich schaue bei modernen Workloads auf Mandantentrennung und Container-Isolation. SELinux bringt MLS und MCS mit, also Abstufungen und Kategorien, die Informationsflüsse strikt ordnen und Container automatisch mit eindeutigen Labels trennen. Dadurch begrenze ich die Reichweite kompromittierter Container und halte Daten sauber voneinander getrennt. AppArmor sichert vor allem den Host gegen Container ab, die saubere Trennung zwischen Containern untereinander erfordert zusätzliche Vorkehrungen. Für strenge Compliance-Anforderungen setze ich daher auf SELinux und nutze MCS, um die Mandanten zuverlässig zu isolieren.
Distributionen und typische Einsätze
Ich entscheide oft entlang der Distribution, weil Ökosystem und Tools dort am besten zusammenspielen. In RHEL-, CentOS- und Fedora-Umgebungen läuft SELinux häufig ab Werk mit und bildet eine tragende Sicherheitslinie im Systemdesign. Ubuntu, Debian und SUSE liefern AppArmor-Profile für verbreitete Dienste, wodurch ich produktiv schnell Schutz aktivieren kann. Brauche ich mehr Kernsicherheit, verknüpfe ich die MAC-Auswahl mit Kernel-Hardening, um Angriffsflächen weiter zu verkleinern. So schaffe ich eine stimmige Kombination aus Distribution, MAC-Mechanismus und Härtung ohne Brüche im Alltag.
Container- und Orchestrator-Integration
Ich binde MAC konsequent in Laufzeitumgebungen ein, damit Sicherheitsgarantien auch unter Orchestrierung gelten. Container-Runtimes respektieren AppArmor-Profile und SELinux-Labels; über security-opts setze ich Profile/Labels gezielt pro Container. In Kubernetes verwalte ich Profile und Kontexte als Teil der Manifeste bzw. über passende Annotations/Settings, damit Deployments reproduzierbar und überprüfbar bleiben. Wichtig: Volumes und HostMounts müssen korrekt gelabelt bzw. in Profile aufgenommen sein, sonst scheitern Container beim Start. Meine Regel lautet: Deployment und Policy gehören zusammen versioniert, getestet und ausgerollt, damit Skalierung und Rollbacks sicher bleiben.
Richtlinienverwaltung im Alltag
Ich arbeite schrittweise, weil schrittweise Änderungen kontrollierbar bleiben. Bei SELinux nutze ich den permissiven Modus und setze Tools wie audit2allow ein, um aus Logs gezielt legitime Freigaben abzuleiten. Danach überführe ich freigegebene Regeln in Versionierung und rolle sie reproduzierbar aus. Bei AppArmor starte ich häufig im complain-Modus, bis ein Profil die echte Nutzung abdeckt, und schalte dann auf enforce. Dieses Vorgehen schont die Verfügbarkeit von Diensten und verhindert Überraschungen während Wartungsfenstern.
Häufige Stolpersteine und Anti-Patterns
- Blindes Deaktivieren: Ich löse keine Policy-Probleme durch Abschalten von MAC; ich finde die Ursache im Log und passe gezielt an.
- Falsche Dateikontexte: Bei SELinux bleiben Labels beim Verschieben erhalten, aber nicht bei falschen Restore-Prozessen. Ich nutze saubere Deployments und relabel-Routinen.
- Zu breite Wildcards: In AppArmor verwischen großzügige Platzhalter den Schutz. Ich beginne eng und erweitere nur, was die Telemetrie belegt.
- Drift: Manuelle Notfalländerungen ohne Rückführung in Git führen zu Inkonsistenzen. Ich halte Policies deklarativ und automatisiert.
- Mischen von LSMs: Ich kombiniere SELinux und AppArmor nicht auf demselben Host; in der Praxis nutze ich einen primären MAC-Mechanismus plus ergänzende LSMs wie Yama/Lockdown, sofern unterstützt.
- Temporäre Pfade: /tmp, Laufzeit-Sockets und dynamische Verzeichnisse plane ich früh ein, sonst scheitern Upgrades oder Blue-Green-Rollouts.
Leistung und Fehlertoleranz
Ich prüfe zuerst, ob MAC meinen Durchsatz bremst oder den Start kritischer Dienste verzögert. In der Praxis sehe ich bei korrekter Konfiguration kaum messbare Einbußen, weil Kernel-Prüfungen effizient arbeiten. Wichtiger ist, dass zu harte Regeln Start oder Funktion einzelner Services blockieren können, bis ich sie nachziehe. Deshalb gehört sauberes Logging, klares Change-Management und bedachter Rollout zwingend auf die Agenda. So halte ich den Schutz hoch und die Risiken operativ klein, ohne die Plattform zu verlangsamen.
Server-Härtung im Verbund
Ich kombiniere MAC mit Netzwerkfiltern, SSH-Härtung und Prozessgrenzen, damit Fehler nicht eskalieren. Namespaces und cgroups ordnen Workloads und begrenzen Ressourcen, während MAC verbietet, was nicht ausdrücklich erlaubt ist. Für klarere Mandantentrennung in Containern profitiere ich von MCS unter SELinux und ergänze Host-Regeln passend. Als Orientierung nutze ich Namespaces und cgroups, um die Schichten konsistent aufzubauen. Diese Schichtung hält Angreifer in engen Leitplanken, selbst wenn einzelne Schutzringe versagen.
Compliance und Auditierung
Ich verknüpfe MAC mit Audit-Strategien, um Anforderungen messbar zu erfüllen. SELinux und AppArmor liefern präzise Events, die ich zentral sammle und mit Change-Informationen korreliere. Für interne und externe Prüfungen dokumentiere ich:
- Policy-Abdeckung: Welche Services sind im Enforce-Mode, welche Ausnahmen bestehen?
- Change-Historie: Wer hat wann welche Regel geändert, mit welchem Review?
- Alarmwege: Welche MAC-Events sind scharf, wer reagiert, wie ist die Mean Time to Mitigate?
- Mandantentrennung: Welche MCS-Kategorien (SELinux) sind vergeben, wie werden sie verwaltet?
So belege ich technische Maßnahmen gegenüber Compliance-Rahmenwerken und halte Nachweise prüfbar vor.
Entscheidungshilfe: Welche Wahl passt?
Ich kläre zuerst Compliance-Ziele, Teamkenntnisse und Betriebsrisiken, bevor ich die Weiche stelle. Braucht die Umgebung MLS/MCS, feine Container-Isolation und konsistente Systempolitik, spricht viel für SELinux. Zähle ich auf zügige Einführung, transparente Profile und klare Zuordnung je Dienst, spielt AppArmor seine Stärken aus. Für hybride Landschaften übernehme ich das native System der Distribution und ergänze eigene Regeln behutsam. Bei Anwendungsisolation lohnt als Ergänzung ein Blick auf Prozess-Isolation, um Privilegien noch enger zu fassen.
Szenarien in der Praxis: schnelle Einordnung
- Single-Tenant-VMs: AppArmor reicht oft, schneller Rollout, klare Profile je Dienst.
- Multi-Tenant-Host mit Containern: SELinux mit MCS für harte Trennung zwischen Containern und Daten.
- Legacy-Monolith: AppArmor als Brücke, später Übergang zu SELinux, wenn Teamreife wächst.
- Hochregulierte Umgebung: SELinux mit strenger Policy, Booleans minimal, Audit auf „Block erst, dann erlauben“.
- Edge/Embedded: Schlanke AppArmor-Profile, minimaler Overhead, enge Pfadkontrolle der wenigen Dienste.
Mini-Fallbeispiel: Web-Stack sicher einführen
Ich rolle in einer Gastplattform NGINX, PHP-FPM und einen Scheduler aus. Zuerst aktiviere ich MAC im complain/permissive-Modus und lasse Traffic real laufen. Danach:
- Event-Sichtung: Ich filtere Audit-Logs auf diese Dienste, eliminiere offensichtliche Fehlzugriffe und deute verbleibende Events.
- Regelerstellung: Für SELinux generiere ich gezielte Allows und packe sie in ein Modul; für AppArmor verfeinere ich Profile um Cache-, Upload- und Temp-Pfade.
- Re-Validierung: Lasttests prüfen Start, Rolling Updates und Fehlerpfade (z. B. Log-Rotation, Zertifikatserneuerung).
- Enforce-Umstellung: Ich aktiviere Enforce stufenweise (Canary), überwache Metriken und Log-Anomalien.
- Betrieb: Policies landen in CI/CD, Änderungen laufen über Reviews und Preprod-Tests. Ich definiere einen Breakglass-Prozess für echte Notfälle mit strengem Nachgang.
Best Practices aus der Praxis
Ich starte MAC nie blind im Vollzug, sondern beobachte zuerst. Logs zeigen reale Nutzung, daraus konstruiere ich minimale Freigaben und dokumentiere Anpassungen lückenlos. Ich integriere Policies und Profile in CI/CD, um Änderungen prüfbar und wiederholbar auszuliefern. Monitoring korreliert MAC-Ereignisse mit anderen Signalen und macht Ausreißer sichtbar. Dieser Zyklus aus Beobachten, Anpassen und Prüfen hält die Qualität hoch und schließt Lücken schrittweise.
Zusammenfassung und Einordnung
Ich nutze SELinux, wenn ich fein abgestufte Trennung, MCS für Container und eine einheitliche Systempolitik benötige. Ich wähle AppArmor, wenn schnelle Einführung, gut verständliche Profile und klare Fehleranalyse im Vordergrund stehen. Beide Systeme stärken Linux-Server deutlich über klassische Dateirechte hinaus und begrenzen die Reichweite erfolgreicher Angriffe. Entscheidend bleibt die konsequente Pflege der Regeln, die Einbettung in Firewalls, Isolationsmechanismen und Logging. So erreiche ich mit überschaubarem Aufwand einen hohen Sicherheitsgewinn und halte den Betrieb gleichzeitig beherrschbar.


