AppArmor ist ein Linux Security Module (LSM) für Mandatory Access Control. Es beschränkt Programme auf definierte Ressourcen und erhöht so die Systemsicherheit erheblich.
Grundlagen
AppArmor vs. SELinux
| Feature | AppArmor | SELinux | |---------|----------|---------| | Komplexität | Einfacher | Komplexer | | Ansatz | Pfad-basiert | Label-basiert | | Distribution | Ubuntu, SUSE | RHEL, Fedora | | Lernkurve | Flacher | Steiler |
Konzepte
Profile: Regeln für ein Programm
Enforce: Regeln werden durchgesetzt
Complain: Nur Logging, keine Blockierung
Unconfined: Keine EinschränkungenInstallation und Status
Installation
# Debian/Ubuntu (meist vorinstalliert)
apt install apparmor apparmor-utils apparmor-profiles
# Kernel-Parameter prüfen
cat /sys/module/apparmor/parameters/enabled
# Y = aktiviertStatus prüfen
# AppArmor-Status
aa-status
# Oder ausführlich
apparmor_status
# Geladene Profile
aa-status --profiled
# Prozesse im Enforce-Modus
aa-status --enforcedBeispiel-Ausgabe
apparmor module is loaded.
47 profiles are loaded.
45 profiles are in enforce mode.
/usr/bin/evince
/usr/bin/firefox
...
2 profiles are in complain mode.
/usr/sbin/cups-browsed
9 processes have profiles defined.Profile verstehen
Profilstandorte
/etc/apparmor.d/ # Aktive Profile
/etc/apparmor.d/abstractions/ # Gemeinsame Regeln
/etc/apparmor.d/tunables/ # Variablen
/usr/share/apparmor/extra-profiles/ # Zusätzliche ProfileProfil-Aufbau
# /etc/apparmor.d/usr.bin.beispiel
#include <tunables/global>
/usr/bin/beispiel {
#include <abstractions/base>
# Lesezugriff
/etc/beispiel.conf r,
/var/lib/beispiel/** r,
# Schreibzugriff
/var/log/beispiel.log w,
# Ausführen
/usr/bin/helper ix,
# Netzwerk
network inet stream,
# Capabilities
capability net_bind_service,
}Zugriffsrechte
| Recht | Bedeutung | |-------|-----------| | r | Lesen | | w | Schreiben | | a | Anhängen | | l | Link erstellen | | k | Lock-Datei | | m | Memory-Map ausführbar | | x | Ausführen | | ix | Inherit execute | | px | Profiled execute | | Px | Profiled execute (clean environment) | | ux | Unconfined execute | | Ux | Unconfined execute (clean environment) |
Profile verwalten
Modi wechseln
# In Enforce-Modus setzen
aa-enforce /etc/apparmor.d/usr.bin.firefox
# In Complain-Modus setzen
aa-complain /etc/apparmor.d/usr.bin.firefox
# Profil deaktivieren
aa-disable /etc/apparmor.d/usr.bin.firefox
# Profil neu laden
apparmor_parser -r /etc/apparmor.d/usr.bin.firefoxAlle Profile verwalten
# Alle in Complain-Modus
aa-complain /etc/apparmor.d/*
# Alle in Enforce-Modus
aa-enforce /etc/apparmor.d/*
# Profile neu laden
systemctl reload apparmorProfile erstellen
Automatisch mit aa-genprof
# Profil-Generierung starten
aa-genprof /usr/bin/meinprogramm
# In anderem Terminal: Programm normal nutzen
/usr/bin/meinprogramm
# Zurück zum ersten Terminal: 'S' für Scan drücken
# Regeln werden vorgeschlagen, mit 'A' akzeptieren
# 'F' zum BeendenManuell erstellen
# /etc/apparmor.d/usr.local.bin.meinscript
#include <tunables/global>
/usr/local/bin/meinscript {
#include <abstractions/base>
#include <abstractions/bash>
# Eigene Dateien
/usr/local/bin/meinscript r,
/etc/meinscript.conf r,
/var/log/meinscript.log w,
/var/run/meinscript.pid rw,
# Temporäre Dateien
/tmp/meinscript.* rw,
# Benötigte Programme
/bin/bash ix,
/usr/bin/grep ix,
/usr/bin/awk ix,
}Profil aktivieren
# Profil laden
apparmor_parser -r /etc/apparmor.d/usr.local.bin.meinscript
# Oder
aa-enforce /etc/apparmor.d/usr.local.bin.meinscriptAbstractions verwenden
Verfügbare Abstractions
ls /etc/apparmor.d/abstractions/
# base, bash, nameservice, ssl_certs, user-tmp, ...Häufig verwendete
# Basis-Abstractions
#include <abstractions/base> # Grundlegende Systemzugriffe
#include <abstractions/bash> # Bash-Shell
#include <abstractions/nameservice> # DNS, passwd, group
#include <abstractions/ssl_certs> # SSL-Zertifikate
#include <abstractions/python> # Python-Interpreter
#include <abstractions/php> # PHP-Interpreter
# Anwendungsspezifisch
#include <abstractions/apache2-common>
#include <abstractions/mysql>
#include <abstractions/openssl>Eigene Abstraction
# /etc/apparmor.d/abstractions/meine-app
/opt/meine-app/** r,
/var/lib/meine-app/** rw,
/etc/meine-app/** r,Debugging und Logs
Log-Analyse
# AppArmor-Logs
journalctl -k | grep apparmor
# Oder in audit.log
grep apparmor /var/log/audit/audit.log
# Denied-Einträge
grep "DENIED" /var/log/syslog | grep apparmorLog-Beispiel
audit: type=1400 audit(1234567890.123:456): apparmor="DENIED"
operation="open" profile="/usr/bin/firefox" name="/etc/passwd"
pid=1234 comm="firefox" requested_mask="r" denied_mask="r"Fehlende Regeln finden
# Denied-Zugriffe analysieren
aa-logprof
# Vorschläge für Regeln werden gemacht
# Mit 'A' akzeptieren, 'D' ablehnenPraktische Profile
Nginx-Profil
# /etc/apparmor.d/usr.sbin.nginx
#include <tunables/global>
/usr/sbin/nginx {
#include <abstractions/base>
#include <abstractions/nameservice>
#include <abstractions/openssl>
capability net_bind_service,
capability setuid,
capability setgid,
capability dac_override,
/usr/sbin/nginx mr,
# Konfiguration
/etc/nginx/** r,
/etc/ssl/** r,
/etc/letsencrypt/** r,
# Logs
/var/log/nginx/** w,
# Cache und Temp
/var/cache/nginx/** rw,
/var/lib/nginx/** rw,
/run/nginx.pid rw,
# Web-Inhalte
/var/www/** r,
/usr/share/nginx/** r,
# Netzwerk
network inet stream,
network inet6 stream,
}MySQL-Profil
# /etc/apparmor.d/usr.sbin.mysqld
#include <tunables/global>
/usr/sbin/mysqld {
#include <abstractions/base>
#include <abstractions/mysql>
#include <abstractions/nameservice>
capability dac_override,
capability setgid,
capability setuid,
capability sys_resource,
/usr/sbin/mysqld mr,
# Konfiguration
/etc/mysql/** r,
/etc/my.cnf r,
# Daten
/var/lib/mysql/ r,
/var/lib/mysql/** rwk,
# Logs
/var/log/mysql/** rw,
# Socket und PID
/run/mysqld/** rw,
/var/run/mysqld/** rw,
# Temp
/tmp/** rw,
network inet stream,
network inet6 stream,
}Docker-Container
# Docker-Profile befinden sich in
# /etc/apparmor.d/docker
# /etc/apparmor.d/docker-default
# Container mit spezifischem Profil starten
docker run --security-opt apparmor=docker-default nginxTunables
Globale Variablen
# /etc/apparmor.d/tunables/global
#include <tunables/home>
#include <tunables/multiarch>
@{PROC}=/proc/
@{SYS}=/sys/Home-Verzeichnis
# /etc/apparmor.d/tunables/home
@{HOME}=/home/*/ /root/
@{HOMEDIRS}=/home/ /root/Eigene Variablen
# /etc/apparmor.d/tunables/meine-vars
@{APP_DIR}=/opt/meine-app
@{DATA_DIR}=/var/lib/meine-app
@{LOG_DIR}=/var/log/meine-app# Im Profil verwenden
/etc/apparmor.d/opt.meine-app.bin.app
#include <tunables/global>
#include <tunables/meine-vars>
@{APP_DIR}/bin/app {
@{DATA_DIR}/** rw,
@{LOG_DIR}/** w,
}Netzwerk-Regeln
Netzwerkzugriff
# TCP-Verbindungen
network inet stream, # IPv4 TCP
network inet6 stream, # IPv6 TCP
# UDP
network inet dgram, # IPv4 UDP
network inet6 dgram, # IPv6 UDP
# Raw Sockets
network inet raw,
# Unix Sockets
network unix stream,
network unix dgram,Beispiel
/usr/bin/webapp {
# Nur HTTP/HTTPS ausgehend
network inet stream,
network inet6 stream,
# Kein UDP, kein Raw
# deny network inet dgram,
}Capabilities
Häufige Capabilities
capability chown, # Dateieigentümer ändern
capability dac_override, # Dateiberechtigungen ignorieren
capability kill, # Signale senden
capability net_bind_service,# Ports < 1024 binden
capability setgid, # GID ändern
capability setuid, # UID ändern
capability sys_admin, # Systemadministration
capability sys_ptrace, # Prozesse tracenCapability-Profil
/usr/sbin/daemon {
# Nur benötigte Capabilities
capability net_bind_service,
capability setuid,
capability setgid,
# Explizit verbieten
deny capability sys_admin,
deny capability sys_ptrace,
}Troubleshooting
Profil debuggen
# Complain-Modus für Debugging
aa-complain /etc/apparmor.d/usr.bin.meinprogramm
# Programm ausführen und Logs prüfen
journalctl -f | grep apparmor
# Regeln hinzufügen
aa-logprof
# Zurück zu Enforce
aa-enforce /etc/apparmor.d/usr.bin.meinprogrammHäufige Probleme
# Programm startet nicht
# -> Profil in Complain-Modus setzen, Logs prüfen
# "Permission denied" trotz korrekter Unix-Rechte
# -> AppArmor blockiert, Profil anpassen
# Profil wird nicht geladen
apparmor_parser -r /etc/apparmor.d/profil 2>&1
# Syntaxfehler werden angezeigtAppArmor temporär deaktivieren
# Einzelnes Profil
aa-disable /etc/apparmor.d/profil
# Komplett (nicht empfohlen)
systemctl stop apparmor
systemctl disable apparmorZusammenfassung
| Befehl | Funktion | |--------|----------| | aa-status | Status anzeigen | | aa-enforce | Enforce-Modus | | aa-complain | Complain-Modus | | aa-disable | Profil deaktivieren | | aa-genprof | Profil generieren | | aa-logprof | Logs analysieren | | apparmor_parser -r | Profil neu laden |
| Modus | Beschreibung | |-------|--------------| | enforce | Regeln durchsetzen | | complain | Nur loggen | | unconfined | Keine Einschränkungen |
| Zugriffsrecht | Bedeutung | |---------------|-----------| | r | Lesen | | w | Schreiben | | x | Ausführen | | m | Memory-Map exec | | k | Lock | | l | Link |
Fazit
AppArmor bietet effektiven Schutz durch Mandatory Access Control mit vergleichsweise geringer Komplexität. Die pfadbasierte Konfiguration ist intuitiv und die mitgelieferten Profile decken viele Standardanwendungen ab. Für eigene Anwendungen ist der Complain-Modus ideal zum Entwickeln von Profilen. Die Kombination aus Abstractions und Tunables ermöglicht wartbare und wiederverwendbare Profile.