40.2AppArmor

Anstatt das komplexe SELinux-System für die eigenen Distributionen zu adaptieren, kaufte Novell 2005 die Firma Immunix, gab dessen Sicherheitslösung Subdomain den neuen Namen AppArmor, stellte sie unter die GPL und entwickelte einige YaST-Module zur Administration. Einige Jahre später erhielt AppArmor gewissermaßen den Ritterschlag der Kernelentwickler und wurde offiziell in den Kernel integriert. Danach ist bei SUSE rund um AppArmor aber Stille eingekehrt. AppArmor ist zwar weiter im Einsatz, in den letzten Jahren sind aber weder an den Regeln noch an den Administrationswerkzeugen merkbare Verbesserungen durchgeführt worden. Um die AppArmor-Weiterentwicklung kümmern sich seither vor allem von Canonical angestellte Entwickler.

AppArmor ist wie SELinux ein MAC-Sicherheitssystem (Mandatory Access Control). Im Unterschied zu SELinux basieren AppArmor-Regeln auf absoluten Dateinamen. Daher ist eine eigene Kennzeichnung aller Dateien durch EAs nicht erforderlich; zudem funktioniert AppArmor auch für Dateisysteme, die keine EAs unterstützen. In den AppArmor-Regeln sind Jokerzeichen erlaubt. Aus diesem Grund kommt AppArmor für typische Anwendungsfälle mit wesentlich weniger Regeln aus als SELinux.

Naturgemäß gibt es auch Argumente, die gegen AppArmor sprechen:

Dieser Abschnitt gibt nur eine Einführung zu AppArmor. Weitere Informationen finden Sie hier:

https://www.suse.com/de-de/documentation/sles11
https://wiki.ubuntu.com/AppArmor
https://wiki.ubuntu.com/SecurityTeam/KnowledgeBase/AppArmorProfiles

AppArmor unter Ubuntu

Die folgenden Ausführungen beziehen sich auf AppArmor, wie es unter Ubuntu aktiv ist. SUSE-spezifische Anmerkungen folgen am Ende dieses Abschnitts.

AppArmor ist unter Ubuntu standardmäßig im Kernel integriert. Das Sicherheitssystem wird durch das Init-V-Script /etc/init.d/apparmor gestartet. Es berücksichtigt die Grundkonfiguration aus dem Verzeichnis /etc/apparmor und lädt alle Regeldateien aus dem Verzeichnis /etc/apparmor.d. Das Init-Script greift auf Funktionen zurück, die in /etc/apparmor/rc.apparmor.functions definiert sind.

Das Kommando aa-status gibt einen Überblick über den gegenwärtigen Zustand von AppArmor. Das Kommando liefert sowohl eine Liste aller Profile als auch eine Liste der tatsächlich überwachten Prozesse. Die folgende Liste zeigt an, welche Dienste eines Ubuntu-Root-Servers überwacht werden:

root# aa-status apparmor module is loaded. 24 profiles are loaded. 24 profiles are in enforce mode. /sbin/dhclient /usr/bin/evince ... /usr/sbin/mysqld /usr/sbin/tcpdump 0 profiles are in complain mode. 8 processes have profiles defined. 8 processes are in enforce mode. /sbin/dhclient (5816) /usr/lib/telepathy/mission-control-5 (2640) /usr/sbin/cups-browsed (770)

Beim Start von AppArmor wird das Dateisystem securityfs in das Verzeichnis /sys/kernel/security eingebunden. Seine Dateien geben Auskunft über aktive Profile, die Anzahl der aufgetretenen Regelverletzungen etc.

Die Wirkung von AppArmor steht und fällt mit den Überwachungsregeln. Diese Regeln werden auch »Profile« genannt und befinden sich in den Dateien des Verzeichnisses /etc/apparmor.d/. Beispielsweise enthält die Datei usr.sbin.cupsd die Profile für CUPS und den CUPS-PDF-Treiber.

Die offiziell gewarteten Regelprofile werden üblicherweise vom jeweiligen Paket zur Verfügung gestellt. Das Regelprofil user.sbin.cupsd steht also nur dann zur Verfügung, wenn Sie das Druckersystem CUPS installiert haben. Aus diesem Grund ist /etc/apparmor.d nach einer Ubuntu-Server-Installation anfänglich fast leer und füllt sich erst in dem Ausmaß, in dem Sie Server-Dienste installieren.

Außerdem können Sie das Paket apparmor-profiles aus der universe-Paketquelle installieren. Es enthält zahlreiche weitere Profile, die aber nicht offiziell unterstützt und gewartet werden. Die meisten Profile laufen nur im sogenannten complain-Modus: In diesem Modus werden Regelverstöße zwar protokolliert, aber nicht geahndet. Mit den Kommandos aa-enforce und aa-complain aus dem Paket apparmor-utils können Sie den Modus eines Profils ändern. An die beiden Kommandos übergeben Sie den vollständigen Pfad des zu überwachenden Programms:

root# aa-enforce /usr/sbin/dnsmasq Setting /usr/sbin/dnsmasq to enforce mode. root# aa-complain /usr/sbin/dnsmasq Setting /usr/sbin/dnsmasq to complain mode.

Alternativ können Sie an aa-enforce und aa-complain auch die Dateinamen der Profildateien übergeben. Das macht es einfach, den Modus mehrerer Profile auf einmal zu verändern:

root# cd /etc/apparmor.d root# aa-enforce usr.lib.dovecot*

Bei Server-Diensten müssen Sie nach einer Aktivierung eines AppArmor-Profils auch das jeweilige Programm neu starten:

root# service <name> restart

Losgelöst vom AppArmor-Modus sind Profile natürlich nur dann relevant, wenn das betreffende Programm tatsächlich ausgeführt wird. Welche Programme momentan aktiv überwacht werden, verrät das oben erwähnte Kommando aa-status.

Regeldateien, die bei AppArmor Profile heißen, liegen in einem einfachen Textformat vor. Die folgenden Zeilen zeigen die AppArmor-Regeln für mysqld:

#include <tunables/global> /usr/sbin/mysqld { #include <abstractions/base> #include <abstractions/nameservice> #include <abstractions/user-tmp> #include <abstractions/mysql> #include <abstractions/winbind> capability dac_override, capability sys_resource, capability setgid, capability setuid, network tcp, /etc/hosts.allow r, /etc/hosts.deny r, /etc/hosts.allow r, /etc/hosts.deny r, /etc/mysql/** r, /usr/lib/mysql/plugin/ r, /usr/lib/mysql/plugin/*.so* mr, /usr/sbin/mysqld mr, /usr/share/mysql/** r, /var/log/mysql.log rw, /var/log/mysql.err rw, /var/lib/mysql/ r, /var/lib/mysql/** rwk, /var/log/mysql/ r, /var/log/mysql/* rw, /var/run/mysqld/mysqld.pid rw, /var/run/mysqld/mysqld.sock w, /run/mysqld/mysqld.pid rw, /run/mysqld/mysqld.sock w, /sys/devices/system/cpu/ r, # Site-specific additions and overrides. See local/README for details. #include <local/usr.sbin.mysqld> }

In den Regeldateien werden zuerst einige Include-Dateien gelesen und dann grundlegende Merkmale (siehe man capabilities) des Programms festgelegt. Die weiteren Regeln geben an, welche Dateien das Programm wie nutzen darf.

In den AppArmor-Regeldateien gilt das Jokerzeichen * als Platzhalter für eine beliebige Anzahl von Zeichen. ** hat eine ähnliche Bedeutung, schließt aber das Zeichen / ein und umfasst damit auch Dateien in allen Unterverzeichnissen. Die Zugriffsrechte werden durch Buchstaben oder Buchstabenkombinationen ausgedrückt, deren Bedeutung im AppArmor-Administration-Manual genau beschrieben ist. Tabelle 40.1 beschreibt die wichtigsten Buchstaben. Die ?x-Kombinationen steuern die Rechte von Sub-Prozessen, die das Hauptprogramm startet.

Kürzel

Bedeutung

r

erlaubt Lesezugriffe (read).

w

erlaubt Schreibzugriffe (write).

a

erlaubt es, die Datei zu erweitern (append).

l

wendet auf harte Links dieselben Regeln wie für die Ursprungsdatei an (link).

k

erlaubt es, die Datei zu blockieren (lock).

m

lässt die mmap-Funktion zu (allow executable mapping).

ix

Das Programm erbt die Regeln des Basisprogramms (inherent execute).

px

Das Programm hat ein eigenes AppArmor-Profil (discrete profile execute).

ux

führt das Programm ohne AppArmor-Regeln aus (unconstrained execute).

Tabelle 40.1Elementare AppArmor-Zugriffsrechte

AppArmor sieht einen Mechanismus vor, um einzelne Parameter der Regeln auf eine einfache Weise zu verändern. Diese Parameter sind in den Dateien des Verzeichnisses /etc/apparmor.d/tunables definiert. In der aktuellen Implementierung gibt es allerdings nur wenige Parameter, mit denen Sie beispielsweise den Ort der Heimatverzeichnisse individuell einstellen können. Wenn Ihr Server außer /home auch andere Orte für Heimatverzeichnisse vorsieht, müssen Sie die Variable @{HOMEDIRS} verändern. Im folgenden Beispiel wurden dort die beiden zusätzlichen Verzeichnisse /home1 und /myhome hinzugefügt.

# Datei /etc/apparmor.d/tunables/home @{HOME}=@{HOMEDIRS}/*/ /root/ @{HOMEDIRS}=/home/ /home1/ /myhome/

Details über Regelverletzungen, die im complain- oder enforce-Modus stattfanden, werden in Form von Kernelmeldungen weitergegeben und standardmäßig in den Dateien /var/log/kern.log und /var/log/syslog aufgezeichnet. Sie erkennen AppArmor-Meldungen am Schlüsselwort audit.

root# grep audit /var/log/kern.log [...] audit(1238580174.435:3): type=1503 operation="inode_permission" requested_mask="a::" denied_mask="a::" name="/dev/tty" pid=6345 profile="/usr/sbin/cupsd" namespace="default" [...] audit(1238580174.435:4): type=1503 operation="inode_permission" requested_mask="w::" denied_mask="w::" name="/etc/krb5.conf" pid=6345 profile="/usr/sbin/cupsd" namespace="default"

Oft sind die Audit-Meldungen ein Indikator dafür, dass die AppArmor-Regeln unvollständig sind. Ein Fehlverhalten des Programms ist natürlich auch möglich, aber eher unwahrscheinlich. Mit Sicherheit kann das nur ein Experte für das jeweilige Programm beurteilen. Insofern ist eine angemessene Reaktion auf Regelübertretungen schwierig.

Wenn Sie vermuten, dass das betroffene Programm ordnungsgemäß funktioniert, sollten Sie das Profil in den complain-Modus umschalten und die Audit-Meldung im Ubuntu-Bug-System melden (https://bugs.launchpad.net). Sie können auch versuchen, das Profil um eine Regel zu erweitern, die den gemeldeten Vorgang erlaubt. Oder Sie ignorieren die Meldung einfach, sofern das betroffene Programm anstandslos weiterläuft.

AppArmor unter SUSE

AppArmor ist in aktuellen openSUSE- und SUSE-Enterprise-Distributionen standardmäßig installiert und aktiv. YaST enthält sogar ein Modul zur AppArmor-Konfiguration (siehe Abbildung 40.2). Dessen Funktionalität reicht aber nicht weit über die der Kommandos aa-status, aa-enforce und aa-complain hinaus. Einige Dialogpunkte führen überhaupt zum Absturz des Moduls.

YaST-Modul zur AppArmor-Konfiguration

Abbildung 40.2YaST-Modul zur AppArmor-Konfiguration

AppArmor wird am Beginn des Init-Prozesses durch das Script /etc/init.d/boot.apparmor gestartet. Das Script ist also ein Relikt aus der Init-V-Vergangenheit von SUSE und ein Indikator dafür, dass die Liebe der SUSE-Entwickler zu AppArmor weitgehend erloschen ist. Dieses Script greift wiederum auf Funktionen zurück, die in /lib/apparmor/rc.apparmor.functions definiert sind. boot.apparmor liest die Grundkonfiguration aus dem Verzeichnis /etc/apparmor und lädt alle Regeldateien aus dem Verzeichnis /etc/apparmor.d.

Änderungen an der Konfiguration werden erst wirksam, wenn Sie AppArmor neu starten bzw. die Regeldateien neu einlesen:

root# /etc/init.d/boot.apparmor restart (AppArmor neu starten) root# /etc/init.d/boot.apparmor reload (AppArmor-Regeln neu laden)