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
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.phpStarten 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. Falls Sie ein anderes Bild erhalten, kann dies drei Gründe haben:
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 restartWenn Sie nun erneut die phpSysInfo-Webseite aufrufen, sollten Sie sehr viele Fehlermeldungen sehen (Abb. 9.11). 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).
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).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-GlobbingsDas 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