Debian Etch, mod_fcgid, php und suexec
Sicheres PHP - unterschiedliche User unter Debian Etch
Entsprechend dem Howto von Kase http://www.debianhowto.de/doku.php/de:howtos:sarge:apache2_php-fcgi beschreibe ich einen Aufbau für Debian Etch.
Warum?
Läuft PHP unter einem gemeinsamen Useraccount, wie das bei mod_php der Fall ist, kann man bequem die anderen Userverzeichnisse ausspionieren. Schnell nachbvollziehen kann man das, wenn man ein Script wie Webadmin auf seinen Webspace hochlädt.
OpenBasedir kann diese Möglichkeit einschränken, läßt sich in diesem Fall aber nicht nutzen, da die Einschränkungen für alle Domains gelten.
Viele Hoster gehen daher den Weg über suPHP, welches im Endeffekt für jeden Request ein eignes PHP mit entsprechenden Userrechten startet. Funktioniert bei entsprechender Rechtevergabe gut ist aber grottenlahm - schliesslich wird jedesmal das Binary geladen (etwa 1-2 MB) und danach wieder beendet. Dafür braucht es kaum Speicher, da nur im Bedarf eine PHP Instanz geladen wird und der Speicher danach sofort wieder frei ist.
FastCGI ist eine andere Variante: Ein Binary wird geladen, und bleibnt im Speicher um einige 1000 Request zu bearbeiten. Dies ist ähnlich performant wie mod_php läßt sich aber sicherer Konfigurieren. Als Nachteil ist natürlich eine höhere Speicherbelastung zu erwähnen, da jede PHP Instanz ein paar MB braucht wird es bei 100 unterschiedliche Accounts schon knapp. Schliesslich wollen der Apache und die sonstigen Serverprogramme auch Ihren Anteil.
Mit libapache2-mod-fcgid steht eine relativ bequeme Möglichkeit zur Verfügung um PHP Instanzen unter einzelnen Useraccounts laufen zu lassen, einen Aufbau beschreibe ich hier.
Wie?
Als erstes entfernen wir die Alten mod-php Teile und installieren anschliessend die benötigten Pakete und apache-mpm-worker.
aptitude update aptitude upgrade aptitude remove php5-common libapache2-mod-php5 aptitude install libapache2-mod-fcgid apache2-mpm-worker php5-cgi
Folgende Verzeichnisstruktur wird von mir gewählt (angelehnt an das Howto von Kase)
/var/www /domain1.tld /domain2.tld /domain3.tld /conf # enthält php.ini für diesen vHost /logs # enthält Logifles für diesen vHost /docs # enthält Docroot für diesen vHost /tmp # enthält Temporäre Dateien für diesen vHost php-fcgi-starter # enthält die Startscripte der php Instanzen für jede Domain /domain1.tld /domain2.tld /domain3.tldDer Aufbau ist einfach:
Verzeichnisstruktur: mit Rechten wie folgt:Die Einträge für die einzelnen vHosts. Die User/Gruppen bzw. Verzeichnisse und Servername/Alias müssen selbstverständlich angepasst werden.
<VirtualHost * > ServerAdmin xyz@example.org ServerName example.org ServerAlias www.example.org DocumentRoot /var/www/example.org/docs SuExecUserGroup User_für_example.org Group_für_example.org <Directory /> Options -All +FollowSymLinks AllowOverride None </Directory> <Directory /var/www/example.org/> Options -All +FollowSymlinks +ExecCGI AllowOverride AuthConfig Order allow,deny allow from all # FCGID-PHP-Teil FCGIWrapper /var/www/php-fcgi-scripts/example.org/php-fcgi-starter .php AddHandler fcgid-script .php </Directory> ErrorLog /var/www/example.org/logs/error.log LogLevel warn CustomLog /var/www/example.org/logs/access.log combined ServerSignature On </VirtualHost>Die wichtigen Zeilen hier die SuExecUserGroup, die ExecCGI sowie der FCGIWrapper Teil und der AddHandler damit sind die relevanten Teile für den Apache erlegt und es sollte alles funktionieren. Die Pfadangaben und User müssen an die eigene Struktur angepasst werden