Gentoo: Apache mit FPM-PHP im Multiuser-Setup

Mehrere FPM-PHP-Instanzen mit unterschiedlichen User-Rechten

An­fang des Mo­nats stand der Umzug mei­nes Ser­vers an - und wie so üb­lich star­tet man mit hohen An­sprü­chen („dies­mal mache ich alles bes­ser“) :-) Ins­be­son­de­re meh­re­re PHP-Alt­las­ten waren mir ein Dorn im Auge; vor­her hatte ich sträf­lich ein­fach PHP als Modul in Apa­che ein­ge­bun­den, was zur Folge ge­habt hätte, dass eine kom­pro­mit­tier­te PHP-Sei­te sämt­li­che ge­hos­te­ten Do­mä­nen ge­fähr­det hätte. Für das neue Setup hatte ich zu­nächst mpm-pe­ru­ser ge­plant ge­ha­be, bin dann aber doch auf PHP mit fast­cgi um­ge­schwenkt.

mpm-pe­ru­ser klang ei­gent­lich nach einer her­vor­ra­gen­den Idee: Pro vhost-Kon­fi­gu­ra­ti­on konn­te man User und Grup­pe an­ge­ben, unter wel­chen der Apa­che-Pro­zeß lau­fen soll­te. Das funk­tio­nier­te auch wun­der­bar - bis zu dem Mo­ment, wo ich SSL kon­fi­gu­rier­te. Of­fen­sicht­lich ver­trägt sich mpm-pe­ru­ser mit SSL (ins­be­son­de­re meh­re­ren SSL-Hosts mit SNI) nicht. Das hieß für mich zu­rück ans Zei­chen­brett :-(

Man­gels Lust auf wei­te­re Ex­pe­ri­men­te (mpm-itk wäre noch eine Op­ti­on ge­we­sen) ent­schied ich mich für den Klas­si­schen An­satz mit­tels fast­cgi. Vor­teil hier­bei: Es gibt sogar von Haus aus eine Kon­fi­gu­ra­ti­ons­mög­lich­keit, den PHP-Pro­zeß in eine chroot-Um­ge­bung ein­zu­sper­ren (für die­je­ni­gen, die’s ganz pa­ra­no­id wol­len).

Das Stan­dard-in­it-Skript von Sa­ba­yon (und Gen­too) kennt lei­der keine Mög­lich­keit, meh­re­re In­stan­zen mit un­ter­schied­li­chen Usern zu kon­fi­gu­rie­ren. Des­halb ent­stand diese an­ge­pa­ß­te Ver­si­on des Starts­kripts, wel­che meh­re­re Kon­fi­gu­ra­tio­nen er­laubt. Die Ver­wen­dung ist recht ein­fach:

  • Nach /etc/init.d ko­pie­ren
  • Für jede In­stanz: In /etc/init.d einen sym­bo­li­schen Link dar­auf an­le­gen
  • Diese Links mit­tels rc-update in den Sys­tem­start auf­neh­men
  • In /etc/conf.d eine Kon­fi­gu­ra­ti­ons­da­tei mit dem Namen des Sym­links an­le­gen und darin Um­ge­bungs­va­ria­blen de­fi­nie­ren. Ent­we­der kann in PHP_FPM_CONF eine ei­ge­ne Kon­fi­gu­ra­ti­ons­da­tei an­ge­ge­ben wer­den, oder es wird aus der Stan­dard­kon­fi­gu­ra­ti­on eine neue Datei ge­ne­riert, in wel­cher user und group auf die Werte der Va­ria­blen PHP_FPM_USER und PHP_FPM_GROUP ge­setzt wer­den.

An­schlie­ßend soll­te man die Stan­dard­kon­fi­gu­ra­ti­on fon FPM-PHP noch zu­recht­stut­zen, das Öff­nen von Da­tei­en auf be­stimm­te Ver­zeich­nis­se be­schrän­ken und ggfs. „ge­fähr­li­che“ PHP-Be­feh­le wie das Star­ten ex­ter­ner Pro­gram­me un­ter­bin­den.

Be­züg­lich der Rech­te­ver­ga­be hat sich bei mir be­währt, die Rech­te für den FPM-PHP-Pro­zeß (und auch für Apa­che selbst) an der Grup­pe fest­zu­ma­chen. So kann man einem ein­zel­nen User Schreib­rech­te auf die je­wei­li­gen Ver­zeich­nis­se geben, den Web­ser­vern je­doch nur Le­se­rech­te. So hat ein An­grei­fer im Falle eines Fal­les nicht di­rekt die Mög­lich­keit, sämt­li­che Da­tei­en nach sei­nem Gusto zu ver­än­dern.