LAMP: Utiliser un utilisateur spécifique pour un vhost

De Adadov.net wiki

<metadesc>Configurer un environnement d'hébergement Linux, Apache, MariaDB, PHP (LAMP) avec utilisateur dédié permettant de totalement isolé un site web.</metadesc>

Ecrit Par : Adadov

Description[modifier | modifier le wikicode]

Il peut être utile dans de nombreux cas d'utiliser un utilisateur particulier pour faire tourner un VirtualHost Apache.

J'entends par là qu'aussi bien Apache que PHP-FPM utilisent cet utilisateur dans le cadre de ce vhost.

Et pour ce faire il va falloir un peu de travail, il faut changer le mode de fonctionnement d'Apache afin qu'il puisse utiliser les paramètres nécessaires.

L'environnement sera composé comme suit:

  • Utilisateur: myweb
  • Home de l'utilisateur dans /srv/web/myweb
  • Site internet dans /srv/web/myweb/www
  • Dossiers nécessaires à PHP dans /srv/web/myweb/php

Les configurations de PHP-FPM et Apache dépendent de votre système, par défaut sous Fedora elles sont respectivement dans /etc/php-fpm.d/ et /etc/httpd/conf.d/

Configuration d'Apache[modifier | modifier le wikicode]

Pour Apache, on va devoir passer son mode de fonctionnement en MPM prefork et ajouter le module ITK.

Sous Fedora on installera ce module avec la commande suivante:

[root@linux] # dnf -y install httpd-itkdblclick to copy

Une fois le module installé, il ne reste qu'à l'activer.

On va d'abord modifier le mode de fonctionnement d'Apache en éditant le fichier /etc/httpd/conf.modules.d/00-mpm.confafin de commenter le mode actuel et dé-commenter le mode prefork.

Après modification votre fichier devrait ressembler à ça:

# Select the MPM module which should be used by uncommenting exactly
# one of the following LoadModule lines.  See the httpd.conf(5) man
# page for more information on changing the MPM.

# prefork MPM: Implements a non-threaded, pre-forking web server
# See: http://httpd.apache.org/docs/2.4/mod/prefork.html
#
# NOTE: If enabling prefork, the httpd_graceful_shutdown SELinux
# boolean should be enabled, to allow graceful stop/shutdown.
#
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so

# worker MPM: Multi-Processing Module implementing a hybrid
# multi-threaded multi-process web server
# See: http://httpd.apache.org/docs/2.4/mod/worker.html
#
#LoadModule mpm_worker_module modules/mod_mpm_worker.so

# event MPM: A variant of the worker MPM with the goal of consuming
# threads only for connections with active processing
# See: http://httpd.apache.org/docs/2.4/mod/event.html
#
#LoadModule mpm_event_module modules/mod_mpm_event.so

On peut ensuite activer le module ITK, il suffit de dé-commenter la ligne LoadModule du fichier /etc/httpd/conf.modules.d/00-mpm-itk.conf

# ITK MPM (Multi-Processing Module). Mpm-itk allows you to run each of your
# vhost under a separate uid and gid - in short, the scripts and configuration
# files for one vhost no longer have to be readable for all the other vhosts.
LoadModule mpm_itk_module modules/mod_mpm_itk.so

On en a finit avec la configuration générale d'Apache, il ne restera que la configuration du vhost que nous verrons un peu plus tard.

Création de l'utilisateur[modifier | modifier le wikicode]

Notre utilisateur aura une configuration permettant de réduire la surface d'attaque:

  • Il ne pourra pas se connecter avec un shell
  • Son HomeDirectory sera le parent direct du dossier contenant le site afin de pouvoir établir un chroot si on le souhaite
  • On lui donne le groupe nobody qui n'a pas le moindre droits (normalement)
[root@linux] # useradd -g nobody -s /sbin/nologin -M -d /srv/web/myweb mywebdblclick to copy

Configuration de PHP-FPM[modifier | modifier le wikicode]

Pour PHP-FPM, nous allons devoir créer un ensemble de répertoires dédiés comme l'utilisateur qui exécutera les scripts PHP n'est pas celui par défaut; il n'a donc pas les droits pour écrire dans les répertoires standards.

Création des répertoires[modifier | modifier le wikicode]

Les dossiers créés par la première commande sont ceux qui composent l'environnement nécessaire de PHP.

La seconde commande crée le répertoire du site web

[root@linux] # mkdir -p /srv/web/myweb/php/{logs,wsdlcache,opcache,session,tmp}dblclick to copy
[root@linux] # mkdir -p /srv/web/myweb/www

Ne pas oublier de modifier les droits pour que notre utilisateur puisse exploiter ces répertoires.

On passera aussi en 700 la racine afin que seul notre utilisateur n'accède à ce répertoire.

[root@linux] # chown -R myweb /srv/web/mywebdblclick to copy
[root@linux] # chmod 700 /srv/web/myweb

Fichier de configuration du pool[modifier | modifier le wikicode]

Configuration du VirtualHost Apache[modifier | modifier le wikicode]

Dans la configuration Apache il faut noter 2 éléments pour que tout fonctionne:

  • Le SetHandler pour les fichiers PHP qui doit pointer sur le socket ouvert par PHP-FPM
  • Le AssignUserId qui définira les droits qu'Apache doit utiliser pour accéder aux fichiers
<VirtualHost *:80>
	ServerName myweb.com
	ServerAlias www.myweb.com

	DocumentRoot /srv/web/myweb

	<FilesMatch \.php$>
		SetHandler "proxy:unix:/srv/web/myweb/myweb.sock|fcgi://localhost"
	</FilesMatch>
	
	<IfModule mpm_itk_module>
		AssignUserId myweb nobody
	</IfModule>

</VirtualHost>