3.5. Zwei Methoden der Profilerstellung

Mithilfe der Syntax für Novell AppArmor-Profile in Abschnitt 3.1, „Profilkomponenten und Syntax“ (↑ Novell AppArmor 2.0-Administrationshandbuch ) können Sie Profile ohne Einsatz der Werkzeuge erstellen. Der Aufwand wäre jedoch erheblich. Eine solche Anstrengung können Sie vermeiden, indem Sie Erstellung und Ausarbeitung der Profile mithilfe der Novell AppArmor-Werkzeuge automatisieren.

Es gibt zwei Herangehensweisen bei der Erstellung von Novell AppArmor-Profilen mit entsprechenden Werkzeugen für beide Methoden.

Einzelprofilerstellung

Eine geeignete Methode für Profile von kleinen Anwendungen mit endlicher Laufzeit, etwa Benutzer-Client-Anwendungen wie Mail-Clients. Weitere Informationen finden Sie in Abschnitt 3.5.1, „Einzelprofilerstellung“ (↑ Novell AppArmor 2.0-Administrationshandbuch ).

Systemweite Profilerstellung

Geeignete Methode für Profile, die gleichzeitig für eine große Anzahl an Programmen gelten oder für Anwendungen, die mehrere Tage, Wochen oder über Neustarts hinweg ablaufen, beispielsweise Netzwerkserver-Anwendungen wie Webserver und Mailserver. Weitere Informationen finden Sie in Abschnitt 3.5.2, „Systemweite Profilerstellung“ (↑ Novell AppArmor 2.0-Administrationshandbuch ).

Automatisierte Profilentwicklung lässt sich mithilfe der Novell AppArmor-Werkzeuge leichter verwalten:

  1. Entscheiden Sie, welche Methode der Profilerstellung Ihren Anforderungen entspricht.

  2. Führen Sie eine statische Analyse aus. Führen Sie abhängig von der gewählten Profilerstellungsmethode genprof oder autodep aus.

  3. Aktivieren Sie dynamisches Lernen. Aktivieren Sie den Lernmodus für alle Programme mit Profil.

3.5.1. Einzelprofilerstellung

Die Erstellung und Verbesserung von Einzelprofilen wird durch das Programm genprof verwaltet. Dies ist eine bequeme Methode, da sich genprof um alles kümmert, ist aber eingeschränkt, da genprof für die gesamte Dauer des Testlaufs Ihres Programms ausgeführt werden muss (d. h., Sie können den Rechner nicht neu starten, während Sie noch Ihr Profil entwickeln).

Informationen über die Verwendung von genprof beim Erstellen von Einzelprofilen finden Sie unter Abschnitt 3.5.3.4, „genprof“ (↑ Novell AppArmor 2.0-Administrationshandbuch ).

3.5.2. Systemweite Profilerstellung

Diese Methode heißt systemweite Profilerstellung, da sie alle Profile des Systems gleich­zeitig aktualisiert, anstatt sich auf das eine oder die wenigen Profile zu konzentrieren, die von genprof oder der Einzelprofilerstellung behandelt werden.

Bei der systemweiten Profilerstellung sind Erstellen und Ausarbeiten von Profilen etwas weniger automatisiert, dafür aber flexibler. Diese Methode eignet sich für langfristig ausgeführte Programme, deren Verhalten nach einem Neustart fortfährt, oder für eine große Anzahl an Programmen, die gleichzeitig ein Profil erhalten sollen.

Erstellen Sie wie folgt ein Novell AppArmor-Profil für eine Gruppe von Anwendungen:

  1. Erstellen Sie Profile für die einzelnen Programme, aus denen Ihre Anwendung besteht.  Obwohl diese Methode systemweit wirkt, überwacht Novell AppArmor nur die Programme mit Profilen und deren untergeordnete Programme. Damit also Novell AppArmor ein Programm berücksichtigt, müssen Sie mindestens autodep ausführen, um ein vorläufiges Profil dafür zu erstellen. Informationen zur Erstellung dieses vorläufigen Profils finden Sie unter Abschnitt 3.5.3.1, „autodep“ (↑ Novell AppArmor 2.0-Administrationshandbuch ).

  2. Versetzen Sie relevante Profile in den Lern- oder Meldungsmodus.  Aktivieren Sie den Lern- oder Meldungsmodus für alle Programme mit Profil, indem Sie complain /etc/apparmor.d/* in ein Terminalfenster eingeben, während Sie als root angemeldet sind.

    Im Lernmodus werden Zugriffsanforderungen nicht blockiert, selbst wenn das Profil dies vorsieht. Damit können Sie mehrere Tests ausführen (wie in Schritt 3 (↑ Novell AppArmor 2.0-Administrationshandbuch ) gezeigt) und die Zugriffsanforderungen des Programms lernen, damit es reibungslos abläuft. Anhand dieser Information können Sie entscheiden, wie sicher das Profil sein muss.

    Ausführlichere Anleitungen zur Verwendung des Lern- oder Meldungsmodus finden Sie unter Abschnitt 3.5.3.2, „Meldungs- oder Lernmodus“ (↑ Novell AppArmor 2.0-Administrationshandbuch ).

  3. Führen Sie Ihre Anwendung aus.  Führen Sie Ihre Anwendung und deren Funktionalität aus. Wie viel des Programms Sie ausführen, ist Ihre Entscheidung, aber das Programm muss auf jede Datei gemäß den entsprechenden Anforderungen zugreifen. Da die Ausführung nicht durch genprof überwacht wird, kann dieser Schritt Tage und Wochen beanspruchen und über vollständige Systemneustarts hinweg dauern.

  4. Analysieren Sie das Protokoll.  Führen Sie bei der systemweiten Profilerstellung logprof direkt aus, anstatt es von genprof ausführen zu lassen (wie bei der Einzelprofilerstellung). Die allgemeine Form von logprof:

    logprof [ -d /path/to/profiles ] [ -f /path/to/logfile ]

    Weitere Informationen über die Verwendung von logprof erhalten Sie unter Abschnitt 3.5.3.5, „logprof“ (↑ Novell AppArmor 2.0-Administrationshandbuch ).

  5. Wiederholen Sie die Schritte 3-4.  Dadurch werden optimale Profile generiert. Eine iterative Methode erfasst kleinere Datenmengen, die gelernt und erneut in die Richtlinien-Engine geladen werden können. Nachfolgende Iterationen generieren weniger Meldungen und laufen schneller ab.

  6. Bearbeiten Sie die Profile.  Sie sollten die Profile überprüfen, die generiert wurden. Sie können die Profile mithilfe von vim in /etc/apparmor.d/ öffnen und bearbeiten. Hilfe zur optimalen Verwendung von vim finden Sie unter Abschnitt 3.5.3.8, „apparmor.vim“ (↑ Novell AppArmor 2.0-Administrationshandbuch ).

  7. Wechseln Sie wieder in den „Erzwingen“-Modus.  Das System beginnt dann wieder, die Regeln der Profile durchzusetzen, nicht einfach nur Informationen zu protokollieren. Dies können Sie manuell ausführen, indem Sie den Text flags=(complain) aus den Profilen entfernen, oder automatisch, indem Sie den Befehl "enforce" verwenden, der wie der Befehl "complain" funktioniert, jedoch die Profile in den Erzwingen-Modus setzt.

    Um sicherzustellen, dass alle Profile aus dem Meldungsmodus in den Erzwingen-Modus versetzt werden, geben Sie enforce /etc/apparmor.d/* ein.

  8. Scannen Sie alle Profile neu.  Damit Novell AppArmor alle Profile erneut scannt und den Erzwingen-Modus im Kernel ändert, geben Sie /etc/init.d/apparmor restart ein.

3.5.3. Zusammenfassung der Profilwerkzeuge

Alle Novell AppArmor-Profilwerkzeuge werden im RPM-Paket apparmor-utils zur Verfügung gestellt und die meisten sind unter /usr/sbin gespeichert. Die folgenden Abschnitte stellen jedes Werkzeug vor.

3.5.3.1. autodep

Erstellt ein vorläufiges Profil für das Programm oder die Anwendung, für die Sie das Werkzeug ausführen. Sie können vorläufige Profile für ausführbare Binärdateien und interpretierte Skriptprogramme generieren. Das resultierende Profil wird „vorläufig“ genannt, da es nicht notwendigerweise alle Profileinträge enthält, die das Programm braucht, um korrekt von Novell AppArmor eingeschränkt zu werden. Das minimale vorläufige autodep-Profil enthält wenigstens eine grundlegende include-Direktive, die grundlegende Profileinträge für die meisten Programme enthält. Für bestimmte Programmtypen generiert autodep ein ausführlicheres Profil. Das Profil wird durch den rekursiven Aufruf von ldd(1) mit den ausführbaren Programmen generiert, die in der Befehlszeile aufgelistet sind.

Verwenden Sie zur Generierung eines vorläufigen Profils das Programm autodep. Das Programmargument kann entweder der einfache Name des Programms sein, den autodep beim Durchsuchen der Pfadvariablen Ihrer Shell findet, oder ein vollständig qualifizierter Pfad. Das Programm selbst kann einen beliebigen Typ haben (ELF-Binärformat, Shell-Skript, Perl-Skript usw.) und autodep generiert ein vorläufiges Profil, das durch anschließende dynamische Profilerstellung verbessert werden kann.

Das resultierende vorläufige Profil wird in das Verzeichnis /etc/apparmor.d geschrieben. Dabei wird die Novell AppArmor-Konvention verwendet, das Profil nach dem absoluten Pfad anzugeben und die Schrägstriche (/) im Pfad jeweils durch einen Punkt (.) zu ersetzen. Die allgemeine Form von autodep besteht in der Eingabe des Folgenden in ein Terminalfenster während einer Anmeldung als root:

autodep [ -d /path/to/profiles ] [program1 program2...]

Wenn Sie den oder die Programmnamen nicht eingeben, werden Sie dazu aufgefordert. /path/to/profiles hat Vorrang vor dem Standardspeicherort /etc/apparmor.d.

Um die Profilerstellung zu beginnen, müssen Sie Profile für jeden ausführbaren Hauptdienst anlegen, der Ihrer Anwendung angehört (alles, das keinem anderen Programm mit Profil untergeordnet ist). Das Auffinden aller solcher Programme hängt von der betreffenden Anwendung ab. Strategien zum Auffinden solcher Programme:

Verzeichnisse

Wenn sich alle Programme, für die Sie Profile erstellen möchten, in einem Verzeichnis befinden und keine anderen Programme in diesem Verzeichnis sind, erstellt der einfache Befehl autodep /path/to/your/programs/* nominale Profile für alle Programme in diesem Verzeichnis.

ps-Befehl

Sie können Ihre Anwendung ausführen und den Linux-Standardbefehl ps verwenden, um alle ablaufenden Prozesse zu finden. Sie müssen dann den Speicherort dieser Programme manuell ermitteln und für jedes das Programm autodep ausführen. Wenn sich die Programme auf Ihrem Pfad befinden, findet sie autodep für Sie. Wenn sie sich nicht auf Ihrem Pfad befinden, kann der Linux-Standardbefehl locate bei der Suche helfen. Wenn locate nicht funktioniert (es wird nicht standardmäßig auf SUSE Linux installiert), verwenden Sie find . -name '*foo*' -print.

3.5.3.2. Meldungs- oder Lernmodus

Das Meldungs- oder Lernmoduswerkzeug entdeckt Verletzungen von Novell AppArmor-Profilregeln, etwa wenn das Programm, für welches das Profil gilt, auf Dateien zugreift, die das Profil nicht gestattet. Die Verletzungen werden erlaubt, allerdings auch protokolliert. Um das Profil zu verbessern, aktivieren Sie den Meldungsmodus, führen Sie das Programm in einer Testfolge aus, um Protokollereignisse zu generieren, die den Zugriffsanforderungen des Programms entsprechen. Führen Sie dann eine Nachverarbeitung des Protokolls mit den Novell AppArmor-Werkzeugen aus, um Protokollereignisse in verbesserte Profile umzuwandeln.

Manuelle Aktivierung des Meldungsmodus (über die Befehlszeile) fügt am Beginn des Profils eine Flag ein, d. h., /bin/foo wird zu /bin/foo flags=(complain). Öffnen Sie für die Verwendung des Meldungsmodus ein Terminalfenster und geben Sie eine der folgenden Zeilen als root-Benutzer ein.

  • Wenn sich das Beispielprogramm (program1) in Ihrem Pfad befindet, verwenden Sie:

    complain [program1 program2 ...]
  • Wenn sich das Programm nicht in Ihrem Pfad befindet, geben Sie den vollständigen Pfad wie folgt an:

    complain /sbin/program1
    
  • Wenn sich die Profile nicht in /etc/apparmor.d befinden, geben Sie Folgendes ein, um den Standardspeicherort zu überschreiben:

    complain /path/to/profiles/ program1
         
  • Geben Sie wie folgt das Profil für program1 an:

    complain /etc/apparmor.d/sbin.program1

Jeder der obigen Befehle aktiviert den Meldungsmodus für die aufgelisteten Profile/Programme. Der Befehl kann Programme oder Profile auflisten. Wenn der Programmname nicht den vollständigen Pfad umfasst, durchsucht "complain" $PATH für das Programm. complain /usr/sbin/* findet also beispielsweise Profile, die mit allen Programmen in /usr/sbin verbunden sind, und setzt sie in den Meldungsmodus und complain /etc/apparmor.d/* setzt alle Profile in /etc/apparmor.d in den Meldungsmodus.

3.5.3.3. Erzwingen-Modus

Das Erzwingen-Modus-Werkzeug entdeckt Verletzungen von Novell AppArmor-Profilregeln, etwa wenn das Programm, für welches das Profil gilt, auf Dateien zugreift, die das Profil nicht gestattet. Die Verletzungen werden protokolliert und nicht erlaubt. Standardmäßig ist der Erzwingen-Modus aktiviert. Aktivieren Sie den Meldungsmodus, wenn die Novell AppArmor-Profile den Zugriff des Programms steuern sollen, für das ein Profil festgelegt wird. Erzwingen- und Meldungsmodus schließen sich gegenseitig aus.

Manuelle Aktivierung des Erzwingen-Modus (über die Befehlszeile) fügt am Beginn des Profils eine Flag ein, d. h., /bin/foo wird zu /bin/foo flags=(enforce). Öffnen Sie für die Verwendung des Erzwingen-Modus ein Terminalfenster und geben Sie eine der folgenden Zeilen als root-Benutzer ein.

  • Wenn sich das Beispielprogramm (program1) in Ihrem Pfad befindet, verwenden Sie:

    enforce [program1 program2 ...]
  • Wenn sich das Programm nicht in Ihrem Pfad befindet, geben Sie den vollständigen Pfad wie folgt an:

    enforce /sbin/program1
  • Wenn sich die Profile nicht in /etc/apparmor.d befinden, geben Sie Folgendes ein, um den Standardspeicherort zu überschreiben:

    enforce /path/to/profiles/ program1
  • Geben Sie wie folgt das Profil für program1 an:

    enforce /etc/apparmor.d/sbin.program1

Jeder der obigen Befehle aktiviert den Erzwingen-Modus für die aufgelisteten Profile und Programme.

Wenn Sie den oder die Programm- oder Profilnamen nicht eingeben, werden Sie dazu aufgefordert. /path/to/profiles hat Vorrang vor dem Standardspeicherort /etc/apparmor.d.

Das Argument kann entweder eine Liste von Programmen oder eine Liste von Profilen sein. Wenn der Programmname nicht den vollständigen Pfad umfasst, durchsucht "enforce" $PATH für das Programm. enforce /usr/sbin/* findet beispielsweise Profile, die mit allen Programmen in /usr/sbin verbunden sind, und setzt sie in den Erzwingen-Modus. enforce /etc/apparmor.d/* setzt alle Profile in /etc/apparmor.d in den Erzwingen-Modus.

3.5.3.4. genprof

genprof (Profil erstellen) ist das Novell AppArmor-Dienstprogramm zur Profilerstellung. Es führt autodep am angegebenen Programm aus, erstellt ein vorläufiges Profil (falls nicht bereits ein Profil für das Programm existiert), setzt es in den Erzwingen-Modus, lädt es erneut in Novell AppArmor, markiert das Systemprotokoll und fordert den Benutzer auf, das Programm und seine Funktionalität auszuführen. Die Syntax lautet wie folgt:

genprof [ -d /path/to/profiles ]  program

Wenn Sie ein Profil für das Apache-Webserver-Programm httpd2-prefork erstellen möchten, führen Sie Folgendes in einer root-Shell aus:

  1. Geben Sie rcapache2 stop ein.

  2. Geben Sie als Nächstes genprof httpd2-prefork ein.

    genprof führt nun folgende Aktionen aus:

    • Löst den vollständigen Pfad von httpd2-prefork basierend auf den Pfad­variablen Ihrer Shell auf. Sie können auch einen vollständigen Pfad angeben. Unter SUSE Linux lautet der vollständige Pfad /usr/sbin/httpd2-prefork.

    • Prüft, ob ein bestehendes Profil für httpd2-prefork vorhanden ist. Wenn ja, wird dieses aktualisiert. Wenn nein, wird eines mithilfe des autodep-Programms erstellt (siehe Abschnitt 3.5.3, „Zusammenfassung der Profilwerkzeuge“ (↑ Novell AppArmor 2.0-Administrationshandbuch )).

      [Note]Anmerkung

      Es gibt eine Namenskonvention für den vollständigen Pfad eines Programms zum Namen seiner Profildatei, damit die verschiedenen Novell AppArmor-Profilerstellungswerkzeuge sie konsistent manipulieren können. Die Konvention besteht darin, dass ein Schrägstrich (/) durch einen Punkt (.) ersetzt wird, d. h., das Profil für /usr/sbin/httpd2-prefork wird in /etc/apparmor.d/usr.sbin.httpd2-prefork gespeichert.

    • Setzt das Profil für dieses Programm in den Lern- oder Meldungsmodus, damit Profilverletzungen protokolliert werden, das Programm aber fortfahren darf. Ein Protokollereignis sieht wie folgt aus:

      Oct  9 15:40:31 AppArmor: PERMITTING r access to /etc/apache2/httpd.conf (httpd2-prefork(6068) profile /usr/sbin/httpd2-prefork active /usr/sbin/httpd2-prefork)
    • Markiert Syslog mit einem Anfangskennzeichen für die zu beachtenden Protokollereignisse. Beispiel:

      Sep 13 17:48:52 h2o root: GenProf: e2ff78636296f16d0b5301209a04430d
  3. Wenn Sie vom Werkzeug dazu aufgefordert werden, führen Sie die Anwendung, für die Sie das Profil erstellen, in einem anderen Terminalfenster aus. Führen Sie möglichst viele der Anwendungsfunktionen aus, damit der Lernmodus die Dateien und Verzeichnisse protokollieren kann, auf die das Programm für eine korrekte Funktion zugreifen muss. Geben Sie beispielsweise rcapache2 start in ein neues Terminalfenster ein.

  4. Wählen Sie, welche der folgenden Optionen benutzt werden kann, nachdem Sie die Funktionalität des Programms ausgeführt haben:

    • S führt logprof am Systemprotokoll aus und zwar ab der Stelle, die beim Start von genprof markiert wurde, und lädt das Profil neu.

      Wenn das Protokoll Systemereignisse enthält, analysiert Novell AppArmor die Lernmodus-Protokolldateien. Damit wird eine Serie von Fragen erzeugt, die Sie beantworten müssen, um genprof beim Generieren des Sicherheitsprofils zu lenken.

    • F beendet das Werkzeug und kehrt in das Hauptmenü zurück.

  5. Beantworten Sie zwei Arten von Fragen:

    Jede dieser Kategorien führt zu einer Serie von Fragen, die Sie beantworten müssen, um dem Profil die Ressource oder das Programm hinzuzufügen. Die folgenden beiden Abbildungen zeigen ein Beispiel für den jeweiligen Fall. Nachfolgende Schritte beschreiben Ihre Möglichkeiten bei der Beantwortung dieser Fragen.

    Beispiel 3.1. Lernmodus-Ausnahme: Kontrolle des Zugriffs auf bestimmte Ressourcen

    Reading log entries from /var/log/messages. 
    Aktualisieren von apparmor-Profilen in /etc/apparmor.d.
    
    Profile: /usr/sbin/xinetd 
    Execute: /usr/sbin/vsftpd
    
    [(I)nherit] / (P)rofile / (U)nconfined / (D)eny / Abo(r)t / (F)inish) 
    

    Der Umgang mit Ausführungszugriffen ist komplex. Sie müssen entscheiden, welche der drei Arten von Ausführungsberechtigungen Sie dem Programm gewähren möchten:

    inherit (ix)

    Das untergeordnete Programm erbt das Profil des übergeordneten Programms und läuft mit denselben Zugriffsberechtigungen wie das übergeordnete Programm. Dieser Modus ist nützlich, wenn ein eingeschränktes Programm ein anderes eingeschränktes Programm aufrufen muss, ohne die Berechtigungen des Zielprofils zu erhalten oder die Berechtigungen des aktuellen Profils zu verlieren. Dieser Modus wird häufig benutzt, wenn das untergeordnete Programm eine Hilfsanwendung ist, wie der /usr/bin/mail-Client, der das Programm less zur seitenweisen Ausgabe verwendet, oder der Mozilla-Webbrowser, der das Acrobat-Programm zur Anzeige von PDF-Dateien nutzt.

    profile (px)

    Das untergeordnete Programm läuft mit seinem eigenen Profil ab, das in den Kernel geladen werden muss. Wenn das Profil nicht vorhanden ist, schlagen Ausführungsversuche des untergeordneten Programms mit abgelehnter Berechtigung fehl. Dies ist besonders nützlich, wenn das übergeordnete Programm einen globalen Dienst aufruft, z. B. DNS-Lookups oder das Senden von Mail über den MTA Ihres Systems.

    unconfined (ux)

    Das untergeordnete Programm läuft uneingeschränkt ohne ein Novell AppArmor-Profil für die ausgeführte Ressource.

    Beispiel 3.2. Lernmodus-Ausnahme: Definieren von Ausführungsberechtigungen für einen Eintrag

    Adding /bin/ps ix to profile.
    
    Profile:  /usr/sbin/xinetd
    Path:     /etc/hosts.allow
    New Mode: r
    
     [1 - /etc/hosts.allow]
    
    [(A)llow] / (D)eny / (N)ew / (G)lob / Glob w/(E)xt / Abo(r)t / (F)inish
    

    Das obige Menü zeigt, wie Novell AppArmor Verzeichnispfad-Einträge vorschlägt, auf die die Anwendung, für die Sie ein Profil erstellen, zugegriffen hat. Eventuell wird auch verlangt, dass Sie Ausführungsberechtigungen für Einträge definieren.

    Novell AppArmor bietet einen oder mehrere Pfadnamen oder include-Dateien an. Klicken Sie auf eine oder mehrere Optionsnummern, um eine oder mehrere der folgenden Optionen auszuwählen, und fahren Sie dann mit dem nächsten Schritt fort.

    [Note]Anmerkung

    Es werden nicht immer alle diese Optionen im Novell AppArmor-Menü angeboten.

    #include

    Dies ist der Abschnitt eines Novell AppArmor-Profils, der auf eine include-Datei verweist, die Zugriffsberechtigungen für Programme vermittelt. Durch Verwenden einer include-Anweisung können Sie dem Programm Zugriff auf Verzeichnispfade oder Dateien geben, die auch von anderen Programmen benötigt werden. Mithilfe von include-Anweisungen lässt sich die Größe eines Profils verringern. Es empfiehlt sich, include-Anweisungen zu wählen, wenn diese vorgeschlagen werden.

    Version mit Platzhalter

    Der Zugriff erfolgt durch Klicken auf Glob, wie im nächsten Schritt besch­rieben. Weitere Informationen zur Auflösung der Syntax finden Sie unter Abschnitt 3.6, „Pfadnamen und Platzhalter“ (↑ Novell AppArmor 2.0-Administrationshandbuch ).

    Tatsächlicher Pfadname

    Dies ist der buchstabengetreu angegebene Pfad, auf den das Programm zugreifen muss, damit es reibungslos ablaufen kann.

  6. Nach der Wahl des Pfadnamens oder der include-Datei müssen Sie diese als einen Eintrag im Novell AppArmor-Profil festlegen, indem Sie auf Allow (Erlauben) oder Deny (Ablehnen) klicken. Wenn Sie nicht mit dem angezeigten Eintrag des Verzeichnispfads einverstanden sind, können Sie ihn durch Glob oder Edit (Bearbeiten) ändern.

    Die folgenden Optionen sind für die Verarbeitung der Lernmodus-Einträge und die Erstellung des Profils verfügbar:

    Enter drücken

    Erlaubt Zugriff auf den ausgewählten Verzeichnispfad.

    Allow (Erlauben)

    Erlaubt Zugriff auf die angegebenen Verzeichnispfad-Einträge. Novell AppArmor schlägt Dateizugriffsberechtigung vor. Weitere Informationen finden Sie unter Abschnitt 3.7, „Modi für Dateizugriffsberechtigungen“ (↑ Novell AppArmor 2.0-Administrationshandbuch ).

    Deny (Ablehnen)

    Hindert das Programm am Zugriff auf die angegebenen Verzeichnispfad-Einträge. Novell AppArmor geht dann zum nächsten Ereignis weiter.

    Neu

    Fordert Sie auf, Ihre eigene Regel für dieses Ereignis einzugeben. Sie können eine beliebige Form eines regulären Ausdrucks angeben. Wenn der eingegebene Aus­druck keine Lösung für das Ereignis darstellt, das die Frage ausgelöst hat, bittet Novell AppArmor um eine Bestätigung und gestattet Ihnen, den Ausdruck erneut einzugeben.

    Glob

    Durch Klicken auf diese Option wird der Verzeichnispfad (durch Verwendung von Platzhaltern) so geändert, dass er alle Dateien im vorgeschlagenen Eintragsverzeichnis umfasst. Durch Doppelklicken auf diese Option wird der Zugriff auf alle Dateien und Unterverzeichnisse unterhalb des angezeigten Verzeichnisses gewährt.

    Weitere Informationen zu Syntax mit Platzhaltern finden Sie unter Abschnitt 3.6, „Pfadnamen und Platzhalter“ (↑ Novell AppArmor 2.0-Administrationshandbuch ).

    Glob mit Erw

    Durch Klicken auf diese Option wird der ursprüngliche Verzeichnispfad unter Beibehaltung der Dateinamenerweiterung geändert. Beispiel: /etc/apache2/file.ext wird zu /etc/apache2/*.ext und der Platzhalter (Sternchen) wird anstelle des Dateinamens hinzugefügt. Damit kann das Programm auf alle Dateien, die mit der Erweiterung .ext enden, im vorgeschlagenen Verzeichnis zugreifen. Durch Doppelklicken auf diese Option wird der Zugriff auf alle Dateien (mit der angegebenen Erweiterung) und Unterverzeichnisse unterhalb des angezeigten Verzeichnisses gewährt.

    Bearbeiten

    Ermöglicht die Bearbeitung der ausgewählten Zeile. Die neue bearbeitete Zeile erscheint am Ende der Liste.

    Abbrechen

    Bricht logprof ab, verwirft alle bereits eingegebenen Regeländerungen und belässt die Profile unverändert.

    Beenden

    Beendet logprof, speichert alle bereits eingegebenen Regeländerungen und ändert alle Profile entsprechend.

  7. Um Ihr Profil mithilfe von vim anzuzeigen und zu bearbeiten, geben Sie vim /etc/apparmor.d/profilname in ein Terminalfenster ein. Wenn Sie beim Bearbeiten eines Novell AppArmor-Profils in vim Syntaxfarben aktivieren möchten, verwenden Sie die Befehle :syntax on und dann :set syntax=apparmor. Weitere Informationen zu vim und Syntaxfarben finden Sie unter Abschnitt 3.5.3.8, „apparmor.vim“ (↑ Novell AppArmor 2.0-Administrationshandbuch ).

3.5.3.5. logprof

logprof ist ein interaktives Werkzeug zur Anzeige der Ausgabe des Lern- und Meldungsmodus in den Syslog-Einträgen und der anschließenden Generierung von neuen Einträgen in Novell AppArmor-Sicherheitsprofilen.

Wenn Sie logprof ausführen, beginnt es, die Protokolldateien zu scannen, die im Lern- oder Meldungsmodus erzeugt wurden, und wenn Sicherheitsereignisse vorhanden sind, die nicht durch den bestehenden Profilsatz abgedeckt werden, schlägt es Änderungen des Profils vor. Der Lern- oder Meldungsmodus verfolgt das Programmverhalten und zeichnet es in Syslog auf. logprof verwendet diese Information zur Beobachtung des Programmverhaltens.

Wenn ein eingeschränktes Programm ein anderes Programm mit "fork" und "exec" ausführt, erkennt logprof dies und fragt den Benutzer, welcher Ausführungsmodus beim Start des untergeordneten Prozesses verwendet werden soll. Die folgenden Ausführungsmodi sind Optionen für das Starten des untergeordneten Prozesses: ix, px und ux. Wenn für den untergeordneten Prozess ein separates Profil existiert, ist px die Standardauswahl. Wenn keines existiert, wird standardmäßig ix für das Profil angegeben. An untergeordneten Prozessen mit separaten Profilen wird autodep ausgeführt und sie werden in Novell AppArmor geladen, falls dieses läuft.

Beim Beenden von logprof werden Profile mit den Änderungen aktualisiert. Wenn das AppArmor-Modul ausgeführt wird, werden die aktualisierten Profile neu geladen. Und wenn Prozesse, die Sicherheitsereignisse generiert haben, noch im Null-Complain-Profil (ohne Meldungen) ausgeführt werden, werden diese Prozesse so eingestellt, dass sie unter ihren korrekten Profilen laufen.

Sie führen logprof aus, indem Sie logprof in ein Terminalfenster eingeben, während Sie als root angemeldet sind. Sie können auch die folgenden Optionen für logprof verwenden.

logprof -d /path/to/profile/directory/

Gibt den vollständigen Pfad zu den Profilen an, wenn sich die Profile nicht im Standardverzeichnis /etc/apparmor.d/ befinden.

logprof -f /path/to/logfile/

Gibt den vollständigen Pfad zu der Protokolldatei an, wenn sich die Protokolldatei nicht im Standardverzeichnis /var/log/messages befindet.

logprof -m "string marker in logfile"

Markiert den Anfangspunkt, ab dem logprof im Systemprotokoll nachsieht. logprof ignoriert alle Ereignisse im Systemprotokoll, die vor der angegebenen Marke liegen. Wenn die Marke Leerzeichen enthält, muss sie mit Hochkommas umgeben werden, damit sie korrekt funktioniert. Beispiel: logprof -m e2ff78636296f16d0b5301209a04430d

logprof scannt das Protokoll und fragt Sie, wie jedes protokollierte Ereignis behandelt werden soll. Jede Frage präsentiert eine nummerierte Liste von Novell AppArmor-Regeln, die durch Drücken der Zahl des jeweiligen Listeneintrags hinzugefügt werden können.

Standardmäßig sucht logprof Profile in /etc/apparmor.d/ und scannt das Protokoll in /var/log/messages. Es reicht also in vielen Fällen, logprof als root auszuführen, um das Profil zu erstellen.

Gelegentlich müssen jedoch archivierte Protokolldateien durchsucht werden, z. B. wenn die Ausführungsdauer des Programms das Protokollrotationsfenster überschreitet (wenn die Protokolldatei archiviert und eine neue Protokolldatei begonnen wird). In diesem Fall können Sie zcat -f `ls -1tr /var/log/messages*` | logprof -f - eingeben.

3.5.3.6. logprof-Beispiel 1

Nachfolgend erhalten Sie ein Beispiel dafür, wie logprof die Situation behandelt, wenn httpd2-prefork auf die Datei /etc/group zugreift. Das Beispiel verwendet [], um die Standardoption anzugeben.

In diesem Beispiel ist der Zugriff auf /etc/group Teil von httpd2-prefork, das auf Namensdienste zugreift. Die passende Antwort lautet 1, was einen vordefinierten Satz von Novell AppArmor-Regeln abruft. Wenn Sie 1 wählen, um das Namensdienst-Paket als #include aufzunehmen, werden alle zukünftigen Fragen hinsichtlich DNS-Lookups erledigt und das Profil wird weniger labil, d. h.. — Änderungen an der DNS-Konfiguration und am zugehörigen Namensdienst-Profilpaket brauchen nur einmal zu erfolgen, ohne dass viele Profile überarbeitet werden müssen.

Profile:  /usr/sbin/httpd2-prefork
Path:     /etc/group
New Mode: r

[1 - #include <abstractions/nameservice>]
 2 - /etc/group
[(A)llow] / (D)eny / (N)ew / (G)lob / Glob w/(E)xt / Abo(r)t / (F)inish

Wählen Sie eine der folgenden Antworten:

Enter drücken

Erlaubt Zugriff auf den ausgewählten Verzeichnispfad.

Allow (Erlauben)

Erlaubt Zugriff auf die angegebenen Verzeichnispfad-Einträge. Novell AppArmor schlägt Dateizugriffsberechtigung vor. Weitere Informationen dazu finden Sie unter Abschnitt 3.7, „Modi für Dateizugriffsberechtigungen“ (↑ Novell AppArmor 2.0-Administrationshandbuch ).

Deny (Ablehnen)

Hindert das Programm am Zugriff auf die angegebenen Verzeichnispfad-Einträge. Novell AppArmor geht dann zum nächsten Ereignis weiter.

Neu

Fordert Sie auf, Ihre eigene Regel für dieses Ereignis einzugeben. Sie können eine beliebige Form eines regulären Ausdrucks angeben. Wenn der eingegebene Aus­druck keine Lösung für das Ereignis darstellt, das die Frage ausgelöst hat, bittet Novell AppArmor um eine Bestätigung und gestattet Ihnen, den Ausdruck erneut einzugeben.

Glob

Durch Klicken auf diese Option wird der Verzeichnispfad (durch Verwendung von Platzhaltern) so geändert, dass er alle Dateien im vorgeschlagenen Eintragsverzeichnis umfasst. Durch Doppelklicken auf diese Option wird der Zugriff auf alle Dateien und Unterverzeichnisse unterhalb des angezeigten Verzeichnisses gewährt.

Weitere Informationen zur Syntax mit Platzhaltern finden Sie unter Abschnitt 3.6, „Pfadnamen und Platzhalter“ (↑ Novell AppArmor 2.0-Administrationshandbuch ).

Glob mit Erw

Durch Klicken auf diese Option wird der ursprüngliche Verzeichnispfad unter Beibehaltung der Dateinamenerweiterung geändert. Beispiel: /etc/apache2/file.ext wird zu /etc/apache2/*.ext und der Platzhalter (Sternchen) wird anstelle des Dateinamens hinzugefügt. Damit kann das Programm auf alle Dateien, die mit der Erweiterung .ext enden, im vorgeschlagenen Verzeichnis zugreifen. Durch Doppelklicken auf diese Option wird der Zugriff auf alle Dateien (mit der angegebenen Erweiterung) und Unterverzeichnisse unterhalb des angezeigten Verzeichnisses gewährt.

Bearbeiten

Ermöglicht die Bearbeitung der ausgewählten Zeile. Die neue bearbeitete Zeile erscheint am Ende der Liste.

Abbrechen

Bricht logprof ab, verwirft alle bereits eingegebenen Regeländerungen und belässt die Profile unverändert.

Beenden

Beendet logprof, speichert alle bereits eingegebenen Regeländerungen und ändert alle Profile entsprechend.

3.5.3.7. logprof-Beispiel 2

In einem Beispiel aus der Profilerstellung für vsftpd wird diese Frage angezeigt:

Profile:  /usr/sbin/vsftpd
Path:     /y2k.jpg
New Mode: r

[1 - /y2k.jpg]

(A)llow / [(D)eny] / (N)ew / (G)lob / Glob w/(E)xt / Abo(r)t / (F)inish

Diese Frage umfasst mehrere interessante Elemente. Beachten Sie zunächst, dass vsftpd am Beginn der Struktur nach einem Pfadeintrag fragt, obwohl vsftpd in SUSE Linux standardmäßig FTP-Dateien aus /srv/ftp bereitstellt. Das liegt daran, dass httpd2-prefork Chroot verwendet und Novell AppArmor für den Teil des Codes im Chroot-Jail Dateizugriffe in Bezug auf die Chroot-Umgebung sieht und nicht im globalen absoluten Pfad.

Der zweite interessante Punkt ist, dass Sie FTP-Lesezugriff auf alle JPEG-Dateien im Verzeichnis gewähren sollten. Sie könnten also Glob mit Erw und den vorgeschlagenen Pfad von /*.jpg verwenden. Dann würden alle vorherigen Regeln verworfen, die Zugriff auf einzelne .jpg-Dateien gewährt haben, und zukünftige Fragen hinsichtlich des Zugriffs auf .jpg-Dateien würden unterbunden.

Zuletzt sollten Sie einen allgemeineren Zugriff auf FTP-Dateien gewähren. Wenn Sie im letzten Eintrag Glob wählen, ersetzt logprof den vorgeschlagenen Pfad /y2k.jpg durch /*. Sie können sogar noch mehr Zugriff auf die ganze Verzeichnisstruktur gewähren, indem Sie die Pfadoption New (Neu) verwenden und /**.jpg eingeben (wodurch Zugriff auf alle .jpg-Dateien in der ganzen Verzeichnisstruktur gewährt wird) oder /** (wodurch Zugriff auf alle Dateien in der ganzen Verzeichnisstruktur gewährt wird).

Bei Obigem handelt es sich um Lesezugriffe. Schreibzugriffe sind ähnlich, jedoch ist es empfehlenswert, reguläre Ausdrücke für den Schreibzugriff zurückhaltender zu verwenden.

Der Umgang mit Ausführungszugriffen ist komplexer. Sie müssen entscheiden, welche der drei Arten von Ausführungsberechtigungen Sie gewähren möchten:

inherit (ix)

Das untergeordnete Programm erbt das Profil des übergeordneten Programms und läuft mit denselben Zugriffsberechtigungen wie das übergeordnete Programm. Dieser Modus ist nützlich, wenn ein eingeschränktes Programm ein anderes eingeschränktes Programm aufrufen muss, ohne die Berechtigungen des Zielprofils zu erhalten oder die Berechtigungen des aktuellen Profils zu verlieren. Dieser Modus wird häufig benutzt, wenn das untergeordnete Programm eine Hilfsanwendung ist, wie der /usr/bin/mail-Client, der das Programm less zur seitenweisen Ausgabe verwendet, oder der Mozilla-Webbrowser, der das Acrobat-Programm zur Anzeige von PDF-Dateien nutzt.

profile (px)

Das untergeordnete Programm läuft mit seinem eigenen Profil ab, das in den Kernel geladen werden muss. Wenn das Profil nicht vorhanden ist, schlagen Ausführungsversuche des untergeordneten Programms mit abgelehnter Berechtigung fehl. Dies ist besonders nützlich, wenn das übergeordnete Programm einen globalen Dienst aufruft, z. B. DNS-Lookups oder das Senden von Mail über den MTA Ihres Systems.

unconfined (ux)

Das untergeordnete Programm läuft uneingeschränkt ohne ein Novell AppArmor-Profil für die ausgeführte Ressource.

Im folgenden Beispiel wird für den Mailclient /usr/bin/mail ein Profil erstellt und logprof hat festgestellt, dass /usr/bin/mail als Hilfsanwendung /usr/bin/less ausführt, um lange Mail-Nachrichten „seitenweise“ auszugeben. Daher präsentiert es diese Eingabe-Aufforderung:

/usr/bin/nail -> /usr/bin/less
(I)nherit / (P)rofile / (U)nconstrained / (D)eny
[Tip]Tipp

Die aktuelle ausführbare Datei für /usr/bin/mail ist /usr/bin/nail, wobei es sich um keinen Schreibfehler handelt.

/usr/bin/less scheint ein einfaches Programm zum Abrollen von Text zu sein, der länger als eine Bildschirmseite ist, wofür /usr/bin/mail es auch verwendet. Jedoch ist less tatsächlich ein umfangreiches und leistungsstarkes Programm, das viele andere Hilfsanwendungen nutzt, wie etwa tar und rpm.

[Tip]Tipp

Führen Sie less an einem Tarball oder einer RPM-Datei aus, dann sehen Sie das Inhaltsverzeichnis dieser Container.

Sie sollten rpm beim Lesen von Mail-Nachrichten nicht automatisch ausführen (das führt direkt zu Virusangriffen im Stil von Microsoft* Outlook, da rpm Systemprogramme installieren und ändern kann), daher entscheiden Sie sich in diesem Fall am besten für Inherit (Erben). Das Programm less wird dann in diesem Kontext unter dem Profil für /usr/bin/mail ausgeführt. Das hat zwei Folgen:

  • Sie müssen alle grundlegenden Dateizugriffe für /usr/bin/less dem Profil für /usr/bin/mail hinzufügen.

  • Sie können vermeiden, die Hilfsanwendungen wie tar und rpm dem Profil von /usr/bin/mail hinzuzufügen. Wenn dann /usr/bin/mail in diesem Kontext /usr/bin/mail/less ausführt, ist das Programm less viel weniger gefährlich als es ohne Novell AppArmor-Schutz wäre.

Unter anderen Umständen sollten Sie stattdessen die Option Profil verwenden. Das hat zwei Auswirkungen auf logprof:

  • Die in das Profil geschriebene Regel ist px, was den Wechsel zum eigenen Profil des untergeordneten Programms erzwingt.

  • logprof konstruiert ein Profil für das untergeordnete Programm und beginnt dessen Erstellung auf die gleiche Weise wie das übergeordnete Profil, indem es Ereignisse für den untergeordneten Prozess in das Profil für das untergeordnete Programm schreibt und dem logprof-Benutzer dieselben Fragen wie oben stellt.

Zuletzt sollten Sie dem untergeordneten Prozess sehr leistungsstarken Zugriff gewähren, indem Sie Unconfined (Uneingeschränkt) angeben. Dies schreibt ux in das Profil des übergeordneten Programms. Wenn also das untergeordnete Programm abläuft, wird es ohne jegliches Novell AppArmor-Profil ausgeführt. Das bedeutet eine Ausführung ohne jeglichen Schutz und sollte nur verwendet werden, wenn unbedingt nötig.

3.5.3.8. apparmor.vim

Eine Syntaxfarbgebungsdatei für den Texteditor vim markiert verschiedene Funktionen eines Novell AppArmor-Profils mit Farben. Durch die Verwendung von vim und dem Novell AppArmor-Syntaxmodus für vim können Sie die semantischen Implikationen Ihrer Profile anhand von farblichen Markierungen sehen. Verwenden Sie vim, um Ihr Profil anzuzeigen und zu bearbeiten, indem Sie "vim" in ein Terminalfenster eingeben.

Wenn Sie beim Bearbeiten eines Novell AppArmor-Profils in vim Syntaxfarben aktivieren möchten, verwenden Sie die Befehle :syntax on und dann :set syntax=apparmor. Alternativ können Sie diese Zeilen in Ihre Datei ~/.vimrc eingeben:

syntax on
set modeline
set modelines=5

Wenn Sie diese Funktion aktivieren, färbt vim die Zeilen des Profils für Sie:

Blau

#include-Zeilen, die andere Novell AppArmor-Regeln abrufen, und Kommentare, die mit # beginnen

Weiß

Zeilen für normalen Lesezugriff

Braun

Funktionsanweisungen und Meldungsflags

Gelb

Zeilen, die Schreibzugriff gewähren

Grün

Zeilen, die Ausführungsberechtigung gewähren (ix oder px)

Rot

Zeilen, die uneingeschränkten Zugriff gewähren (ux)

Roter Hintergrund

Syntaxfehler, die nicht korrekt in die AppArmor-Module geladen werden

[Note]Anmerkung

Bei der Verwendung dieser Zeilen in Ihrer .vimrc-Datei besteht ein Sicherheitsrisiko, da sie vim veranlassen, dem Syntaxmodus in den Dateien zu vertrauen, die Sie bearbeiten. Das kann einem Angreifer ermöglichen, Ihnen eine Datei zu senden, die mit vim geöffnet wird und schädliche Aktionen ausführt.

Verwenden Sie die Manualpages apparmor.vim und vim und die Syntax :help im vim-Editor, um weitere vim-Hilfe zur Syntaxmarkierung zu erhalten. Die Novell AppArmor-Syntax wird in /usr/share/vim/current/syntax/apparmor.vim gespeichert.

3.5.3.9. Unconfined (Uneingeschränkt)

Der Befehl unconfined prüft offene Netzwerkports auf Ihrem System, vergleicht diese mit dem auf dem System geladenen Profilsatz und meldet Netzwerkdienste, die über kein Novell AppArmor-Profil verfügen. Er benötigt root-Berechtigung und darf nicht durch ein Novell AppArmor-Profil eingeschränkt sein.

unconfined muss als root ausgeführt werden, um den Link auf das im Prozess ausgeführte Programm aus dem proc-Dateisystem abzurufen. Dieses Programm hat Probleme bei den folgenden zeitabhängigen Konflikten:

  • Ein gelöschter Eintrag für eine ausführbare Datei wird falsch behandelt.

  • Eine ausführbare Datei, die vor dem Laden eines Novell AppArmor-Profils gestartet wurde, wird nicht in der Ausgabe angezeigt, obwohl sie ohne Einschränkung ausgeführt wird.

  • Ein Prozess, der zwischen netstat(8) und weiteren Prüfungen "stirbt", wird falsch behandelt.

[Note]Anmerkung

Dieses Programm listet nur Prozesse auf, die TCP und UDP verwenden. Kurz gesagt eignet sich dieses Programm nicht zum Nachweis von Abläufen und ist nur als Hilfe dafür gedacht, Profile für alle im Netzwerk zugänglichen Prozesse im Labor zu erstellen.

Weitere Informationen über die Theorie und Sicherheit von Novell AppArmor finden Sie in den folgenden Arbeiten:

SubDomain: Parsimonious Server Security (Sparsame Serversicherheit) von Crispin Cowan, Steve Beattie, Greg Kroah-Hartman, Calton Pu, Perry Wagle und Virgil Gligor

Beschreibt die anfängliche Entwicklung und Implementierung von Novell AppArmor. Herausgegeben in den Veröffentlichungen der USENIX LISA Conference, Dezember 2000, New Orleans, LA.

Diese Arbeit ist nun veraltet und beschreibt Syntax und Funktionen, die sich vom aktuellen Novell AppArmor-Produkt unterscheiden. Sie sollte nur als wissenschaftlicher Hintergrund und nicht für technische Dokumentation verwendet werden.

Defcon Capture the Flag: Defending Vulnerable Code from Intense Attack (Verteidigung von anfälligem Code vor intensiven Angriffen) von Crispin Cowan, Seth Arnold, Steve Beattie, Chris Wright und John Viega

Eine gute Anleitung für den strategischen und taktischen Einsatz von Novell AppArmor zur Lösung ernster Sicherheitsprobleme innerhalb kürzester Zeit. Herausgegeben in den Veröffentlichungen der DARPA Information Survivability Conference und Expo (DISCEX III), April 2003, Washington, DC.