Il peut parfois être utile que des scripts php s’exécutent sous différents UID/GID.
Dans notre exemple,nous allons faire en sorte que les scripts s’exécutent sous l’uid/gid du propriétaire du script. Nous allons également permettre d’executer des scripts sous l’identité du root (ATTENTION : CECI EST UNIQUEMENT FAIT A DES FINS PÉDAGOGIQUES ET NE DOIT PAS ÊTRE MIS EN PRODUCTION POUR DES RAISONS ÉVIDENTES DE SÉCURITÉ).
La plateforme utilisée est une Centos 5.5.
Tout d’abord, il convient d’installer apache ainsi que la version « cgi » de php.
yum install httpd httpd-devel php-common php-cli
Attention à ce que le module apache php ne soit pas installé sinon le désinstaller :
rpm -e php
Nous installons ensuite quelques outils de compilation
yum install autoconf gcc-c++ gcc libtool-ltdl-devel
Il nous faut ensuite installer apr depuis les sources :
wget http://mir2.ovh.net/ftp.apache.org/dist/apr/apr-1.4.2.tar.gz
tar zxf apr-1.4.2.tar.gz
cd apr-1.4.2
./configure --prefix=/usr/ && make && make install
Nous allons ensuite compiler et installer le module Apache suPHP :
wget http://www.suphp.org/download/suphp-0.7.1.tar.gz
tar zxf suphp-0.7.1.tar.gz
./configure --prefix=/usr --disable-checkpath --disable-checkuid --disable-checkgid --with-min-uid=0 --with-min-gid=0 --with-apache-user=apache --with-apr=/usr/bin/apr-1-config --sysconfdir=/etc --with-setid-mode=owner
make
make install
Si nous avions voulu interdire l’exécution de scripts possédant des uid/gid <100, il aurait fallu modifier les parametres –with-min-uid et –with-min-gid en conséquence.
Editons ensuite un fichier /etc/suphp.conf :
Modifions ensuite le fichier /etc/httpd/conf/httpd.conf.
Dans les options générales du fichier de configuration, ajoutons :
LoadModule suphp_module modules/mod_suphp.so
suPHP_Engine on
puis sous la section <Directory /var/www/html> :
AddType application/x-httpd-php .php
suPHP_AddHandler application/x-httpd-php
Il faut ensuite relancer le service avec :
service httpd restart
Pour tester, créons un fichier /var/www/html/test.php
<?
echo("<html><body>");
system("/usr/bin/id");
echo("</body></html>");
?>
Positionnons les droits sur ce fichier sur root:root :
chown root:root /var/www/html/test.php
Si nous lancons un navigateur sur http://xxx.xxx.xxx.xxx/test.php
nous obtenons :
Et si nous changeons les droits sur le fichier :
chown nobody:nobody /var/www/html/test.php
Nous obtenons :
Le script est donc bien exécuté en fonction du propriétaire du script et non pas sous l’identité « apache:apache ».
suPhP propose de nombreuses options permettant d’affiner les permissions accordées aux scripts. Pour cela, consultez la documentation officielle ici.