Erzeugen eines Subprofils (Hat) mit Yast

AppArmor verfügt über die sehr interessante Funktion des Subprofils. AppArmor bezeichnet dies als Hat. Ein Prozess wird von AppArmor entsprechend einem Profil überwacht. Für bestimmte Funktionen kann ein Subprofil verwendet werden. Dieses wird als Hat bezeichnet. Dieser Hat kann mehr oder weniger Funktionen als das übergeordnete Profil aufweisen.

Im diesem Kapitel wollen wir diese Funktion für den Apache Web-Server nutzen. Hierzu soll für eine PHP-Applikation ein Hat erzeugt werden. Dadurch soll diese PHP-Applikation nur die durch das Profil erlaubten Funktionen nutzen dürfen.

Um diese Funktion zu nutzen, muss die Applikation (Apache) speziell an AppArmor angepasst worden sein. Aktuell ist das nur für den Apache Web-Server der Fall. Auf der AppArmor Homepage gibt es aber auch schon ein pam_apparmor-PAM-Modul, welches für alle PAM-fähigen Programme ein benutzerabhängiges Subprofil aktivieren kann. Dieses PAM-Modul wird in dem Abschnitt 12.2.2 besprochen. Der Webserver ist insbesondere interessant, da bei Webapplikationen aus Geschwindigkeitsgründen die Skripte häufig direkt von dem Web-Server ausgeführt werden. Hierfür besitzt der Apache zum Beispiel die Module mod_php und mod_perl, die direkt PHP-Skripte und Perl-Skripte ausführen können. Wenn diese Skripte nun mehr oder weniger Privilegien benötigen, als der Web-Server selbst, ist das nur mit einem Subprofil möglich.

Der Apache kann ein Subprofil auswählen in Abhängigkeit

Die Funktionen des Virtualhosts werden in einem späteren Kapitel erläutert. Hier werden wir zunächst Subprofile in Abhängigkeit der URI erzeugen und diese anschließend auf ein gesamtes Verzeichnis umstellen.

Stellen Sie zunächst sicher, dass sowohl der Apache-2.x-Web-Server als auch die Pakete apache2_mod_php5 und apache2_mod_apparmor installiert wurden. Achten Sie darauf, dass diese Namen der SUSE Linux 10.1 Distribution entnommen wurden. Ältere und neuere Distributionen verwenden hier möglicherweise andere Namen, wie apache2_mod_subdomain oder apache2_mod_changehat.

Um nun für dieses Kapitel eine sinnvolle aber auch übersichtliche Webapplikation einzusetzen, habe ich phpSysInfo ausgewählt. PhpSysInfo ist eine Webapplikation, die Systeminformationen übersichtlich in einer Webseite darstellt. Sie können die Webapplikation von Sourceforge herunterladen (http://phpsysinfo.sourceforge.net). Wenn Sie keinen Internetzugang besitzen, können Sie auch das Paket von der CD aus dem Verzeichnis /Software nutzen.

Installieren Sie zunächst die Software, indem Sie das Quelltextpaket extrahieren und in die DocumentRoot des Apache 2.x Web-Servers kopieren. Für unsere Zwecke genügt es für die Konfiguration, die vorbereitete Datei umzubenennen. Sie können diese Datei natürlich anpassen. Für die Demonstration in diesem Kapitel ist das jedoch nicht erforderlich.

# tar xzf phpsysinfo-2.5.2-rc3.tar.gz
# mv phpsysinfo /srv/www/htdocs/
# cd /srv/www/htdocs/phpsysinfo
# mv config.php.new config.php
Starten Sie nun den Apache-2.x-Web-Server. Wenn Sie nun in einem Browser die URL http://localhost/phpsysinfo eingeben, sollte ein Bild wie in der Abbildung 9.10 erscheinen.
Abbildung: PhpSysInfo zeigt Informationen über den Zustand des Systems an.
Image phpsysinfo1
Falls Sie ein anderes Bild erhalten, kann dies drei Gründe haben:
  1. Ihr Web-Server läuft nicht. Prüfen Sie in den Protokollen, ob Sie tatsächlich den Web-Server gestartet haben.
  2. Ihr Browser verbindet sich nicht mit Ihrem Web-Server. Prüfen Sie, ob der Browser einen Proxy benutzt und deaktivieren Sie den Proxy für den Zielrechner Localhost.
  3. AppArmor überwacht bereits den Apache Web-Server. Sie sehen ein Bild wie in Abbildung 9.11. Auf einer SUSE Linux 10.1 Distribution wird das Apache-AppArmor-Profil per Default nicht geladen. Lesen Sie in diesem Fall einfach weiter.
Nachdem wir nun wissen, wie phpSysInfo bei erfolgreicher Ausführung die Informationen anzeigt, werden wir nun die AppArmor-Überwachung für den Apache 2.x aktivieren.

Kopieren Sie hierzu das Profil in das entsprechende Verzeichnis, aktivieren Sie es mit enforce und starten Sie den Apache erneut:

# cp /etc/apparmor/profiles/extras/usr.sbin.httpd2-prefork /etc/apparmor.d/
# enforce /usr/sbin/httpd2-prefork
Setting /usr/sbin/httpd2-prefork to enforce mode.
# rcapache2 restart
Wenn Sie nun erneut die phpSysInfo-Webseite aufrufen, sollten Sie sehr viele Fehlermeldungen sehen (Abb. 9.11).
Abbildung 9.11: Wenn AppArmor aktiv ist, werden viele Zugriffe von PhpSysInfo verhindert.
Image phpsysinfo2
Um nun ein Subprofil für diese Webapplikation zu erzeugen, das phpSysInfo mit den nötigen Berechtigungen für die Ausführung versorgt, gehen wir zunächst genauso vor, wie bereits in dem letzten Kapitel. Rufen Sie Yast2 auf und wählen Sie dort im Menü Novell AppArmor den Assistent zum Hinzufügen von Profilen aus. Wir wählen bewusst nicht den Assistenten zum Aktualisieren von Profilen aus. Auch der jetzt gewählte Assistent kann existierende Profile aktualisieren. Dabei ist es aber möglich, die Aktualisierung auf ein bestimmtes Profil zu beschränken. Der zweite Assistent aktualisiert alle Profile!

Bei dem Assistenten geben Sie nun als Applikation /usr/sbin/httpd2-prefork an. Benutzen Sie nun wieder die Applikation. Die Web-Applikation sollte nun im wesentlichen funktionieren, da jetzt wieder alle Zugriffe erlaubt aber auch protokolliert werden. Nachdem Sie die Webapplikation genutzt haben, wählen Sie wieder im Assistenten Scan system log. Nun wird der Assistent Ihnen die erfolgten Zugriffe präsentieren und Sie müssen entscheiden ob der Zugriff erlaubt ist. Hierbei sollte der Assistent Ihnen sehr früh anbieten, einen zusätzlichen Hat hinzuzufügen. Bestätigen Sie das mit Add Requested Hat. Hiermit wird nun ein neues Profil für diese URI eröffnet (Abbildung 9.12).

Abbildung: Yast bietet an, einen neuen Hat für die PHP-Applikation zu erzeugen.
Image phpsysinfo_hat
Alle weiteren Zugriffe werden nun, nach einer Bestätigung durch Sie, diesem Profil zugefügt. Achten Sie darauf, dass der Name des bearbeiteten Profils sich geändert hat. Es ist nun /usr/sbin/httpd2-preforkˆ/phpsysinfo/ (Abbildung 9.13).
Abbildung: AppArmor bittet um die Bestätigung, in dem Hat Befehle (lspci) ausführen zu dürfen.
Image phpsysinfo_lspci

Damit die von phpSysInfo aufgerufenen externen Programme unter der Kontrolle von AppArmor ausgeführt werden, wählen Sie für alle diese Zugriffe auf externe Kommandos Inherit aus. Falls eine Datei gelesen werden muss, wählen Sie Allow. Eine Ausnahme ist der Befehl mount. Dieser Befehl muss unconfined ausgeführt werden. Wenn Sie dieses nicht möchten, wählen Sie Deny und müssen auf diese Funktion in phpSysInfo verzichten. Wenn Sie Unconfined auswählen, erhalten Sie ein Warnmeldung, die Sie auf die möglichen Gefahren hinweist.

Wenn Sie alle Fragen beantwortet haben und den Assistenten beenden, sollte die Web-Applikation wieder so funktionieren, wie vor der Aktivierung von AppArmor. Der einzige Unterschied ist die Tatsache, dass die Webapplikation nun von AppArmor überwacht wird und keine zusätzlichen Funktionen ausüben kann, die von einem Angreifer für einen Einbruch missbraucht werden könnten.

Wenn die Applikation noch nicht funktioniert und scheinbar allgemeine PHP-Fehler auftreten, dann müssen Sie möglichweise noch das Apache-Profil selbst anpassen. Rufen Sie erneut den Assistenten auf und geben Sie wieder den kompletten Pfad /usr/sbin/httpd2-prefork an. Starten Sie nun den Web-Server neu und betätigen Sie direkt anschließend den Button Scan system logs for AppArmor events. Es fehlten wahrscheinlich in dem Profil noch die Zugriffe auf die PHP-Konfigurationsdateien. Diese fügen Sie hiermit hinzu. Jetzt sollte die Web-Applikation fehlerfrei laufen.

Das erzeugte Subprofil befindet sich ebenfalls in der Datei /etc/apparmor.d/usr.sbin.httpd2-prefork. Sie finden es am unteren Ende der Datei:

...

  ^/phpsysinfo/ {
    #include <abstractions/base>
    #include <abstractions/bash>
    #include <abstractions/consoles>

    /bin/bash ixr,
    /bin/df ixr,
    /bin/mount ux,
    /etc/SuSE-release r,
    /lib/ld-2.4.so ixr,
    /proc/** r,
    /sbin/lspci ixr,
    /srv/www/htdocs/phpsysinfo/** r,
    /sys/** r,
    /usr/bin/lsscsi ixr,
    /usr/bin/who ixr,
    /usr/sbin/lsusb ixr,
    /var/log/apache2/access_log w,
    /var/log/apache2/error_log w,
    /var/run/nscd/socket w,
  }

...
Die Subprofile beginnen in Ihrem Namen mit dem ^. Falls Ihr Subprofil einen anderen Aufbau hat, wundern Sie sich nicht. Der Aufbau hängt stark von dem Einsatz des Assistenten ab und der Wahl der File-Globbings[*]. Wahrscheinlich ist zu Beginn Ihr Profil wesentlich größer. Wenn Sie mehr Übung im Umgang mit dem Assistenten bekommen, werden Sie auch die Dialoge so beantworten, dass die entstehenden Profile kompakter werden. Natürlich können Sie auch anschließend das Profil editieren und mit rcapparmor reload die Profile neu laden.

Das Profil wird nun geladen, sobald als URI /phpsysinfo/ im Browser ausgewählt wird.

Eine andere und möglicherweise einfachere Variante der Administration der Subprofile in Apache wird in 12.2.1 beschrieben.

Ralf Spenneberg 2007-11-13