Gentoo: Apache mit FPM-PHP im Multiuser-Setup

Mehrere FPM-PHP-Instanzen mit unterschiedlichen User-Rechten

Anfang des Monats stand der Umzug meines Servers an - und wie so üblich startet man mit hohen Ansprüchen („diesmal mache ich alles besser“) :-) Insbesondere mehrere PHP-Altlasten waren mir ein Dorn im Auge; vorher hatte ich sträflich einfach PHP als Modul in Apache eingebunden, was zur Folge gehabt hätte, dass eine kompromittierte PHP-Seite sämtliche gehosteten Domänen gefährdet hätte. Für das neue Setup hatte ich zunächst mpm-peruser geplant gehabe, bin dann aber doch auf PHP mit fastcgi umgeschwenkt.

mpm-peruser klang eigentlich nach einer hervorragenden Idee: Pro vhost-Konfiguration konnte man User und Gruppe angeben, unter welchen der Apache-Prozeß laufen sollte. Das funktionierte auch wunderbar - bis zu dem Moment, wo ich SSL konfigurierte. Offensichtlich verträgt sich mpm-peruser mit SSL (insbesondere mehreren SSL-Hosts mit SNI) nicht. Das hieß für mich zurück ans Zeichenbrett :-(

Mangels Lust auf weitere Experimente (mpm-itk wäre noch eine Option gewesen) entschied ich mich für den Klassischen Ansatz mittels fastcgi. Vorteil hierbei: Es gibt sogar von Haus aus eine Konfigurationsmöglichkeit, den PHP-Prozeß in eine chroot-Umgebung einzusperren (für diejenigen, die’s ganz paranoid wollen).

Das Standard-init-Skript von Sabayon (und Gentoo) kennt leider keine Möglichkeit, mehrere Instanzen mit unterschiedlichen Usern zu konfigurieren. Deshalb entstand diese angepaßte Version des Startskripts, welche mehrere Konfigurationen erlaubt. Die Verwendung ist recht einfach:

  • Nach /etc/init.d kopieren
  • Für jede Instanz: In /etc/init.d einen symbolischen Link darauf anlegen
  • Diese Links mittels rc-update in den Systemstart aufnehmen
  • In /etc/conf.d eine Konfigurationsdatei mit dem Namen des Symlinks anlegen und darin Umgebungsvariablen definieren. Entweder kann in PHP_FPM_CONF eine eigene Konfigurationsdatei angegeben werden, oder es wird aus der Standardkonfiguration eine neue Datei generiert, in welcher user und group auf die Werte der Variablen PHP_FPM_USER und PHP_FPM_GROUP gesetzt werden.

Anschließend sollte man die Standardkonfiguration fon FPM-PHP noch zurechtstutzen, das Öffnen von Dateien auf bestimmte Verzeichnisse beschränken und ggfs. „gefährliche“ PHP-Befehle wie das Starten externer Programme unterbinden.

Bezüglich der Rechtevergabe hat sich bei mir bewährt, die Rechte für den FPM-PHP-Prozeß (und auch für Apache selbst) an der Gruppe festzumachen. So kann man einem einzelnen User Schreibrechte auf die jeweiligen Verzeichnisse geben, den Webservern jedoch nur Leserechte. So hat ein Angreifer im Falle eines Falles nicht direkt die Möglichkeit, sämtliche Dateien nach seinem Gusto zu verändern.