PHP, SuExec und mod_fcgid (FastCGI) unter Debian

Um in einer Shared Hosting Umgebung sicherzustellen, dass die unterschiedlichen Benutzer nicht gegenseitig auf ihre Dateien zugreifen können muss beachtet werden, dass PHP- bzw. generell CGI-Scripte im Kontext des Benutzers ausgeführt werden, und nicht alle unter der ID des Webservers (www-data) laufen. Eine Möglichkeit dafür stellt SuExec bereit, was in der apache2-Standardinstallation von Debian bereits enthalten ist.
Die folgende Schrittfolge habe ich auf einem frischen absolut minimalistischen Debian Etch getestet (ca. 390 MB nach der Installation der hier beschriebenen Pakete) .

Nötiges Zeugs installieren und SuExec-Modul aktivieren

aptitude install php5-cgi apache2 libapache2-mod-fcgid
a2enmod suexec

(nicht libapache2-mod-fastcgi, das ginge wohl auch, wird aber etwas anders konfiguriert)

User anlegen:

useradd --create-home --home-dir /var/www/user1 user1
passwd user1

Apache VirtualHost-Config für user1 einrichten:

vi /etc/apache2/sites-available/testvhost

Inhalt:

<virtualhost *>
        ServerName testvhost
        DocumentRoot /var/www/user1/htdocs/testvhost
        SuexecUserGroup user1 user1
        <directory /var/www/user1/htdocs/testvhost>
                Options +ExecCGI
                AddHandler fcgid-script .php
                FCGIWrapper /var/www/user1/php5-cgi .php
        </directory>
</virtualhost>

Site aktivieren:

a2ensite testvhost

Wrapper-Script erstellen:

echo '#!/bin/sh' > /var/www/user1/php5-cgi
echo 'exec /usr/bin/php5-cgi "$@"' >> /var/www/user1/php5-cgi
chown user1:user1 /var/www/user1/php5-cgi
chmod 0700 /var/www/user1/php5-cgi

Apache neustarten:

/etc/init.d/apache2 restart

als user1 einloggen

mkdir -p ~/htdocs/testvhost
echo "< ? passthru('id'); phpinfo(); ?>“ > ~/htdocs/testvhost/index.php

im Browser Testen – http://testvhost/

Statt testvhost muss natürlich überall der entsprechende Domainname eingetragen werden, oder testvhost mit der entsprechenden IP des Servers in die /etc/hosts.

Hinweise:

  • Das Document Root des Users ist nicht ohne grund in /var/www. – SuExec ist standardmäßig so kompiliert, dass nur Scripte ausgeführt werden können, die sich dort befinden.
  • Es darf kein mod_php mehr aktiv sein.
  • Da das Wrapper-Script dem User gehört (gehören muss), ist es ihm möglich darüber beliebige Programme als CGI-Script zu starten.
  • Um gegenseitiges Lesen von Dateien zu verhindern müssen noch andere Maßnahmen vorgenommen werden. Beispielsweise sollten die Dateien der User maximal die Berechtigungen 0770 haben (dafür wäre eine Umstellung der umask auf 027 oder so ähnlich sinnvoll). Damit Apache dann noch die Dateien lesen kann, sollte der www-data Benutzer in der Gruppe des Users sein.
  • Andere Parameter zum optimieren von mod_fcgid sind hier dokumentiert: http://fastcgi.coremail.cn/doc.htm