Documentation : Installation de PHP en mode CGI avec execution SuExec
Date de publication : 28.7.2004
Date de modification : 9.11.2005
|
|
But du document
La mise en place de PHP sur un serveur web peut avoir d'énormes répercutions de sécurité pour les sites hébergés sur celui-ci et sur le serveur en lui même. Ce document va aborder la mise en place de PHP en mode CGI (Common Gateway Inteface) qui sera éxécuter par SuExec.
Pré-requis
1. Un accès root sur le serveur *NIX
2. Un serveur web Apache 2.0.x
Définition de PHP CGI
Utiliser PHP en tant que CGI est une option pour les administrateurs qui ne désirent pas intégrer PHP en tant que module du serveur web Apache. L'utilisation de PHP CGI permet de créer un environnement "chrooter" et unique pour l'éxécution de chaque script PHP. Cette mise en place se fait la plupart du temps en installant l'éxécutable PHP dans le répertoire CGI-BIN du serveur web Apache.
Définition de SuExec
La fonction suEXEC -- introduite dans Apache 1.2 -- permet aux administrateurs système de lancer des scripts CGI ou SSI (Server Side Include) sous une identité différente que celle du serveur web Apache. Normallement lorsqu'un script CGI ou SSI est éxécuté, il tourne sous l'identité du serveur web.
Utilisée correctement, cette fonction permet de réduire considérablement les risques de sécurité du à des scripts CGI ou SSI mis en place par des utilisateurs.
ATTENTION : Par contre, si SuExec est mal configuré, il peut vous apporter un grand nombre de problèmes de configuration et de sécurité. Si vous n'êtes pas habitué avec la gestion des programmes setuid root, nous vous conseillons de ne pas utiliser SuExec. |
Lors de la configuration de PHP, il vous faut absolument indiquer ces paramètres :
--enable-cgi \
--enable-cli \
--enable-fastcgi \
--enable-force-cgi-redirect
A vous d'ajouter les options de compilation que vous désirez en plus.
Dans le fichier PHP.ini de PHP CGI, il vous faut obligatoirement indiquer ces données :
safe_mode = On
cgi.force_redirect = 1
Configuration et installation de SuExec
SuExec2 est compris directement dans Apache2 en tant que module. Pour configurer et installer Apache2 avec SuExec2, il vous suffit de spécifier ceci à la configuration de l'installation d'Apache2 :
--with-suexec-safepath="/usr/local/bin:/usr/bin:/bin" \
--with-suexec-logfile=/var/log/apache2/suexec_log \
--with-suexec-bin=/usr/sbin/suexec2
--with-suexec-userdir=public_html \
--with-suexec-caller=apache \
--with-suexec-docroot=/var/www \
--with-suexec-uidmin=1000 \
--with-suexec-gidmin=100 \
--with-suexec-umask=077 \
--enable-suexec=shared \
--with-perl=/usr/bin/perl \
--with-expat=/usr \
--with-ssl=/usr \
--with-z=/usr \
--with-port=80 \
--with-program-name=apache2 \
--with-devrandom=/dev/urandom
A vous de rajouter d'autres options de compilation, si nécessaire.
Rajouter dans apache.conf :
LoadModule suexec_module modules/mod_suexec.so
AddHandler cgi-script .cgi .pl
AddHandler php4-script .php
Action php4-script /cgi-bin/php-cgi
Rajouter un groupe et un utilisateur :
Ce groupe doit avoir un gid supérieur au gid minimal de la configuration SuExec. Rajouter un utilisateur dont l'uid doit etre supérieur à l'uid minimum de la configuration SuExec.
Par exemple :
shell> groupadd untrustedwebgroup1
shell> useradd -s /dev/null -g untrustedwebgroup1 -d /dev/null untrustedwebuser1
Rajouter dans le vhost :
SuexecUserGroup untrustedwebuser1 untrustedwebgroup1
ScriptAlias /cgi-bin/ "/var/www/localhost/utilisateur/cgi-bin/"
<Directory "/var/www/localhost/utilisateur/cgi-bin/">
AllowOverride None
Options -Indexes +ExecCGI
SetHandler cgi-script
Order allow,deny
Allow from all
</Directory>
Mise en place de PHP CGI SuExec
Dans le répertoire /cgi-bin/ de l'utilisateur :
Copier le binaire php dans /cgi-bin/ de l'utilisateur et mettre les droits de l'utilisateur et du groupe sur ce binaire.
Et voila, le tour est joué, si vous mettez en place un fichier PHP dans le répertoire web de l'utilisateur, vous pourrez voir dans le fichier de log /var/log/apache2/suexec_log que le script PHP a été éxécuter sous l'identitée de l'utilisateur et du groupe définis dans le vhost et non pas sous l'identitée du serveur web Apache.
Contributeur : Eric Romang