Apache 2.0 und mod_apparmor

Viele Websites basieren heute auf Webapplikationen, die den Inhalt dynamisch unter Einsatz von serverbasierten Skriptsprachen und Datenbanken erzeugen. Bei dem Einsatz des Apache Webservers wünschen sich viele Administratoren Möglichkeiten, um die einzelnen Skripte voneinander isolieren zu können. Jedes Skript soll möglichst nur die benötigten Privilegien erhalten. Der Apache selbst bietet hierfür jedoch keine Funktionen. Jedes Skript verfügt über sämtliche Privilegien, die auch der Apache-Prozess selbst besitzt. Mit AppArmor kann dieses Problem zunächst für externe Skripte, die über den CGI[*]-Mechanismus aufgerufen werden, gelöst werden. Jedoch wird dieser Mechanismus auf den meisten Webservern aus Geschwindigkeitsgründen nicht mehr eingesetzt. Anstelle von extern aufgerufenen Skript-Interpretern und CGI-Skripten werden die Skript-Interpreter in dem Apache in Form von Modulen eingebettet. Übliche Module sind mod_php, mod_perl und mod_python. Der aufwändige Start des Interpreters fällt somit weg. Außerdem können bereits aufgerufene Skripte in einer vorkompilierten Form zwischengespeichert werden, so dass auch der Schritt der Kompilierung zum Beispiel bei Perl wegfällt. Dies beschleunigt die Ausführung, aber verlangt bei der Überwachung mit AppArmor einen anderen Ansatz.

Hierfür wurde das Modul mod_apparmor für den Apache 2.0 geschaffen. Wird dieses Modul von dem Apache 2.0 geladen, so versucht der Apache 2.0 Webserver für jede URI (z.B. /webapp/index.php) in ein entsprechendes Subprofil zu wechseln. Existiert kein Subprofil mit dem Namen, verwendet der Apache das Subprofil mit dem Namen DEFAULT_URI. Die Erzeugung eines derartigen Profils wurde in 9.6 beschrieben.

Jedoch gibt es auch die Möglichkeit, ein Subprofil mit einem beliebigen Namen zu erzeugen und dieses für bestimmte Teile im Webserver zu aktivieren. Hierzu stellt das Modul mod_apparmor zwei Optionen zur Verfügung: AAHatName und AADefaultHatName. Bei älteren Versionen heissen diese beiden Optionen ImmHatName und ImmDefaultHatName.

Mit der Option AADefaultHatName können Sie ein Default-Subprofil definieren. Dieses kann für jeden virtuellen Host und den eigentlichen Apache-Server unterschiedlich konfiguriert werden. Jeder virtuelle Host kann also ein eigenes Default-Subprofil besitzen. Existiert das angegebene Subprofil nicht, verhält sich der Apache so, als ob die Direktive nicht gesetzt sei. Das bedeutet, er sucht zunächst nach einem Profil entsprechend der URI des Zugriffes und verwendet, falls auch ein derartiges nicht existiert, das Subprofil DEFAULT_URI.

Das mit dem Parameter AADefaultHatName gewählte Subprofil kann dann mit dem Parameter AAHatName überschrieben werden. Damit können Sie für bestimmte Bereiche innerhalb des DocumentRoot des Web-Server oder des virtuellen Hosts vom AADefaultHatName abweichende Subprofile aktivieren. Der Apache Web-Server bietet hierfür die Parameter Location und Directory. Wenn Sie den Ort als absoluten Pfad im Linux-Verzeichnisbaum angeben möchten, verwenden Sie die Option Directory. Falls Sie den Ort in Abhängigkeit der URL angeben möchten, nutzen Sie Location. Normalerweise verwenden Sie diese Optionen, um den Zugriff auf einen bestimmten Bereich zu beschränken. Eine typische Konfiguration sieht folgendermaßen aus:

<Directory /srv/www/htdocs/webapp>
  Order Allow,Deny
  Allow from All
  Deny from 192.168.0.0/24

  Options None
</Directory>

<Location /server-status>
  SetHandler server-status
  Order Allow,Deny
  Allow from 10.0.0.5
</Location>
Achtung. Das mod_apparmor-Modul ist nicht in der Lage Vermischungen der Directory- und Location-Direktiven sauber aufzulösen. Daher sollten Sie in Ihrer Konfiguration entweder nur Directory oder Location verwenden.

Um die Funktion in dem Beispiel aus dem Abschnitt 9.6 zu sehen, stoppen Sie den Apache und AppArmor. Editieren Sie anschließend das AppArmor-Profil für den Apache (/etc/apparmor.d/usr.sbin.httpd2-prefork) und benennen Sie das in 9.6 erzeugte Subprofil um in ^info. Damit nun dieses Profil geladen wird, erzeugen Sie in dem Verzeichnis /etc/httpd2/conf.d eine neue Datei sysinfo.conf. Alle Dateien mit der Endung .conf in diesem Verzeichnis werden von dem Apache automatisch bei seinem Start geladen. Tragen Sie die folgenden Zeilen in dieser Datei ein:

<Directory /srv/www/htdocs/phpsysinfo>
  AAHatName info
  # Aeltere Versionen benoetigen ImmHatName info
</Directory>
Starten Sie AppArmor und den Apache neu und prüfen Sie die Funktion.

Interessant ist insbesondere die Anwendung von AppArmor in einem Shared-Hosting-Umfeld. Eine typische Anwendung wird in 13.3 besprochen.

Die mit den Parametern AAHatName und AADefaultHatName gewählten Hats haben Vorrang vor allen weiteren Hats. Wird ein entsprechender Hat nicht gefunden, oder sind die Parameter nicht gesetzt, prüft AppArmor, ob ein Hat ^URI existiert. Ist dieser nicht vorhanden, nutzt AppArmor ^DEFAULT_URI. Fehlt auch dieser Hat wird das globale Apache-Profil genutzt.

Ralf Spenneberg 2007-11-13