
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 | apt-get install apache2-suexec |
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 | /var/www |
Nous allons maintenant installer suPHP et désactiver le module php de Apache, entrez pour cela les deux lignes suivantes :
1 | sudo apt-get install libapache2-mod-suphp |
Ensuite vérifiez que le fichier de configuration de suPHP /etc/suphp/suphp.conf
reprend bien les lignes suivantes:
1 | webserver_user=www-data |
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.