(modifié le 30 octobre 2008 à 22:41)

Il peut arriver d'avoir besoin d'automatiser des actions sur un serveur linux via une page web, typiquement en PHP. Ne trouvant que peu de documentation sur ce principe, je vous propose une solution qui devrait fonctionner sur la majorité des serveurs (testée sous Debian et Ubuntu pour mon cas).

Nous allons dans cet exemple redémarrer le service DNS (Bind9) grâce à un formulaire html exécutant cette fameuse commande via un bout de code PHP.

Identifier l'utilisateur Apache

Les scripts PHP interprétés par Apache sont exécutés par un utilisateur système. Généralement il s'agit de "www-data", mais il peut varier selon les distributions et configurations. Pour récupérer ce nom d'utilisateur vous avez trois solutions :

  1. Ouvrir le fichier de configuration Apache "apache2.conf", généralement situé dans /etc/apache2/apache2.conf (si vous le ne trouvez pas faites un "locate apache2.conf" il devrait vous indiquer son emplacement). Dans le premier quart tu fichier vous devriez trouver l'information voulue :
  2. Ouvrir le fichier des utilisateurs systèmes /etc/group/ et cherchez celui qui semble correspondre
  3. Lancer le service Apache (en root : /etc/init.d/apache2 start) puis faites un : ps aux | grep apache2. Vous devriez avoir le nom d'utilisateur sous lequel le service fonctionne.

Le fichier sudoers

Nous allons utiliser la commande sudo qui va permettre à l'utilisateur Apache (www-data pour mon cas) de lancer une commande qui n'est habituellement exécutable qu'en root. Je vous conseilel de lire cette documentation si vous n'avez jamais entendu parlé de sudo.

Editez le fichier /etc/sudoers via la commande visudo (il est fortement déconseiller de l'éditer directement), puis trouvez cette ligne :
[nice_code]root    ALL=(ALL) ALL[/nice_code]

En dessous de cette ligne ajoutez :
[nice_code]www-data ALL=(ALL) NOPASSWD:/etc/init.d/bind9 restart[/nice_code]

Pensez à remplacer www-data par votre utilisateur s'il diffère (cf. première étape).

Grâce à cette ligne nous autorisons l'utilisateur d'Apache a exécuter cette commande, et uniquement celle-ci ! C'est un point important sur la sécurité de votre système. Dans le cas contraire sachez que la sécurité de votre système serait totalement compromise :
[nice_code]www-data ALL=(ALL) NOPASSWD:ALL[/nice_code]

Dans ce cas précis, vous autorisez toutes les commandes du systèmes à être exécutées par votre utilisateur Apache, bien évidemment c'est fortement déconseillé !

Le cas d'un script shell

Si vous préférez exécuter un script (.sh) qui s'occupera lui même de réaliser cette opération, il vous faut placer dans votre fichier /etc/sudoers (toujours via la commande visudo) le code suivant (ignorer dans ce cas la première manipulation) :

[nice_code]www-data ALL=(ALL) NOPASSWD: DNSRELOAD
# Cmnd alias specification
Cmnd_Alias DNSRELOAD = /chemin/vers/votre/script.sh
[/nice_code]

D'une façon générale :
Cmnd_Alias NomDeVotreAlias = NomDeVotreAlias ListeDeCommandesSepareesParDesVirgules
OU (dans le cas d'un script)
Cmnd_Alias NomDeVotreAlias = NomDeVotreAlias /chemin/vers/votre/script/

Le script s'exécutant "en tant que" root vous ne devriez pas avoir de souci de droits, dans le cas contraire :
[nice_code]#: chown www-data:www-data /chemin/vers/votre/script.sh[/nice_code]

Vous pouvez également faire plus simple en sautant ces étapes pour directement placer le code suivant dans /etc/sudoers (mais les possibilités de "dérives" vers d'autres utilisations sont moins nombreuses) :
[nice_code]www-data ALL=(ALL) NOPASSWD: /chemin/vers/votre/script.sh[/nice_code]

L'exécution du script PHP

Il vous suffira ensuite de lancer la commande grâce à la fonction exec de PHP. Dans le cas ou vous souhaitez relancer Bind sans script (.sh) :
[nice_code]<?PHP exec('sudo -u www-data /etc/init.d/bind9 restart'); exit; ?>[/nice_code]

Dans le cas ou vous utilisez un script :
[nice_code]<?PHP exec('sudo -u www-data /chemin/vers/votre/script.sh'); exit; ?>[/nice_code]

Pensez à remplacer www-data par votre utilisateur Apache s'il diffère 😉

Conclusion

Il ne vous reste plus faire un petit formulaire (x)html très simple avec un bouton "Redémarrer Bind" et le tour est joué ! Sachez que cette technique fonctionne même si vous avez Suhosin-patch d'installé.

Si toutefois cette solution ne vous convient pas, il vous reste la solution des scripts SUID, à condition dans ce cas d'avoir solides connaissances en matière de permissions sur les fichiers.

Auteur : Mr Xhark

Fondateur du blog et passionné par les nouvelles techno, suivez-moi sur twitter