suPHP: php4 et php5 sur le même serveur et exécution des scripts PHP avec les droits de leur propriétaire

Sur un serveur accueillant de nombreux utilisateurs, tous n’étant pas de confiance, il est très pratique que les scripts PHP s’éxécutent avec les droits de leur propriétaire ! C’est possible grâce à suPHP !

De plus grâce à ce module nous pourrons exécuter et des scripts PHP4 et des scripts PHP5. C’est très pratique car la plupart des applications PHP disponibles utilisent encore PHP4 (phpBB, DotClear, Xoops, …) mais PHP5 c’est l’avenir et peut-être que vos utilisateurs, ou vous même, souhaitent déjà développer des scripts PHP. Il est donc utile que les deux versions soient présentes sur votre serveur.

suPHP

Cet article est écrit pour l’installation et la configuration de suPHP sur les système basé Debian. Il à été testé sous Debian sarge (stable) et Ubuntu Hoary. Nous utiliserons Apache 2.

Dépôts supplémentaires

suPHP est bien présent dans Ubuntu et Debian mais uniquement en version 0.5.2. Or seul la version 0.6.0 permet d’utiliser deux versions distinctes de PHP (ici la 4 et la 5). Nous installerons donc suPHP 0.6.0 en provenance d’un dépôt non officiel. Malheureusement les paquets binaires fournis sur ce dépôt ne s’installent ni sous Sarge, ni sous Hoary, nous utiliserons donc le paquet source. De même php5 n’est disponible, ni dans Debian Sarge, ni dans Ubuntu Hoary, nous installerons une version provenant d’un dépôt non officiel.

  • Editez /etc/apt/sources.list et ajoutez-y les lignes suivantes, pour php5 changez sarge par le nom de votre distribution (woody, sid pour Debian ou encore hoary ou breezy pour Ubuntu):
# suPHP deb-src http://manu.home-dn.net/debian/suphp-preview sid main # php5 deb http://people.debian.org/~dexter php5 sarge
  • Mettez à jour les listes de paquets
# apt-get update

Installation

  • Si apache2 n’est pas installé tapez juste:
# apt-get install apache2
  • Installons d’abord la version cgi de php4 et php5:
# apt-get install php4-cgi php5-cgi
  • Si vous aviez php4 installé en tant que module, c’est l’heure de le retirer:
# apt-get remove libapache2-mod-php4
  • Installons maintenant suPHP, nous installons d’abord les dépendances puis nous construisons le paquet, finalement nous installons le paquet suPHP que nous avons construit.
# apt-get install g++ apache2-mpm-prefork apache-dev apache2-prefork-dev libapr0-dev docbook-to-man # apt-get -b source suphp # dpkg -i libapache2-mod-suphp_*_i386.deb suphp-common_*_i386.deb

suPHP est maintenant installé sur notre système, passons à sa configuration ! Les plus curieux auront notés qu’un troisième paquet à été utilisé et que nous ne l’avons pas installé. Il s’agit du module suPHP pour apache 1.x.

Configuration

Nous allons configurer suPHP pour que les scripts ayant l’extension .php3, .php4, .php et .phtml s’éxécutent avec l’interpréteur PHP4 et ceux avec l’extension .php5 avec PHP5 (les fichiers source .phps seront aussi affichés avec PHP4). Nous veilleront aussi a ce que seuls les scripts et répertoires n’étant pas accessibles par tout le monde en écriture (chmod 777) soient exécutables. Pour configurer suPHP aux petits oignons consultez sa documentation: /usr/share/doc/suphp-common/CONFIG

Indiquons d’abord à Apache de gérer les fichiers PHP avec suPHP.

  • Editez le fichier /etc/apache2/apache2.conf et ajoutez (ou dé-commentez) ces lignes:
AddType application/x-httpd-php .php .php3 .php4 .phtml AddType application/x-httpd-php5 .php5 AddType application/x-httpd-php-source .phps
  • Editez ensuite /etc/apache2/mods-enabled/suphp.conf pour qu’il contienne (dé-commentez les lignes commençants par # pour activer suPHP pour les scripts CGI aussi):
<IfModule mod_suphp.c>        AddHandler x-httpd-php .php .php3 .php4 .phtml        AddHandler x-httpd-php5 .php5        #AddHandler x-suphp-cgi .pl .py .cgi .shtml        suPHP_AddHandler x-httpd-php        suPHP_AddHandler x-httpd-php5        #suPHP_AddHandler x-suphp-cgi        suPHP_Engine on </IfModule>
  • Passons à la configuration de suPHP lui même, ouvrez /etc/suphp/suphp.conf copiez y ce contenu puis personalisé le si nécéssaire:
[global] ;Chemin vers le fichier log logfile=/var/log/suphp/suphp.log ;Niveau de log loglevel=info ;Nom d'utilisateur faisant tourner apache webserver_user=www-data ;Chemin dans lequel doivent se trouver les scripts docroot=/var/www  ; Options liées à la sécurité ;Executer les scripts que peuvent modifier les membres du même groupe d'utilisateur ? allow_file_group_writeable=false ;Executer les scripts que tout le monde peut modifier ? allow_file_others_writeable=false ;Executer les scripts contenus dans un répertoire que peuvent modifier les membres du même groupe d'utilisateur ? allow_directory_group_writeable=false ;Executer les scripts contenus dans un répertoire que tout le monde peut modifier ? allow_directory_others_writeable=false ;Vérifier si les scripts se trouvent dans le DOCUMENT_ROOT check_vhost_docroot=true ;Afficher les erreurs mineures dans le navigateur ? errors_to_browser=false ;Variable d'environnement PATH env_path=/bin:/usr/bin ;Umask à appliquer (en notation octale) umask=0077 ; UID (id d'utilisateur) minimum nécéssaire pour qu'un script soit éxécuté (permet de bloquer l'execution de script détenu par des utilisateurs système) min_uid=100 ; GID (id de groupe) minimum nécéssaire pour qu'un script soit éxécuté (permet de bloquer l'execution de script détenu par des utilisateurs système) min_gid=100 [handlers] ;Gestionnaire de scripts PHP4 x-httpd-php=php:/usr/bin/php4-cgi ;Gestionnaire de scripts PHP5 x-httpd-php5=php:/usr/bin/php5-cgi ;Gestionnaire de scripts CGI x-suphp-cgi=execute:!self

suPHP est maintenant configuré et installé, reste à redémarrer Apache avec /etc/init.d/apache2 restart ! Vérifiez bien qu’aucun script PHP n’est modifiable par les membres du même groupe ou pire par tout le monde pour que tout ce passe bien ! N’hésitez par à faire des chmod -R 744 sur vos répertoires.

Modules

Vous aurez certainement besoin de modules pour PHP, les plus commun étant celui pour MySQL qui permet d’utiliser ce gestionnaire de base de donnée avec PHP.
Pour obtenir la liste des modules disponibles pour php4 tapez apt-cache search php4- et pour php5 apt-cache search php5-.
Un fois les modules installés il vous faudra les activer dans les fichiers de configuration de PHP, respectivement /etc/php4/cgi/php.ini pour PHP4 et /etc/php5/cgi/php.ini pour PHP5. Pour php4-mysql ajoutez par exemple extension=mysql.so ou encore extension=gd.so pour php4-gd. La syntaxe est la même pour PHP5. N’oubliez pas de redémarrer apache avec /etc/init.d/apache2 restart après chaque ajout de module.

Test

Un petit test, créez un fichier dans votre répertoire web avec votre compte utilisateur nommé whoami.php qui contient:

<?php echo exec('whoami'); ?> 

Si tout va bien le nom de votre utilisateur s’affichera lorsque vous chargerez le script. Dans le cas contraire ca sera www-data (l’utilisateur éxécuantant apache et PHP par défaut sous les systèmes basés Debian) qui apparaîtra. Si c’est le cas c’est que vous avez commis une erreur de configuration.

Renommez maintenant whoami.php en whoami.php5 pour vérifier que PHP5 fonctionne bien. Le résultat doit être le même.

Merci à Philippe pour son aide !

Leave a Reply