|
|
Zeile 114: |
Zeile 114: |
|
| |
|
| Enthält '''/etc/apparmor.d/disable''' eine Verknüpfung zu einem Profil, so wird dieses nicht automatisch geladen. Ähnlich sorgen Verknüpfungen unter '''/etc/apparmor.d/force-complain''' dafür, dass Profile nur im <tt>complain</tt>-Modus geladen werden ([https://wiki.ubuntuusers.de/AppArmor/#AppArmor-Modi-flags siehe unten]). | | Enthält '''/etc/apparmor.d/disable''' eine Verknüpfung zu einem Profil, so wird dieses nicht automatisch geladen. Ähnlich sorgen Verknüpfungen unter '''/etc/apparmor.d/force-complain''' dafür, dass Profile nur im <tt>complain</tt>-Modus geladen werden ([https://wiki.ubuntuusers.de/AppArmor/#AppArmor-Modi-flags siehe unten]). |
|
| |
| == Benutzung ==
| |
|
| |
| ; Hinweis
| |
| : Alle Befehle zur Steuerung von AppArmor müssen mit Root-Rechten[https://wiki.ubuntuusers.de/AppArmor/#source-3 [3]] aufgerufen werden!
| |
|
| |
| === AppArmor Utilities ===
| |
|
| |
| Nach der Installation von '''apparmor-utils''' stehen folgende Kommandozeilen-Werkzeuge zur Verfügung:
| |
|
| |
|
| |
| {| style="border-spacing:0;width:17cm;"
| |
| |- style="border:none;padding:0.049cm;"
| |
| || Utility
| |
| || Beschreibung
| |
| |- style="border:none;padding:0.049cm;"
| |
| || <tt>aa-enabled</tt>
| |
| || simple Abfrage, ob AppArmor aktiviert ist
| |
| |- style="border:none;padding:0.049cm;"
| |
| || <tt>aa-status</tt>
| |
| || Überblick über die geladenen AppArmor-Profile mit Angabe des Modus
| |
| |- style="border:none;padding:0.049cm;"
| |
| || <tt>aa-disable</tt>
| |
| || Ein AppArmor Profile deaktivieren.
| |
| |- style="border:none;padding:0.049cm;"
| |
| || <tt>aa-teardown</tt>
| |
| || Alle AppArmor Profile entladen, d.h. aus dem Speichern entfernen, so dass keine Profile in der laufenden Sitzung mehr aktiv sind.
| |
| |- style="border:none;padding:0.049cm;"
| |
| || <tt>aa-exec</tt>
| |
| || Eine Anwendung mit einem speziellen, anzugebenden AppArmor Profil starten.
| |
| |- style="border:none;padding:0.049cm;"
| |
| || <tt>aa-unconfined</tt>
| |
| || Ausgabe der Prozesse mit Netzwerkzugriff ohne Profil
| |
| |- style="border:none;padding:0.049cm;"
| |
| || <tt>aa-audit</tt>
| |
| || Profil in den Audit-Modus versetzen
| |
| |- style="border:none;padding:0.049cm;"
| |
| || <tt>aa-complain</tt>
| |
| || Profil in den Complain-Modus versetzen
| |
| |- style="border:none;padding:0.049cm;"
| |
| || <tt>aa-enforce</tt>
| |
| || Profil in den Enforce-Modus versetzen
| |
| |- style="border:none;padding:0.049cm;"
| |
| || <tt>aa-autodep</tt>
| |
| || Erstellung eines Basis-Profils im Complain-Modus
| |
| |- style="border:none;padding:0.049cm;"
| |
| || <tt>aa-genprof</tt>
| |
| || Erstellung eines Basis-Profils mit interaktiver Ergänzung von Regeln und abschließender Versetzung des Profils in den Enforce-Modus
| |
| |- style="border:none;padding:0.049cm;"
| |
| || <tt>aa-logprof</tt>
| |
| || interaktive Ergänzung von Regeln anhand der Einträge in '''/var/log/syslog'''
| |
| |- style="border:none;padding:0.049cm;"
| |
| || <tt>aa-cleanprof</tt>
| |
| || automatisches Aufräumen eines Profils
| |
| |- style="border:none;padding:0.049cm;"
| |
| || <tt>aa-easyprof</tt>
| |
| || Einfaches Erstellen eines Profils. Mit <tt>aa-easyprof</tt> estellte Profile sind gegebenenfalls weniger restriktiv als mit <tt>aa-genprof</tt> oder <tt>aa-logprof</tt> erstellte Profile.
| |
| |- style="border:none;padding:0.049cm;"
| |
| || <tt>aa-mergeprof</tt>
| |
| || AppArmor Profile zusammenführen.
| |
| |- style="border:none;padding:0.049cm;"
| |
| || <tt>aa-decode</tt>
| |
| || Decodiert einen String in Hexadezimaldarstellung aus dem AppArmor Log in einen ASCII-String.
| |
| |- style="border:none;padding:0.049cm;"
| |
| || <tt>aa-features-abi</tt>
| |
| || Extrahieren, Validieren und Ändern der AppArmor Feature ABI
| |
| |- style="border:none;padding:0.049cm;"
| |
| || <tt>aa-remove-unknown</tt>
| |
| || Unbekannte AppArmor Profile entfernen
| |
| |- style="border:none;padding:0.049cm;"
| |
| || <tt>aa-update-browser</tt>
| |
| || Apparmor Profile für Browser aktualisieren.
| |
| |-
| |
| |}
| |
| Im Idealfall nutzt man AppArmor ohne es zu bemerken, da Regeln die entsprechenden Anwendungen schützen, aber nicht beeinträchtigen. Um zu überprüfen, ob AppArmor installiert und aktiviert ist, dient folgender Befehl im Terminal[https://wiki.ubuntuusers.de/AppArmor/#source-2 [2]]:
| |
|
| |
| aa-enabled
| |
|
| |
| Einen weiterführenden Überblick über den aktuellen Status von AppArmor erhält man mit folgendem Befehl:
| |
|
| |
| sudo aa-status
| |
|
| |
| === AppArmor Modi (flags) ===
| |
|
| |
| AppArmor kennt drei Modi für jedes einzelne Profil:
| |
|
| |
|
| |
| {| style="border-spacing:0;width:17cm;"
| |
| |- style="border:none;padding:0.049cm;"
| |
| || Modus
| |
| || Beschreibung
| |
| |- style="border:none;padding:0.049cm;"
| |
| || <tt>complain</tt>
| |
| || "Lernmodus": Aktionen, die gegen die Regeln verstoßen, werden nur geloggt und nicht verboten. Das Profil enthält die Kennzeichnung <tt>flags=(complain)</tt>.
| |
| |- style="border:none;padding:0.049cm;"
| |
| || <tt>enforce</tt>
| |
| || "Zwangsmodus": Aktionen, die gegen die Regeln verstoßen, werden geloggt und verboten. Das Profil enthält die Kennzeichnung <tt>flags=(enforce)</tt>.
| |
| |- style="border:none;padding:0.049cm;"
| |
| || <tt>audit</tt>
| |
| || "Prüfmodus": Alle Regelanwendungen und Regelverstöße werden geloggt. Das Profil enthält die Kennzeichnung <tt>flags=(audit)</tt>.
| |
| |-
| |
| |}
| |
| Profile werden somit folgendermaßen geladen:
| |
|
| |
| sudo aa-complain PROFIL <nowiki># für den "Complain"-Modus</nowiki>
| |
| sudo aa-enforce PROFIL <nowiki># für den "Enforce"-Modus</nowiki>
| |
| sudo aa-audit PROFIL <nowiki># für den "Audit"-Modus </nowiki>
| |
|
| |
| Möchte man alle Profile auf einmal aktivieren, so geschieht dies mit diesem Befehl:
| |
|
| |
| sudo aa-complain /etc/apparmor.d/* <nowiki># für den "Complain"-Modus"</nowiki>
| |
| sudo aa-enforce /etc/apparmor.d/* <nowiki># für den "Enforce"-Modus </nowiki>
| |
|
| |
| Das [https://wiki.ubuntuusers.de/Logdateien/ Logging] erfolgt dabei sowohl in der Syslog '''/var/log/syslog''' als auch in erweiterter Form in der Kernel-Log '''/var/log/kern.log'''. Die '''/var/log/syslog''' ist dabei jedoch standardmäßig die ausschlaggebende, die auch von den AppArmor-Utils '''aa-logprof''' und '''aa-genprof''' benutzt wird. Möchte man sich von Hand anschauen, was AppArmor loggt, eignet sich [https://wiki.ubuntuusers.de/tail/ tail] durch Ausführung von
| |
|
| |
| tail -F /var/log/syslog | grep "apparmor"
| |
|
| |
| bzw.
| |
|
| |
| tail -F /var/log/kern.log | grep "apparmor"
| |
|
| |
| [https://wiki.ubuntuusers.de/AppArmor/#regel_default ⚓︎] Die Regelsätze befinden sich im Verzeichnis '''/etc/apparmor.d/'''. Die Regeln haben dabei die Struktur "pfad.zur.datei.dateiname". Es ist also der Dateipfad enthalten, allerdings durch einen Punkt anstatt eines Slashs getrennt, der letzte Teil gibt den Namen des Programms/Dienstes/... an.
| |
|
| |
| === Deaktivieren und Reaktivieren ===
| |
|
| |
| Die Steuerung von AppArmor erfolgt als [https://wiki.ubuntuusers.de/Dienste/ Dienst]. Um diesen komplett zu stoppen, dient nicht wie bei anderen Diensten üblich der Befehl <tt>stop</tt>, dieser leert nur den Cache. Um AppArmor komplett zu stoppen, muss der folgende Befehl eingegeben werden:
| |
|
| |
| sudo aa-teardown
| |
|
| |
| Der Neustart inkl. Laden alle aktiven Profile erfolgt mit:
| |
|
| |
| sudo systemctl reload apparmor.service
| |
|
| |
| === AppArmor Notify ===
| |
|
| |
| Hat man das Paket '''aa-notify''' installiert, kann man die Benachrichtigung für DENIED-Messages aktivieren. Dazu dient folgender Befehl im Terminal[https://wiki.ubuntuusers.de/AppArmor/#source-2 [2]]:
| |
|
| |
| aa-notify -p
| |
|
| |
| Die Benachrichtigung kann man testen mit:
| |
|
| |
| sudo tcpdump -i enp0s31f6 -n -s 0 -w /foo
| |
|
| |
| (enp0s31f6 ist das Tcpip-Interface, das man mit ifconfig findet)
| |
|
| |
| === Profile bearbeiten ===
| |
|
| |
| Grundsätzlich ist es möglich, von Hand bestehende Profile zu bearbeiten oder neue zu erstellen. Es handelt es sich um normale Textdateien.
| |
|
| |
| === Achtung! ===
| |
|
| |
| Wer das Editieren von Hand beabsichtigt, sollte genau wissen, was er tut! Es besteht eine erhöhte Gefahr, dass das Programm, welches durch das editierte Profil gesichert ist, entweder nicht mehr ausreichend gesichert ist oder auch, dass die Sicherung zu restriktiv ist, so dass das Programm nicht mehr richtig ablaufen kann!
| |
|
| |
| ==== Profilaufbau ====
| |
|
| |
| Eine Profil-Datei ist dabei prinzipiell wie folgt aufgebaut:
| |
|
| |
| vergrößern
| |
|
| |
|
| |
| {| style="border-spacing:0;width:7.253cm;"
| |
| |- style="border:none;padding:0.049cm;"
| |
| || 1
| |
| 2
| |
| 3
| |
| 4
| |
| 5
| |
| 6
| |
| 7
| |
| 8
| |
| 9
| |
| 10
| |
| 11
| |
| 12
| |
| 13
| |
| || <nowiki>#include <tunables/global></nowiki>
| |
|
| |
| /pfad/zur/anwendung {
| |
| <nowiki>#include <abstractions/base></nowiki>
| |
| [...]
| |
| capability sys_admin,
| |
| [...]
| |
| <nowiki># Kommentar</nowiki>
| |
| /usr/lib/gconv/** r,
| |
| /proc/meminfo r,
| |
| /bin/basename rmix,
| |
| [...]
| |
| }
| |
| |-
| |
| |}
| |
| * Mit dem Befehl <tt><nowiki>#include</nowiki></tt> können andere (grundlegende) Regelsätze eingebunden werden.
| |
| * In allen Profilen ist grundsätzlich die Datei '''/etc/apparmor.d/tunables/global''' mit <tt><nowiki>#include</nowiki></tt> eingebunden, die wiederum weitere Dateien aus diesem Verzeichnis enthält, in denen u.a. Variablen wie <tt>@{HOME}</tt> (für alle [https://wiki.ubuntuusers.de/Homeverzeichnis/ Homeverzeichnisse]) oder <tt>@{PROC}</tt> (für das Verzeichnis '''/proc/''') definiert sind.
| |
| * Nach der Angabe des Pfades zur Anwendung, für die das Profil erstellt ist, stehen sämtliche Regeln innerhalb von geschweiften Klammern. Jede Zeile endet mit einem Komma - mit Ausnahme von Kommentaren, <tt><nowiki>#include</nowiki></tt>-Anweisungen, mit denen sogenannten <tt>abstractions</tt> eingebunden werden, und Kind-Profile (näheres dazu weiter unten).
| |
| * Mit dem Befehl <tt>capability XYZ</tt> werden grundlegende Eigenschaften/Merkmale definiert. Siehe dazu die entsprechende [https://manpages.ubuntu.com/manpages/jammy/en/man7/capabilities.7.html Manpage] sowie [https://gitlab.com/apparmor/apparmor/wikis/AppArmor_Core_Policy_Reference#Capability%20rules Capability rules]
| |
| * <tt>/PFAD/ZU/DATEI OPTION</tt> setzt die Berechtigungen für das jeweilige Verzeichnis bzw. die jeweilige Hilfsanwendung. Dabei ist die Verwendung des Jokers <tt><nowiki>*</nowiki></tt> erlaubt, zwei <tt><nowiki>**</nowiki></tt> bedeuten "inkl. aller Unterverzeichnisse" (extended globbing). Beispiele dazu:
| |
|
| |
|
| |
|
| |
|
| |
| {| style="border-spacing:0;width:15.75cm;"
| |
| |- style="border:none;padding:0.049cm;"
| |
| || <tt>/ordner/datei</tt>
| |
| || gilt für diese spezifische Datei '''datei''' in Verzeichnis '''/ordner'''
| |
| |- style="border:none;padding:0.049cm;"
| |
| || <tt>/ordner/*</tt>
| |
| || gilt für alle ''Dateien'' im Verzeichnis '''/ordner'''
| |
| |- style="border:none;padding:0.049cm;"
| |
| || <tt>/ordner/a*</tt>
| |
| || gilt für alle Dateien im Verzeichnis, die mit "a" beginnen
| |
| |- style="border:none;padding:0.049cm;"
| |
| || <tt>/ordner/*.png</tt>
| |
| || gilt für alle Dateien mit der Endung '''.png'''
| |
| |- style="border:none;padding:0.049cm;"
| |
| || <tt>/ordner/[^.]*</tt>
| |
| || gilt für alle Dateien in '''/ordner''' mit Ausnahme derjenigen, die mit einem "." beginnen
| |
| |- style="border:none;padding:0.049cm;"
| |
| || <tt>/ordner/</tt>
| |
| || gilt für das spezifische Verzeichnis '''/ordner'''
| |
| |- style="border:none;padding:0.049cm;"
| |
| || <tt>/ordner/*/</tt>
| |
| || gilt für jedes ''Verzeichnis'' in '''/ordner'''
| |
| |- style="border:none;padding:0.049cm;"
| |
| || <tt>/ordner/**</tt>
| |
| || gilt für jede ''Datei'' oder jedes ''Verzeichnis'' in oder unterhalb von '''/ordner'''
| |
| |- style="border:none;padding:0.049cm;"
| |
| || <tt>/ordner/**/</tt>
| |
| || gilt für jedes ''Verzeichnis'' in oder unterhalb von '''/ordner'''
| |
| |-
| |
| |}
| |
| Weitere Hinweise und Details finden sich unter [https://gitlab.com/apparmor/apparmor/wikis/QuickProfileLanguage#File_Globbing File Globbing].
| |
|
| |
| ==== Berechtigungen ====
| |
|
| |
| Grundsätzlich gilt: Eine Anwendung mit AppArmor-Profil darf nur, was im Profil durch entsprechende Regeln explizit erlaubt wird. Wenn z.B. in einem Profil keine Lese- oder Schreib-Regel für das Home-Verzeichnis existiert, wird jeglicher Zugriff der betreffenden Anwendung auf dieses Verzeichnis blockiert.
| |
|
| |
| ===== Attribute =====
| |
|
| |
| Darüber hinaus gibt es drei zusätzliche Attribute:
| |
|
| |
|
| |
| {| style="border-spacing:0;width:17cm;"
| |
| |- style="border:none;padding:0.049cm;"
| |
| || Attribut
| |
| || Beschreibung
| |
| |- style="border:none;padding:0.049cm;"
| |
| || <tt>audit</tt>
| |
| || alle Anwendungen der Regel werden grundsätzlich geloggt
| |
| |- style="border:none;padding:0.049cm;"
| |
| || <tt>owner</tt>
| |
| || Berechtigung wird nur erteilt, wenn die Datei bzw. das Verzeichnis im Besitz des Benutzers ist
| |
| |- style="border:none;padding:0.049cm;"
| |
| || <tt>deny</tt>
| |
| || der Zugriff auf die Datei bzw. das Verzeichnis wird explizit verboten
| |
| |-
| |
| |}
| |
| <tt>deny</tt> ist sinnvoll, wenn etwa für das Home-Verzeichnis Lese- und Schreibberechtigung durch eine entsprechende Regel erteilt wurde, aber besonders sicherheitskritische Verzeichnisse/Dateien geschützt werden sollen. Beispiel:
| |
|
| |
|
| |
| {| style="border-spacing:0;width:9.793cm;"
| |
| |- style="border:none;padding:0.049cm;"
| |
| || 1
| |
| || audit deny @{HOME}/.config/autostart/** wl,
| |
|
| |
|
| |
| |-
| |
| |}
| |
| ===== Netzwerkberechtigungen =====
| |
|
| |
| AppArmor kann einer Anwendung den Netzwerkzugriff allgemein oder auch sehr spezifisch erlauben oder verbieten. Typische Beispiele:
| |
|
| |
|
| |
| {| style="border-spacing:0;width:15.51cm;"
| |
| |- style="border:none;padding:0.049cm;"
| |
| || 1
| |
| 2
| |
| 3
| |
| 4
| |
| 5
| |
| 6
| |
| || network, <nowiki># Netzwerkzugriff wird generell erlaubt</nowiki>
| |
| deny network, <nowiki># Netzwerkzugriff wird generell verboten </nowiki>
| |
| network tcp, <nowiki># TCP-Verbindungen werden erlaubt</nowiki>
| |
| network udp, <nowiki># UDP-Verbindungen werden erlaubt</nowiki>
| |
| network inet stream, <nowiki># IPv4 TCP-Verbindungen werden erlaubt</nowiki>
| |
| network inet6 dgram, <nowiki># IPv6 UDP-Verbindungen werden erlaubt</nowiki>
| |
| |-
| |
| |}
| |
| Weitere Details unter [https://gitlab.com/apparmor/apparmor/wikis/AppArmor_Core_Policy_Reference#Network_rules Network rules].
| |
|
| |
| ===== Dateizugriffsberechtigungen =====
| |
|
| |
| In AppArmor gibt es folgende Berechtigungen:
| |
|
| |
|
| |
| {| style="border-spacing:0;width:9.126cm;"
| |
| |- style="border:none;padding:0.049cm;"
| |
| | colspan="2" | Dateizugriffsberechtigungen in AppArmor-Profilen
| |
| |- style="border:none;padding:0.049cm;"
| |
| || Option
| |
| || Beschreibung
| |
| |- style="border:none;padding:0.049cm;"
| |
| || <tt>r</tt>
| |
| || Lesezugriff ist erlaubt
| |
| |- style="border:none;padding:0.049cm;"
| |
| || <tt>w</tt>
| |
| || Schreibzugriff ist erlaubt
| |
| |- style="border:none;padding:0.049cm;"
| |
| || <tt>a</tt>
| |
| || Dateiinhalte können hinzugefügt werden
| |
| |- style="border:none;padding:0.049cm;"
| |
| || <tt>l</tt>
| |
| || Es ist erlaubt, einen Link zu erstellen
| |
| |- style="border:none;padding:0.049cm;"
| |
| || <tt>k</tt>
| |
| || Datei kann gesperrt werden (lockfile)
| |
| |- style="border:none;padding:0.049cm;"
| |
| || <tt>m</tt>
| |
| || Es darf der Aufruf von [https://manpages.ubuntu.com/manpages/jammy/en/man2/mmap.2.html mmap] erfolgen
| |
| |- style="border:none;padding:0.049cm;"
| |
| || <tt>x</tt>
| |
| || Hilfsanwendung darf ausgeführt werden
| |
| |-
| |
| |}
| |
| Die Option <tt>x</tt> kann nur in den folgenden Kombinationen verwendet werden:
| |
|
| |
|
| |
| {| style="border-spacing:0;width:17cm;"
| |
| |- style="border:none;padding:0.049cm;"
| |
| | colspan="3" | Ausführungsberechtigungen in AppArmor-Profilen
| |
| |- style="border:none;padding:0.049cm;"
| |
| || Option
| |
| || englisch für
| |
| || Beschreibung
| |
| |- style="border:none;padding:0.049cm;"
| |
| || <tt>ux</tt>
| |
| || unconfined execute mode
| |
| || Hilfsanwendung ohne AppArmor-Überwachung ausführen
| |
| |- style="border:none;padding:0.049cm;"
| |
| || <tt>Ux</tt>
| |
| || unconfined execute – scrub the environment
| |
| || wie <tt>ux</tt> mit Bereinigen der Umgebung
| |
| |- style="border:none;padding:0.049cm;"
| |
| || <tt>ix</tt>
| |
| || inherit execute mode
| |
| || Hilfsanwendung erbt die Berechtigungen der Hauptanwendung
| |
| |- style="border:none;padding:0.049cm;"
| |
| || <tt>px</tt>
| |
| || discrete Profile execute mode
| |
| || setzt die Definition eines eigenen Profils für die Hilfsanwendung voraus
| |
| |- style="border:none;padding:0.049cm;"
| |
| || <tt>Px</tt>
| |
| || Discrete Profile execute mode – scrub the environment
| |
| || wie <tt>px</tt> mit Bereinigen der Umgebung
| |
| |- style="border:none;padding:0.049cm;"
| |
| || <tt>cx</tt>
| |
| || Execute and transition to a child profile
| |
| || Ausführen der Hilfsanwendung über ein Kind-Profil innerhalb des Profils der Hauptanwendung
| |
| |- style="border:none;padding:0.049cm;"
| |
| || <tt>Cx</tt>
| |
| || Execute and transition to a child profile – scrub the environment
| |
| || wie <tt>cx</tt> mit Bereinigen der Umgebung
| |
| |-
| |
| |}
| |
| Für die Ausführungsberechtigungen sind folgende Hinweise zu beachten:* Die Benutzung von <tt>ux</tt> wird nicht empfohlen, sofern nicht unbedingt notwendig. Eine mit <tt>ux</tt> ausgeführte Hilfsanwendung wird von AppArmor nicht kontrolliert bzw. "eingesperrt" und kann somit u.U. eine erhebliche Lücke in ein ansonsten sicheres Profil der Hauptanwendung reißen.
| |
| * Auch die Benutzung von <tt>Ux</tt> wird nicht empfohlen. Zwar wird hier ein sog. [https://stackoverflow.com/questions/5835664/how-does-apparmor-do-environment-scrubbing "environment scrubbing"] durchgeführt (d.h. ein Bereinigen der Umgebung, indem [https://wiki.ubuntuusers.de/Umgebungsvariable/ Umgebungsvariable] wie <tt>LD_PRELOAD</tt> entfernt werden). Ansonsten gilt jedoch dieselbe Problematik wie unter <tt>ux</tt>.
| |
| * Erheblich sicherer ist die Verwendung von <tt>ix</tt>. Eine damit ausgeführte Hilfsanwendung erbt die Berechtigungen der Hauptanwendung, darf also nicht mehr, aber auch nicht weniger als diese. Dies kann problematisch sein, wenn die Hilfsanwendung mehr Rechte benötigt als die Hauptanwendung oder wenn die Rechte der Hilfsanwendung gezielt beschränkt werden sollen.
| |
| * Erheblich flexibler ist diesbezüglich die Verwendung von <tt>px</tt> (bzw. <tt>Px</tt>). Voraussetzung ist, dass für die Hilfsanwendung ein eigenes AppArmor-Profil definiert ist, in dem die Berechtigungen deutlich von denen der jeweiligen Hauptanwendung abweichen können, und auf das auch andere Hauptanwendungen zugreifen können.
| |
| * Noch flexibler ist die Verwendung von <tt>cx</tt> (bzw. <tt>Cx</tt>). Hier wird für die Hilfsanwendung ein lokales Profil innerhalb des Profils der Hauptanwendung angelegt. Der Vorteil gegenüber <tt>px</tt> ist, dass dadurch unterschiedliche Berechtigungen für die Hilfsanwendung festgelegt werden können, je nachdem, durch welche Hauptanwendung sie aufgerufen wird. Beispiel: Erstellt man z.B. ein AppArmor-Profil für den Browser Google Chrome, werden u.a. als Hilfsanwendungen [https://wiki.ubuntuusers.de/xdg-open/ xdg-open] und '''xdg-settings''' benötigt, die über entsprechende Kind-Profile eingebunden werden können. Die Syntax für das Profil '''/etc/apparmor.d/opt.google.chrome.chrome''' sieht dann auszugsweise folgendermaßen aus: <br/>vergrößern
| |
|
| |
|
| |
|
| |
|
| |
| {| style="border-spacing:0;width:10.005cm;"
| |
| |- style="border:none;padding:0.049cm;"
| |
| || 1
| |
| 2
| |
| 3
| |
| 4
| |
| 5
| |
| 6
| |
| 7
| |
| 8
| |
| 9
| |
| 10
| |
| 11
| |
| 12
| |
| 13
| |
| 14
| |
| 15
| |
| 16
| |
| 17
| |
| 18
| |
| 19
| |
| 20
| |
| 21
| |
| 22
| |
| 23
| |
| 24
| |
| 25
| |
| 26
| |
| 27
| |
| 28
| |
| 29
| |
| 30
| |
| 31
| |
| 32
| |
| 33
| |
| 34
| |
| 35
| |
| || <nowiki># Last Modified: Sat Feb 16 18:28:03 2013</nowiki>
| |
| <nowiki>#include <tunables/global></nowiki>
| |
|
| |
| /opt/google/chrome/chrome {
| |
| [...]
| |
| /opt/google/chrome/xdg-settings Cx,
| |
| [...]
| |
| /usr/bin/xdg-open Cx,
| |
| /usr/bin/xdg-settings Cx,
| |
|
| |
| [...]
| |
|
| |
| profile /opt/google/chrome/xdg-settings {
| |
|
| |
| /bin/dash r,
| |
| /bin/grep rix,
| |
| /bin/readlink rix,
| |
| [...]
| |
| }
| |
|
| |
| profile /usr/bin/xdg-open {
| |
| <nowiki>#include <abstractions/base></nowiki>
| |
|
| |
| /bin/dash r,
| |
| /etc/X11/cursors/oxy-white.theme r,
| |
| [...]
| |
| }
| |
|
| |
| profile /usr/bin/xdg-settings {
| |
|
| |
| /bin/cat rix,
| |
| /bin/dash r,
| |
| [...]
| |
| }
| |
| }
| |
| |-
| |
| |}
| |
| * Als weitere Variante mit <tt>cx</tt> und <tt>Cx</tt> ist eine sog. "named profile transition" möglich. Hier wird ein Kind-Profil namentlich explizit definiert. Sollen in dem obigen Beispiel keine separaten Kind-Profile für '''/opt/google/chrome/xdg-settings''' und '''/usr/bin/xdg-settings''' erstellt werden, könnte etwa ein gemeinsames Kind-Profil namens ''gemeinsame_xdg_settings'' definiert werden, auf das die Hilfsanwendungen mit einem Pfeilsymbol verweisen. Die Syntax ändert sich dann in:<br/>vergrößern
| |
|
| |
|
| |
|
| |
|
| |
| {| style="border-spacing:0;width:14.026cm;"
| |
| |- style="border:none;padding:0.049cm;"
| |
| || 1
| |
| 2
| |
| 3
| |
| 4
| |
| 5
| |
| 6
| |
| 7
| |
| 8
| |
| 9
| |
| 10
| |
| 11
| |
| 12
| |
| 13
| |
| 14
| |
| 15
| |
| 16
| |
| 17
| |
| 18
| |
| || <nowiki>#include <tunables/global></nowiki>
| |
|
| |
| /opt/google/chrome/chrome {
| |
| [...]
| |
| /opt/google/chrome/xdg-settings Cx -> gemeinsame_xdg_settings,
| |
| [...]
| |
| /usr/bin/xdg-settings Cx -> gemeinsame_xdg_settings,
| |
|
| |
| [...]
| |
|
| |
| profile gemeinsame_xdg_settings {
| |
|
| |
| /bin/dash r,
| |
| /bin/grep rix,
| |
| /bin/readlink rix,
| |
| [...]
| |
| }
| |
| }
| |
| |-
| |
| |}
| |
| Ein weiteres interessantes Beispiel einer "named profile transition" enthält die abstraction '''/etc/apparmor.d/abstractions/ubuntu-browsers.d/java'''.
| |
|
| |
| ===== Abstractions =====
| |
|
| |
| Im Verzeichnis '''/etc/apparmor.d/abstractions''' befinden sich eine Vielzahl von vorgefertigten Regelsätzen, den sog. "abstractions". Sie enthalten Regeln, die typischerweise bei der Erstellung eines AppArmor-Profils von vielen Anwendungen benötigt werden. Durch Einbinden über den "<tt><nowiki>#include</nowiki></tt>" - Befehl kann die Profilerstellung deutlich vereinfacht werden. Die jeweiligen abstractions werden - wenn benötigt - bei der Regelerstellung bzw. beim Optimierung des Profils mit '''aa-logprof''' angeboten. Folgende Hinweise sollten dabei beachtet werden:* In vielen abstractions sind andere abstractions über <tt><nowiki>#include</nowiki></tt> eingebunden, und in diese wiederum oft andere abstractions. Durch diese mehrstufige Verschachtelung ist es - insbesondere bei der Verwendung mehrerer abstractions - häufig sehr schwierig, die effektiven Berechtigungen zu durchschauen, die man sich dadurch eingehandelt hat. Es besteht daher die Gefahr, dass auf diese Weise einer Anwendung mehr Rechte als nötig oder beabsichtigt erteilt werden. Das ist ein potentielles Sicherheitsrisiko.
| |
| * Hinzu kommt, dass es bei der Verwendung mehrerer abstractions mitunter zu konkurrierenden Berechtigungen kommen kann, was beim Laden des Profils mit einer entsprechenden Fehlermeldung (z.B. "... conflicting permissions...") quittiert wird.
| |
| * Aus diesen Gründen ist es ratsam, sich bei der Verwendung von abstractions in Zurückhaltung zu üben. Wird von aa-logprof eine spezifische Regel und als Alternative eine oder mehrere abstractions angeboten, sollte man die Regel bevorzugen, auch wenn dies die Profilerstellung etwas mühsamer macht.
| |
| * Nichtsdestotrotz sind eine Reihe von abstractions sehr sinnvoll. Da den meisten Anwendungen Lese- und Schreibzugriff auf das Homeverzeichnis gewährt werden muss, ist es z.B. sinnvoll, zur Absicherung sicherheitskritischer Dateien oder Verzeichnisse das Profil mit "<tt><nowiki>#include <abstractions/private-files></nowiki></tt>" (oder u.U. in einer erweiterten Form mit "<tt><nowiki>#include <abstractions/private-files-strict></nowiki></tt>") zu ergänzen.
| |
|
| |
|
| |
|
| |
| ==== Generelle Hinweise zur Profilbearbeitung ====
| |
|
| |
| Das manuelle Editieren eines AppArmor-Profils sollte die Ausnahme darstellen. In der Praxis erfolgt das Hinzufügen von Regeln zu einem Profil mit Hilfe von <tt>aa-logprof</tt>. Eine manuelle Nachbearbeitung beschränkt sich daher im wesentlichen auf drei Fälle:# Es sollte überprüft werden, ob man nicht mit <tt>aa-logprof</tt> versehentlich die gefährlichen Ausführungsmodi <tt>ux</tt> und <tt>Ux</tt> gewählt hat.
| |
| # Es macht bei umfangreichen Profilen u.U. Sinn, zum Zwecke einer besseren Übersichtlichkeit die Regeln zu gruppieren bzw. anders zu sortieren oder auch ggfs. einzelne Regeln mit einer zusätzlichen Kommentarzeile (beginnend mit einem <tt><nowiki>#</nowiki></tt>) zu erläutern.
| |
| # Es ist zu überprüfen, ob möglicherweise einzelne Regeln nachträglich modifiziert werden sollten, z.B. indem eine generelle Lese- und Schreibberechtigung für das Homeverzeichnis durch "<tt>deny</tt>"-Regeln für einzelne Unterverzeichnisse/Dateien eingeschränkt wird.
| |
|
| |
|
| |
|
| |
| Generell nicht manuell bearbeitet werden sollten die mit Ubuntu standardmäßig mitgelieferten und mit '''apparmor-profiles''' zusätzlich installierten Profile in '''/etc/apparmor.d''', da alle Modifizierungen (auch über aa-logprof) bei einem Update dieser Profile über die Paketverwaltung verloren gehen. Für diesen Zweck stehen stattdessen in '''/etc/apparmor.d/local''' jeweils leere "Unterprofile" zur Verfügung, die mit "<tt><nowiki>#include</nowiki></tt>" in das zugehörige Profil eingebunden sind. Alle hier manuell hinzugefügten Berechtigungen oder "<tt>deny</tt>"-Regeln bleiben bei einem Update des betreffenden Profils erhalten. Diese Empfehlung gilt natürlich nicht für selbsterstellte Profile.
| |
|
| |
|
| == Schutz durch AppArmor == | | == Schutz durch AppArmor == |