gallery blog

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.tld

Der 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

© 2007 Jan Scholten | Webhosting by rootsvr.de | Design by Flavia Schoenleber | Stand 03/2007