Sécuriser l’exécution des scripts PHP entre les différents sites

Sécuriser l’exécution des scripts PHP entre les différents sites

16/04/2014

Dans​‌‍​‌​‌‍​‍ le dernier tutoriel nous avons vu comment mettre en place un serveur Apache et MySQL sur un serveur Linux ainsi que comment désactiver certaines fonctions du langage.

Nous allons maintenant voir comment sécuriser l’exécution de vos scripts au niveau du serveur. Je souhaitais faire une partie sur le HTTP-over-SSL mais aux vues des problèmes du moment avec OpenSSL j’en ferais un tutoriel dédié qui viendra suite à celui sur le reverse proxy avec Nginx.

Nous allons donc voir dans ce tutoriel comment mettre en place une sécurité par site et comment empêcher un site d’accéder aux ressources d’un autre voir à les supprimer etc… Pour cela il sera nécessaire de créer un utilisateur système par site et de lui affecter les droits sur ce site. Dans un second temps il faudra définir dans la configuration du site dans apache comment appeler une instance de PHP pour un profil donné.

Créer des utilisateurs

Un utilisateur étant nécessairement lié à un groupe il est aussi nécessaire de créer un groupe d’utilisateurs système dans cette partie, pour cela il suffit d’entrer la commande suivante avec le nom de votre groupe :

1
sudo groupadd web.my.home

Il suffit maintenant de créer l’utilisateur dans ce groupe en faisant bien attention à ne pas lui permettre de se connecter, c’est-à-dire ne pas lui définir ni de mot de passe ni de shell. Il est aussi utile (mais pas nécessaire) de lui affecter un répertoire utilisateur identique à celui du site. Cette commande se traduit comme suit :

1
sudo useradd -g web.my.home -d /var/www/my.home -s /bin/false web.my.home

L’option s permet de définir le shell de l’utilisateur, /bin/false correspondant à un shell vide ou aucune action n’est possible, l’option g permet de définir le groupe de l’utilisateur et finalement l’option d permet de définir le répertoire par défaut.

Pour terminer il faut affecter les droits du répertoire de l’utilisateur ainsi que sont contenus à l’utilisateur en question, pour cela entrez la commande suivante:

1
sudo chown -R web.my.home:web.my.home /var/www/my.home

Votre utilisateur et maintenant prêt, il ne reste plus qu’à configurer apache.

Configuration de Apache

Par défaut Apache s’exécute avec l’utilisateur www-data du groupe www-data ce qui est parfait pour le service mais le problème c’est que php est aussi exécuté par cet utilisateur. Cela pose un réel problème quand il s’agit de cloisonner des sites.

Pour régler ce problème il existe deux modules Apache que sont suExec et suPHP qui permettent d’exécuter les scripts php sous une autre identité. Nous allons commencer par installer suExec en entrant ces deux lignes de commande :

1
2
apt-get install apache2-suexec
apt-get install apache2-suexec-custom

Une fois l’installation terminée, ouvrez le fichier /etc/apache2/suexec/www-data en tant qu’administrateur et vérifiez que les deux premières lignes sont comme suit :

1
2
/var/www
www

Nous allons maintenant installer suPHP et désactiver le module php de Apache, entrez pour cela les deux lignes suivantes :

1
2
sudo apt-get install libapache2-mod-suphp
sudo a2dismod php5

Ensuite vérifiez que le fichier de configuration de suPHP /etc/suphp/suphp.conf reprend bien les lignes suivantes:

1
2
3
webserver_user=www-data
docroot=/var/www:${HOME}/www
check_vhost_docroot=false

Voilà, il ne reste plus qu’à définir l’utilisateur et le groupe à utiliser pour l’exécution de chaque site dans le fichier de l’hôte virtuel et c’est bon. Pour cela ouvrez le fichier de configuration de votre site et ajoutez la ligne suivante :

1
SuexecUserGroup web.my.home web.my.home

Et voilà, votre site ou application web est maintenant exécutée par un utilisateur système et est sécurisée.