AppArmor Profiles: Syntax & Capabilities (Artikel 146)
Tiefgehende Analyse der AppArmor Profil-Syntax. Erfahren Sie den Umgang mit Abstraktionen, die Beschränkung von Kernel-Capabilities und das Schreiben eigener Sicherheitsregeln.
# AppArmor Profiles Masterclass: Den Prozess einsperren
TL;DR / Management Summary Ein AppArmor-Profil ist eine Textdatei, die genau festlegt, welche Ressourcen ein Programm nutzen darf. Im Gegensatz zu komplexen Binär-Policys ist die Syntax für Menschen lesbar. Ein Senior Admin nutzt Abstractions, um Standard-Aufgaben (wie DNS-Auflösung) zu erlauben, und schränkt Kernel-Capabilities (z.B. das Ändern von Dateiberechtigungen) gezielt ein. Ziel ist ein “Least Privilege” Modell für jeden kritischen Dienst.
# 1. Einführung & Architektur
Woher kommt die Erlaubnis?
Profile liegen unter /etc/apparmor.d/. Sie sind nach dem Pfad des Programms benannt (z.B. usr.sbin.httpd).
# Die Profil-Anatomie (Mermaid)
graph TD
A[Profile: /usr/sbin/myapp] --> B[Abstractions: Shared Rules]
A --> C[File Rules: /var/log/myapp/* rw]
A --> D[Network Rules: tcp port 80]
A --> E[Capabilities: chown, setuid]
B --> B1[base]
B --> B2[nameservice]
B --> B3[python]
# 2. Die Syntax verstehen
Pfad-Matching und Berechtigungen.
# Pfade und Wildcards
/path/to/file: Exakte Datei./path/to/*: Alle Dateien im Verzeichnis (keine Unterordner)./path/to/**: Rekursiv alle Dateien und Unterordner.
# Berechtigungs-Kürzel
r: Read (Lesen)w: Write (Schreiben)ux: Execute (Ausführen, Umgebung wird nicht vererbt)Px: Execute (Ausführen unter einem eigenen AppArmor-Profil)
# 3. Abstractions: Der SUSE Standard
Regeln nicht neu erfinden.
Nutzen Sie #include <abstractions/...>, um Standard-Rechtepakete zu laden.
<abstractions/base>: Grundlegende Libraries.<abstractions/nameservice>: Erlaubt DNS-Auflösung via/etc/resolv.conf.<abstractions/openssl>: Zugriff auf CA-Zertifikate.
# Beispiel: Ein minimales Profil für ein Python-Skript
#include
/usr/local/bin/myscript.py {
#include
#include
/usr/bin/python3.10 ix,
/data/input/ r,
/var/log/myscript.log w,
# Verhindere Netzwerkzugriff komplett
deny network,
}
# 4. Day-2 Operations: Capabilities einschränken
Das wahre Härten.
Selbst wenn ein Prozess als Root läuft, kann AppArmor ihm die “Superkräfte” nehmen.
# Erlaube dem Prozess NICHT, Dateibesitzer zu ändern
deny capability chown,
# Erlaube dem Prozess NICHT, das System herunterzufahren
deny capability sys_reboot,
# 5. Troubleshooting & “War Stories”
Bugs in der Logik finden.
# Story 1: “Der hängende PDF-Export”
Symptom: Ein Webserver kann plötzlich keine Rechnungen (PDFs) mehr generieren. Die Logs zeigen einen Fehler beim Aufruf von /usr/bin/gs (Ghostscript).
Ursache: Das AppArmor-Profil des Webservers erlaubt zwar den Start von Ghostscript, aber Ghostscript braucht Schreibzugriff auf /tmp, der im Profil fehlte.
Lösung: Nutzen Sie aa-logprof. Es scannt die Audit-Logs und fragt interaktiv: “Soll /usr/bin/gs Zugriff auf /tmp bekommen?”. Mit (A)llow wird die Regel automatisch zum Profil hinzugefügt.
# Story 2: “Include-Reihenfolge”
Symptom: Eine deny Regel wird scheinbar ignoriert.
Ursache: AppArmor verarbeitet Regeln nicht zwingend von oben nach unten. deny Regeln haben immer Vorrang vor allow Regeln innerhalb des gleichen Profils, aber includes können dies unübersichtlich machen.
Lösung: Platzieren Sie Ihre deny Regeln am Ende des Profils, um die Lesbarkeit für Kollegen zu erhöhen.
# 6. Fazit & Empfehlung
- Modularität: Nutzen Sie Abstractions so oft wie möglich. Es macht Ihre Profile wartbar.
- Präzision: Seien Sie so spezifisch wie möglich.
/etc/** rist bequem, aber gefährlich. Nutzen Sie lieber/etc/myapp/* r. - Wartung: Führen Sie nach jedem Major-App-Update
aa-logprofaus, um zu sehen, ob neue Pfade benötigt werden.
# Anhang: Cheatsheet
| Aufgabe | Befehl |
|---|---|
| Profil parsen (Syntax-Check) | apparmor_parser -p /etc/apparmor.d/profile |
| Profil laden | apparmor_parser -r /etc/apparmor.d/profile |
| Interaktives Update | aa-logprof |
| Profil erstellen (Template) | aa-autodep <binary> |
| Abstractions Ordner | /etc/apparmor.d/abstractions/ |
| Audit Logs filtern | grep -i apparmor /var/log/audit/audit.log |