Executer des scripts php sous différentes identités.

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.

Purger des files d’attente sous Postfix

Il est parfois nécessaire de supprimer toutes les files d’attente d’un serveur Postfix.

Voici la commande à utiliser :

postsuper -d ALL

Cette commande postsuper permet de supprimer les messages contenus dans 4 files d’attente : hold, incoming, active et deferred.

Lorsqu’un message entre sur un serveur Postfix, il est d’abord traité dans la file d’attente incoming.
Lorsqu’il est prêt à être envoyé, il est alors géré par la file active.
La file deferred gère les messages dont la livraison a échouée pour une raison temporaire.
La file d’attente hold contient des messages passés volontairement de la file normale vers la file hold par l’administrateur.

Il est possible de purger d’une seule file avec la commande postsuper en spécifiant la file :

postsuper -d ALL deferred

Ubuntu 10.04 : Obtenir le hostname de la machine via le dhcp

Nous supposons qu’un serveur dhcp fonctionne déjà et est correctement configuré pour fournir les noms de machine.
Par exemple, pour ISC dhcpd :

           group {
             use-host-decl-names on;
             host joe {
               hardware ethernet 08:00:2b:4c:29:32;
               fixed-address joe.fugue.com;
             }
           }

Pour forcer Ubuntu a utiliser le hostname fourni (ici joe), nous allons forcer la distribution à ne pas utiliser network-manager. La machine concernée étant un poste de travail ordinaire, ne possédant qu’une seule carte réseau, nous allons tout simplement désinstaller network-manager.


sudo apt-get remove network-manager network-manager-gnome

Nous allons ensuite enlever les références à hostname et networkmanager dans /etc/init :


sudo mv /etc/init/hostname.conf /etc/init/hostname.conf.old

sudo mv /etc/init/network-manager.conf /etc/init/network-manager.conf.old

Nous allons ensuite modifier le fichier /etc/network/interfaces pour y rajouter les définitions concernant eth0 :

auto lo
iface lo inet loopback
auto eth0
iface eth0 inet dhcp

La machine étant destinée a être déployée sur d’autre machine par clonage, il est nécessaire de modifier l’affectation du nom eth0, ce dernier possédant par défaut une référence à l’adresse MAC :

sudo gedit /etc/udev/rules.d/70-persistent-net.rules

SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:xx:xx:xx:xx:xx", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"

devient :

SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*",  ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"

La couche graphique étant chargée très tôt dans ubuntu 10.04, il est déconseillé de modifier le hostname à la volée une fois cette dernière lancée. Nous allons donc créer un script qui modifiera le /etc/hostname et donc la modification sera prise en compte lors du prochain démarrage de la machine :

sudo gedit /etc/dhcp3/dhclient-exit-hooks.d/sethostname

#!/bin/sh
        echo $new_host_name > /etc/hostname
        if test -r /var/run/gdm.pid && ps -ef | grep $(cat /var/run/gdm.pid) | grep -q /usr/sbin/gdm ; then
                echo "GDM is running, hostname will be updated at the next startup" >> /var/log/sethostname.log ; 
       else
                hostname $new_host_name;
        fi

Nous terminons la manip en donnant les droits d’exécution :

sudo chmod +x /etc/dhcp3/dhclient-exit-hooks.d/sethostname