AppArmor - eine Kernel-Erweiterung, um Programme auf eine begrenzte Anzahl von Ressourcen zu beschränken.
DESCRIPTION
AppArmor ist eine Kernel-Erweiterung, um Programme auf eine begrenzte Anzahl von Ressourcen zu beschränken. AppArmors
einzigartiges Sicherheitsmodell besteht darin, Zugriffskontrollattribute an Programme und nicht an Benutzer zu binden.
Die AppArmor-Einschränkung erfolgt über Profile, die über apparmor_parser(8) in den Kernel geladen werden,
typischerweise über die Systemd-Einheit apparmor.service, die wie folgt verwendet wird:
# systemctl start apparmor
# systemctl reload apparmor
AppArmor kann in zwei Modi betrieben werden: Erzwingungsmodus und Beschwerde- oder Lernmodus:
Erzwingungsmodus - Profile, die im Erzwingungsmodus geladen werden, führen zur Erzwingung der in dem Profil definierten Richtlinie sowie zur Meldung von Richtlinienverstoßversuchen an syslogd.
Beschwerdemodus - Profile, die im "Beschwerdemodus" geladen werden, setzen die Richtlinie nicht durch. Stattdessen werden Versuche, die Richtlinie zu verletzen, gemeldet. Dieser Modus ist praktisch für die Entwicklung von Profilen. Um den Beschwerdemodus für einzelne Profile zu verwalten, können die Dienstprogramme aa-complain(8) und aa-enforce(8) verwendet werden. Diese Dienstprogramme nehmen einen Programmnamen als Argument.
Profile werden traditionell in Dateien im Verzeichnis /etc/apparmor.d/ unter Dateinamen gespeichert, wobei die Schrägstriche in Pfadnamen durch Punkte ersetzt werden (mit Ausnahme des Stammverzeichnisses /), damit Profile einfacher verwaltet werden können (z. B. das Profil /usr/sbin/nscd würde usr.sbin.nscd genannt).
Profile werden einem Prozess zum Zeitpunkt von exec(3) (wie im Systemaufruf execve(2) sichtbar) angewendet:
Sobald ein Profil für ein Programm geladen ist, wird dieses Programm beim nächsten exec(3) eingeschränkt. Wenn ein Prozess bereits unter einem Profil ausgeführt wird und dieses Profil im Kernel ersetzt wird, wird das aktualisierte Profil sofort auf diesen Prozess angewendet. Andererseits kann ein bereits ungeschützter Prozess nicht eingeschränkt werden.
AppArmor unterstützt das Securityfs-Dateisystem des Linux-Kernels und stellt die Liste der aktuell geladenen Profile zur Verfügung. Um das Dateisystem einzuhängen:
# mount -tsecurityfs securityfs /sys/kernel/security
$ cat /sys/kernel/security/apparmor/profiles
/usr/bin/mutt
/usr/bin/gpg
...
Normalerweise wird das Init-Skript Securityfs einhängen, falls dies noch nicht geschehen ist.
AppArmor schränkt auch die privilegierten Operationen ein, die ein eingeschränkter Prozess ausführen darf, selbst wenn der Prozess als Root ausgeführt wird. Ein eingeschränkter Prozess kann die folgenden Systemaufrufe nicht aufrufen:
create_module(2) delete_module(2) init_module(2) ioperm(2)
iopl(2) ptrace(2) reboot(2) setdomainname(2) sethostname(2) swapoff(2) swapon(2) sysctl(2)
Beschweremodus
Anstatt den Zugriff auf Ressourcen zu verweigern, für die das Profil keine Regel hat, kann AppArmor den Zugriff "erlauben" und eine Nachricht für die auslösende Operation protokollieren. Dies wird als Beschweremodus bezeichnet. Es ist wichtig zu beachten, dass Regeln, die im Profil vorhanden sind, weiterhin angewendet werden, sodass Erlauberregeln weiterhin Audit-Nachrichten unterdrücken oder erzwingen, und Ablehnungsregeln weiterhin zu Ablehnungen und Unterdrückung von Ablehnungsnachrichten führen (siehe Deaktivieren der Unterdrückung von Ablehnungs-Audit-Nachrichten, falls dies ein Problem darstellt).
Der Beschweremodus kann verwendet werden, um Profile inkrementell zu entwickeln, während eine Anwendung ausgeführt wird. Die protokollierten Zugriffe können dem Profil hinzugefügt werden, und dann kann die Anwendung weiter ausgeführt werden, um weitere benötigte Ergänzungen zu ermitteln. Da AppArmor die Zugriffe zulässt, verhält sich die Anwendung so, als ob AppArmor sie nicht einschränken würde.
Warnung: Der Beschweremodus bietet keine Sicherheit, nur Auditing, während er aktiviert ist. Er sollte nicht in einer feindseligen Umgebung verwendet werden, da ansonsten schädliches Verhalten protokolliert und dem Profil hinzugefügt werden könnte, als ob es sich um Ressourcen-Zugriffe handeln würde, die von der Anwendung verwendet werden sollten.
Hinweis: Der Beschweremodus kann bei neuen oder leeren Profilen sehr viele Log-Nachrichten generieren, aber bei entwickelten Profilen möglicherweise gar keine, wenn das Profil das Anwendungsverhalten gut abdeckt. Siehe Audit-Rate-Begrenzung, wenn der Beschweremodus zu viele Log-Nachrichten generiert.
Um ein Profil und alle untergeordneten oder "Hut"-Profile, die das Profil enthalten kann, in den Beschweremodus zu versetzen, verwenden Sie:
aa-complain /etc/apparmor.d/<die-Anwendung>
Um ein bestimmtes Profil manuell in den Beschweremodus zu versetzen, fügen Sie das Flag "complain" hinzu und laden Sie das Profil dann manuell neu:
profile foo flags=(complain) { ... }
Beachten Sie, dass das Flag "complain" auch manuell zu allen "Hut"- oder untergeordneten Profilen des Profils hinzugefügt werden muss, andernfalls wird weiterhin der vorherige Modus verwendet.
Um den Beschweremodus global zu aktivieren, führen Sie aus:
echo -n complain > /sys/module/apparmor/parameters/mode
oder um ihn beim Booten einzustellen, fügen Sie hinzu:
apparmor.mode=complain
als Kernel-Bootparameter.
Warnung: Das globale Aktivieren des Beschweremodus deaktiviert alle AppArmor-Sicherheitsfunktionen. Dies kann beim Debuggen oder bei der Profilentwicklung nützlich sein, aber das selektive Aktivieren für einzelne Profile ist sicherer.
FEHLER
Wenn ein eingeschränkter Prozess versucht, auf eine Datei zuzugreifen, für die er keine Berechtigung hat, meldet der Kernel eine Nachricht über das Audit, ähnlich wie:
audit(1386511672.612:238): apparmor="VERWEIGERT" operation="exec"
parent=7589 profile="/tmp/sh" name="/bin/uname" pid=7605
comm="sh" requested_mask="x" denied_mask="x" fsuid=0 ouid=0
audit(1386511672.613:239): apparmor="VERWEIGERT" operation="open"
parent=7589 profile="/tmp/sh" name="/bin/uname" pid=7605
comm="sh" requested_mask="r" denied_mask="r" fsuid=0 ouid=0
audit(1386511772.804:246): apparmor="VERWEIGERT" operation="capable"
parent=7246 profile="/tmp/sh" pid=7589 comm="sh" pid=7589
comm="sh" capability=2 capname="dac_override"
Die vom Prozess angeforderten Berechtigungen werden in den Operation= und denied_mask= beschrieben (für Dateien verwenden Fähigkeiten usw. ein leicht abweichendes Protokollformat). Der "Name" und die Prozess-ID des ausgeführten Programms werden zusammen mit dem Profilnamen, einschließlich eines möglicherweise aktiven "Huts", durch "//" getrennt, gemeldet. ("Name" steht in Anführungszeichen, da der Prozessname auf 15 Byte begrenzt ist; er ist derselbe wie in den Berkeley-Prozess-Accounting-Daten gemeldet).
Für eingeschränkte Prozesse, die unter einem Profil ausgeführt werden, das im Beschwerdemodus geladen wurde, erfolgt keine Durchsetzung, und die an das Audit gemeldeten Protokollmeldungen haben die folgende Form:
audit(1386512577.017:275): apparmor="ERLAUBT" operation="open"
parent=8012 profile="/usr/bin/du" name="/etc/apparmor.d/tunables/"
pid=8049 comm="du" requested_mask="r" denied_mask="r" fsuid=1000 ouid=0
audit(1386512577.017:276): apparmor="ERLAUBT" operation="open"
parent=8012 profile="/usr/bin/du" name="/etc/apparmor.d/tunables/"
pid=8049 comm="du" requested_mask="r" denied_mask="r" fsuid=1000 ouid=0
Wenn der Benutzer-Auditd nicht ausgeführt wird, sendet der Kernel Audit-Ereignisse an klogd; klogd sendet die Nachrichten an syslog, das die Nachrichten mit der KERN-Einrichtung protokolliert. Daher können ABLEHNEN- und ZULASSEN-Nachrichten entweder an /var/log/audit/audit.log oder an /var/log/messages gesendet werden, je nach lokaler Konfiguration.
FEHLERBEHEBUNG
AppArmor bietet einige Funktionen, um mehr Informationen zu protokollieren, was bei der Fehlersuche in Profilen hilfreich sein kann.
Debug-Modus aktivieren
Wenn der Debug-Modus aktiviert ist, protokolliert AppArmor einige zusätzliche Nachrichten in dmesg (nicht über das Audit-Subsystem). Beispielsweise werden in den Protokollen angezeigt, ob eine Umgebungssäuberung angewendet wurde.
Um den Debug-Modus zu aktivieren, führen Sie Folgendes aus:
echo 1 > /sys/module/apparmor/parameters/debug
oder um ihn beim Start festzulegen, fügen Sie Folgendes hinzu:
apparmor.debug=1
als Kernel-Bootparameter.
Unterdrückung der Auditprotokollierung für Ablehnungen deaktivieren
Standardmäßig werden Operationen, die "Ablehnungs"-Regeln auslösen, nicht protokolliert. Dies wird als Unterdrückung der Auditprotokollierung für Ablehnungen bezeichnet.
Um die Unterdrückung der Auditprotokollierung für Ablehnungen zu deaktivieren, führen Sie Folgendes aus:
echo -n noquiet >/sys/module/apparmor/parameters/audit
oder um ihn beim Start festzulegen, fügen Sie Folgendes hinzu:
apparmor.audit=noquiet
als Kernel-Bootparameter.
Erzwingungsmodus aktivieren
AppArmor kann eine Nachricht für jede Operation protokollieren, die eine in der Richtlinie konfigurierte Regel auslöst. Dies wird als Erzwingungsmodus bezeichnet.
Achtung! Der Erzwingungsmodus kann selbst für ein einzelnes Profil extrem viel Protokollierung verursachen, ganz zu schweigen davon, wenn er global aktiviert wird.
Um ein bestimmtes Profil in den Erzwingungsmodus zu versetzen, fügen Sie das Flag "audit" hinzu:
profile foo flags=(audit) { ... }
Um den Erzwingungsmodus global zu aktivieren, führen Sie Folgendes aus:
echo -n all > /sys/module/apparmor/parameters/audit
oder um ihn beim Start festzulegen, fügen Sie Folgendes hinzu:
apparmor.audit=all
als Kernel-Bootparameter.
Audit-Ratenbegrenzung
Wenn auditd nicht ausgeführt wird, müssen Sie die Audit-Ratenbegrenzung deaktivieren, um zu vermeiden, dass zu viele der zusätzlichen Protokollmeldungen verloren gehen:
echo 0 > /proc/sys/kernel/printk_ratelimit
Aber selbst dann kann der Kernel-Ringpuffer überlaufen und Sie können Nachrichten verlieren.
Wenn auditd ausgeführt wird, siehe auditd(8) und auditd.conf(5).
DATEIEN
/etc/apparmor.d/
/var/cache/apparmor/
/var/log/audit/audit.log
/var/log/messages
SIEHE AUCH
apparmor_parser(8), aa_change_hat(2), apparmor.d(5), aa-autodep(1), clean(1), auditd(8), aa-unconfined(8), aa-enforce(1), aa-complain(1) und [https://wiki.apparmor.net].