Serveur Web · 7 min read · Jan 02, 2026
Exécution de Vhosts sous des UID/GID séparés avec Apache2 mpm-peruser sur Debian Etch
Exécution de Vhosts sous des UID/GID séparés avec Apache2 mpm-peruser sur Debian Etch
Version 1.0
Auteur : Falko Timme
Cet article explique comment vous pouvez installer et configurer apache2-mpm-peruser sur un serveur Debian Etch. apache2-mpm-peruser est un MPM (Module de Multi-Processus) pour le serveur web Apache 2, très similaire à apache2-mpm-itk, mais plus rapide (presque aussi rapide qu’apache2-mpm-prefork). mpm-peruser vous permet d’exécuter chacun de vos vhosts sous un UID et un GID séparés - en bref, les scripts et fichiers de configuration pour un vhost n’ont plus à être lisibles par tous les autres vhosts. Il est basé sur metuxmpm, une implémentation fonctionnelle du MPM perchild. Le résultat est un environnement de serveur web sain et sécurisé pour vos utilisateurs, sans bricolages comme le safe_mode de PHP.
Ce document est fourni sans aucune garantie ! Je ne donne aucune garantie que cela fonctionnera pour vous !
1 Remarque préliminaire
Pour des raisons de rapidité, jetez un œil à http://blog.stuartherbert.com/php/2008/03/20/using-mpm-peruser-to-secure-a-shared-server/.
Je suppose que vous avez une installation Apache2 fonctionnelle avec mod_php sur votre serveur Debian Etch, par exemple installée comme ceci :
apt-get install apache2-mpm-prefork libapache2-mod-php5Lorsque vous créez un fichier PHP avec la fonction phpinfo();, par exemple comme ceci…
vi /var/www/info.php| |
… et que vous l’appelez dans un navigateur, vous verrez que prefork est listé dans la ligne des Modules Chargés sous apache2handler :

2 Installation d’apache2-mpm-peruser
Contrairement à apache2-mpm-itk, apache2-mpm-peruser n’est pas disponible en tant que paquet Debian, donc je vais construire mon propre paquet Debian (je vais utiliser le paquet source apache2-mpm-itk comme base pour construire mon paquet Debian apache2-mpm-peruser car ils sont très similaires).
Avant de commencer à construire le paquet, j’installe quelques prérequis :
apt-get install build-essential dpkg-dev fakeroot debhelper dpatch apache2-prefork-dev libcap-dev apache2-src autoconfEnsuite, je vais dans /usr/src et télécharge le paquet source apache2-mpm-itk :
cd /usr/src
apt-get source apache2-mpm-itkls -lserver1:/usr/src# ls -l
total 52
drwxr-xr-x 3 root root 4096 2008-08-16 13:29 apache2-mpm-itk-2.2.3-01
-rw-r--r-- 1 root src 11392 2007-10-03 19:02 apache2-mpm-itk_2.2.3-01-2.diff.gz
-rw-r--r-- 1 root src 664 2007-10-03 19:02 apache2-mpm-itk_2.2.3-01-2.dsc
-rw-r--r-- 1 root src 29071 2006-10-31 00:04 apache2-mpm-itk_2.2.3-01.orig.tar.gz
server1:/usr/src#Ensuite, je renomme le répertoire apache2-mpm-itk en apache2-mpm-peruser :
mv apache2-mpm-itk-2.2.3-01 apache2-mpm-peruser-2.2.3-01Puis je vais dans ce répertoire, télécharge le patch mpm-peruser et supprime le patch mpm-itk qui est déjà dans le répertoire :
cd apache2-mpm-peruser-2.2.3-01/
wget http://www.telana.com/files/httpd-2.2.3-peruser-0.3.0.patch
rm -f apache2.2-mpm-itk.patchMaintenant, allons dans le sous-répertoire debian/ :
cd debian/
ls -lserver1:/usr/src/apache2-mpm-peruser-2.2.3-01/debian# ls -l
total 64
-rw-r--r-- 1 root root 10 2008-08-15 16:21 apache2-mpm-itk.dirs
-rw-r--r-- 1 root root 633 2008-08-15 16:21 apache2-mpm-itk.postinst
-rw-r--r-- 1 root root 561 2008-08-15 16:21 apache2-mpm-itk.preinst
-rw-r--r-- 1 root root 342 2008-08-15 16:21 apache2-mpm-itk.prerm
-rw-r--r-- 1 root root 438 2008-08-15 16:21 changelog
-rw-r--r-- 1 root root 2 2008-08-15 16:21 compat
-rw-r--r-- 1 root root 980 2008-08-15 16:21 control
-rw-r--r-- 1 root root 31777 2008-08-15 16:21 copyright
-rwxr-xr-x 1 root root 1328 2008-08-15 16:21 rules
server1:/usr/src/apache2-mpm-peruser-2.2.3-01/debian#Nous renommerons tous les fichiers contenant itk dans le nom de fichier :
mv apache2-mpm-itk.dirs apache2-mpm-peruser.dirs
mv apache2-mpm-itk.postinst apache2-mpm-peruser.postinst
mv apache2-mpm-itk.preinst apache2-mpm-peruser.preinst
mv apache2-mpm-itk.prerm apache2-mpm-peruser.prermEnsuite, nous devons modifier le fichier changelog, par exemple comme ceci :
cat /dev/null > changelog
vi changelog| apache2-mpm-peruser (2.2.3-01-1) stable; urgency=low * Port initial vers Apache 2.2. -- Falko Timme <[email protected]> Fri, 15 Aug 2008 14:29:36 +0100 |
Assurez-vous que la dernière ligne a exactement un espace au début (avant –) et deux espaces entre l’adresse e-mail et la date !
Maintenant, nous ouvrons le fichier de contrôle et remplaçons toutes les occurrences de apache2-mpm-itk par apache2-mpm-peruser. Je laisse la Description telle quelle, mais remplace ITK par Peruser. Dans la ligne Conflicts, j’ajoute apache2-mpm-itk :
vi control| Source: apache2-mpm-peruser Section: net Priority: extra Build-Depends: apache2-src, apache2-prefork-dev, libcap-dev, autoconf, debhelper (>> 5.0.0) Maintainer: Falko Timme <[email protected]> Standards-Version: 3.7.2 Package: apache2-mpm-peruser Provides: apache2-modules, apache2, httpd, httpd-cgi Conflicts: apache2-mpm-prefork, apache2-mpm-itk, apache2-mpm-worker, apache2-mpm-perchild, apache2-mpm-event, apache2-common Depends: ${apache:Depends}, ${shlibs:Depends} Architecture: any Description: MPM multi-utilisateur pour Apache 2.2 Le Module de Traitement Multi-Utilisateur (MPM) Peruser fonctionne à peu près de la même manière que le module classique "prefork" (c'est-à-dire, sans threads), sauf qu'il vous permet de contraindre chaque vhost individuel à un utilisateur système particulier. Cela vous permet d'exécuter plusieurs sites web différents sur un seul serveur sans vous soucier qu'ils puissent lire les fichiers des autres. . Veuillez noter que ce MPM est hautement expérimental, et n'est pas issu du même arbre que les autres MPMs. |
Ensuite, nous modifions le fichier rules :
vi rulesRemplacez
| cd apache2.2/ && patch -p1 < ../apache2.2-mpm-itk.patch |
par
| cd apache2.2/ && patch -p1 < ../httpd-2.2.3-peruser-0.3.0.patch |
Remplacez
| sed 's,prefork,itk,;s,^".*/configure",../apache2.2/configure,;s,^"--srcdir=.*",--srcdir=../apache2.2/,' < /usr/share/apache2/build/config.nice > build-tree/config.nice |
par
| sed 's,prefork,peruser,;s,^".*/configure",../apache2.2/configure,;s,^"--srcdir=.*",--srcdir=../apache2.2/,' < /usr/share/apache2/build/config.nice > build-tree/config.nice |
Remplacez
| install -m 0755 build-tree/apache2 debian/apache2-mpm-itk/usr/sbin/ |
par
| install -m 0755 build-tree/apache2 debian/apache2-mpm-peruser/usr/sbin/ |
Remplacez
| echo "apache:Depends=apache2.2-common (= `dpkg -s apache2.2-common | grep ^Version: | cut -d" " -f2`)" >> debian/apache2-mpm-itk.substvars |
par
| echo "apache:Depends=apache2.2-common (= `dpkg -s apache2.2-common | grep ^Version: | cut -d" " -f2`)" >> debian/apache2-mpm-peruser.substvars |
Le fichier complet ressemble à ceci :
| #! /usr/bin/make -f clean: dh_testdir dh_testroot dh_clean $(RM) -r build-tree/ $(RM) -r apache2.2/ $(RM) build-stamp build: build-stamp build-arch: build-stamp build-stamp: dh_testdir mkdir build-tree/ mkdir apache2.2/ cd apache2.2/ && tar zxf /usr/src/apache2.tar.gz # contournement pour apache2-src 2.2.3-3 if [ -d apache2.2/apache2 ]; then \ mv apache2.2/apache2/* apache2.2/; \ rmdir apache2.2/apache2/; \ fi cd apache2.2/ && patch -p1 < ../httpd-2.2.3-peruser-0.3.0.patch cd apache2.2/ && autoconf sed 's,prefork,peruser,;s,^".*/configure",../apache2.2/configure,;s,^"--srcdir=.*",--srcdir=../apache2.2/,' < /usr/share/apache2/build/config.nice > build-tree/config.nice chmod +x build-tree/config.nice cd build-tree/ && ./config.nice cd build-tree/ && $(MAKE) touch build-stamp binary: binary-arch binary-indep: binary-arch: build-arch dh_testdir dh_testroot dh_installdirs install -m 0755 build-tree/apache2 debian/apache2-mpm-peruser/usr/sbin/ dh_fixperms dh_strip dh_installdocs README dh_installchangelogs dh_installdeb dh_compress dh_shlibdeps echo "apache:Depends=apache2.2-common (= `dpkg -s apache2.2-common | grep ^Version: | cut -d" " -f2`)" >> debian/apache2-mpm-peruser.substvars dh_gencontrol dh_md5sums dh_builddeb .PHONY: clean build build-arch binary binary-arch binary-indep |
Voilà tous les changements que nous devons apporter - nous pouvons maintenant construire le paquet :
cd ..
dpkg-buildpackageLe paquet sera disponible dans le répertoire /usr/src :
cd /usr/src
ls -lserver1:/usr/src# ls -l
total 6512
-rw-r--r-- 1 root src 11392 2007-10-03 19:02 apache2-mpm-itk_2.2.3-01-2.diff.gz
-rw-r--r-- 1 root src 664 2007-10-03 19:02 apache2-mpm-itk_2.2.3-01-2.dsc
-rw-r--r-- 1 root src 29071 2006-10-31 00:04 apache2-mpm-itk_2.2.3-01.orig.tar.gz
drwxr-xr-x 5 root root 4096 2008-08-16 13:40 apache2-mpm-peruser-2.2.3-01
-rw-r--r-- 1 root src 353 2008-08-16 13:36 apache2-mpm-peruser_2.2.3-01-1.dsc
-rw-r--r-- 1 root src 710 2008-08-16 13:40 apache2-mpm-peruser_2.2.3-01-1_i386.changes
-rw-r--r-- 1 root src 165438 2008-08-16 13:40 apache2-mpm-peruser_2.2.3-01-1_i386.deb
-rw-r--r-- 1 root src 50282 2008-08-16 13:36 apache2-mpm-peruser_2.2.3-01-1.tar.gz
-rw-r--r-- 1 root root 6364431 2008-03-22 10:35 apache2.tar.gz
server1:/usr/src#Le paquet mpm-peruser que nous venons de construire s’appelle apache2-mpm-peruser_2.2.3-01-1_i386.deb. Avant de pouvoir l’installer, nous devons désinstaller apache2-mpm-prefork car il entre en conflit avec apache2-mpm-peruser (rappelez-vous le fichier de contrôle) :
apt-get remove apache2-mpm-preforkserver1:/usr/src# apt-get remove apache2-mpm-prefork
Lecture des listes de paquets… Fait
Construction de l’arbre des dépendances… Fait
Les paquets suivants seront ENLEVÉS :
apache2-mpm-prefork libapache2-mod-php5
0 mis à jour, 0 nouvellement installés, 2 à enlever et 68 non mis à jour.
Besoin de 0B d’archives.
Après dépaquetage, 6115kB d’espace disque seront libérés.
Voulez-vous continuer [Y/n]? <– Y
(Lecture de la base de données … 29620 fichiers et répertoires actuellement installés.)
Suppression de libapache2-mod-php5 …
Module php5 désactivé ; exécutez /etc/init.d/apache2 force-reload pour désactiver complètement.
Suppression de apache2-mpm-prefork …
Arrêt du serveur web (apache2)….
server1:/usr/src#
Malheureusement, cela supprime également le paquet libapache2-mod-php5, de sorte que PHP ne fonctionnera plus. Nous allons y remédier dans un instant.
Maintenant, nous pouvons installer le paquet apache2-mpm-peruser :
dpkg -i apache2-mpm-peruser_2.2.3-01-1_i386.debMaintenant, si vous essayez de réinstaller le paquet libapache2-mod-php5, vous verrez qu’apt insiste pour supprimer apache2-mpm-peruser et réinstaller apache2-mpm-prefork, ce qui n’est pas ce que nous voulons - donc nous annulons cela :
server1:/usr/src# apt-get install libapache2-mod-php5
Lecture des listes de paquets… Fait
Construction de l’arbre des dépendances… Fait
Les paquets supplémentaires suivants seront installés :
apache2-mpm-prefork
Paquets suggérés :
php-pear
Les paquets suivants seront ENLEVÉS :
apache2-mpm-peruser
Les nouveaux paquets suivants seront installés :
apache2-mpm-prefork libapache2-mod-php5
0 mis à jour, 2 nouvellement installés, 1 à enlever et 61 non mis à jour.
Besoin de 0B/2833kB d’archives.
Après dépaquetage, 5681kB d’espace disque supplémentaire seront utilisés.
Voulez-vous continuer [Y/n]? <– n
Abandon.
server1:/usr/src#
Cela se produit parce que lorsque le paquet libapache2-mod-php5 a été construit, le mainteneur lui a dit qu’il dépendait soit d’apache2-mpm-prefork soit d’apache2-mpm-itk. Cela signifie que nous devrons reconstruire le libapache2-mod-php5 à partir des sources et ajouter le paquet apache2-mpm-peruser aux dépendances de ce paquet (vous pouvez faire cela avec n’importe quel autre paquet si vous avez le même problème avec d’autres paquets). Je vais y venir dans un instant.
Recevez de nouveaux articles dans votre boîte de réception.
Aucun spam. Désabonnez-vous à tout moment.