Version 1.0
Autor: Falko Timme <ft [at] falkotimme [dot] com>
Last edited 08/16/2008
Diese Anleitung erläutert wie man einen Apache2-MPM-Peruser auf einem Debian Etch Server installiert und konfiguriert. Apache2-MPM-peruser ist ein MPM (Multi-Processing Modul) für den Apache 2 Webserver und Apache2-MPM-itk sehr ähnlich, jedoch schneller (fast wie Apache2-MPM-Prefork). MPM-peruser ermöglicht die Benutzung jeden Vhosts unter einer separaten UID und GIB - kurzgefasst, die Skripte und die Konfigurationsdateien müssen nicht mehr für die anderen virtuellen Hosts lesbar sein. Es basiert auf metuxmpm, eine funktionsfähige Implementierung des perchild-MPM. Das Ergebnis ist ein ausgewogenes und sicheres Webserver-Umfeld für die Nutzer, ohne Behelfslösungen wie PHPs safe_mode.
Dieses Anleitung ist ohne Gewähr! Ich kann leider nicht garantieren, dass es bei Dir genauso funktioniert.
1 Vorbemerkung
Für die Berücksichtigung von Geschwindigkeiten, bitte unter http://blog.stuartherbert.com/php/2008/03/20/using-mpm-peruser-to-secure-a-shared-server/ nachschauen.
Ich gehe davon aus, dass Du bereits eine funktionierende Apache2 Installation mit mod_php auf einem Debian Etch Server hast, beispielsweise folgendermassen installiert:
apt-get install apache2-mpm-prefork libapache2-mod-php5
Wenn eine PHP Datei mit der phpinfo(); Funktion erstellt wird, z. B.:
vi /var/www/info.php
<?php phpinfo(); ?> |
… und im Browser aufgerufen wird, wird sichtbar dass prefork in der Zeile Loaded Modules unter apache2handler aufgelistet ist:

2 Apache2-MPM-peruser installieren
Apache2-MPM-peruser ist leider nicht wie Apache2-MPM-itk als Debian Paket erhältlich, daher erstelle ich ein eigenes Debian Paket. Hierfür nutze ich das Apache2-MPM-itk Quelltextpaket als Basis für mein eigenes Apache2-MPM-peruser Debian Paket, da sie sich sehr ähnlich sind.
Bevor das Paket erstellt wird, installiere ich einige Grundvoraussetzungen:
apt-get install build-essential dpkg-dev fakeroot debhelper dpatch apache2-prefork-dev libcap-dev apache2-src autoconf
Dann gehe ich zu /usr/src und lade das Apache2-MPM-itk Quelltext Paket herunter:
cd /usr/src
apt-get source apache2-mpm-itk
ls -l
server1:/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#
Als nächstes bennene ich das Verzeichnis Apache2-MPM-itk zu Apache2-MPM-peruser:
mv apache2-mpm-itk-2.2.3-01 apache2-mpm-peruser-2.2.3-01
Dann gehe ich zu diesem Verzeichnis, lade den MPM-peruser Patch herunter und lösche den MPM-itk Patch, der sich bereits im Verzeichnis befindet:
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.patch
Gehen wir nun zum debian/ Unterverzeichnis :
cd debian/
ls -l
server1:/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#
Wir bennenen alle Dateien, die itk im Dateinamen enthalten, um:
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.prerm
Dann müssen wir die changelog Datei ändern, z.B. folgendermassen:
cat /dev/null > changelog
vi changelog
apache2-mpm-peruser (2.2.3-01-1) stable; urgency=low * Initial port to Apache 2.2. -- Falko Timme <ft@falkotimme.com> Fri, 15 Aug 2008 14:29:36 +0100 |
Bitte versichere Dich dass die letzte Zeile genau eine Leerzeile am Anfang (vor --) hat, sowie zwei Leerzeichen zwischen der Email-Adresse und dem Datum!
Nun öffnen wir die control Datei und ersetzen alle apache2-mpm-itk mit apache2-mpm-peruser. Ich lasse die Description unverändert, ersetze jedoch ITK mit Peruser. In der Conflicts Zeile füge ich apache2-mpm-itk hinzu:
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 <ft@falkotimme.com>
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: multiuser MPM for Apache 2.2
The Peruser Multi-Processing Module (MPM) works in about the same way as the
classical "prefork" module (that is, without threads), except that it allows
you to constrain each individual vhost to a particular system user. This
allows you to run several different web sites on a single server without
worrying that they will be able to read each others' files.
.
Please note that this MPM is highly experimental, and is not from the same
tree as the other MPMs.
|
Nun ändern wir die rules Datei:
vi rules
Ersetze
cd apache2.2/ && patch -p1 < ../apache2.2-mpm-itk.patch |
mit
cd apache2.2/ && patch -p1 < ../httpd-2.2.3-peruser-0.3.0.patch |
Ersetze
sed 's,prefork,itk,;s,^".*/configure",../apache2.2/configure,;s,^"--srcdir=.*",--srcdir=../apache2.2/,' < /usr/share/apache2/build/config.nice > build-tree/config.nice |
mit
sed 's,prefork,peruser,;s,^".*/configure",../apache2.2/configure,;s,^"--srcdir=.*",--srcdir=../apache2.2/,' < /usr/share/apache2/build/config.nice > build-tree/config.nice |
Ersetze
install -m 0755 build-tree/apache2 debian/apache2-mpm-itk/usr/sbin/ |
mit
install -m 0755 build-tree/apache2 debian/apache2-mpm-peruser/usr/sbin/ |
Ersetze
echo "apache:Depends=apache2.2-common (= `dpkg -s apache2.2-common | grep ^Version: | cut -d" " -f2`)" >> debian/apache2-mpm-itk.substvars |
mit
echo "apache:Depends=apache2.2-common (= `dpkg -s apache2.2-common | grep ^Version: | cut -d" " -f2`)" >> debian/apache2-mpm-peruser.substvars |
Die vollständige Datei sieht folgendermassen aus:
#! /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
# workaround for 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
|
Das sind alle Änderungen die wir vornehmen mussten - nun können wir das Paket erstellen:
cd ..
dpkg-buildpackage
Das Paket wird im /usr/src Verzeichnis verfügbar sein:
cd /usr/src
ls -l
server1:/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#
Das MPM-peruser Paket, das wir gerade erstellt haben, wird apache2-mpm-peruser_2.2.3-01-1_i386.deb benannt. Bevor wir es installieren können, müssen wir das Apache2-MPM-prefork deinstallieren, da es mit dem Apache2-MPM-peruser konfligiert (denken wir an die control Datei):
apt-get remove apache2-mpm-prefork
server1:/usr/src# apt-get remove apache2-mpm-prefork
Reading package lists… Done
Building dependency tree… Done
The following packages will be REMOVED:
apache2-mpm-prefork libapache2-mod-php5
0 upgraded, 0 newly installed, 2 to remove and 68 not upgraded.
Need to get 0B of archives.
After unpacking 6115kB disk space will be freed.
Do you want to continue [Y/n]? <-- Y
(Reading database … 29620 files and directories currently installed.)
Removing libapache2-mod-php5 …
Module php5 disabled; run /etc/init.d/apache2 force-reload to fully disable.
Removing apache2-mpm-prefork …
Stopping web server (apache2)….
server1:/usr/src#
Leider wird dabei das libapache2-mod-php5 Paket entfernt, so dass PHP nicht mehr funktioniert. Darum werden wir und anschliessend kümmern.
- Vhosts mit separaten UIDs/GIDs mit Apache2-MPM-peruser auf Debian Etch nutzen - Seite 1
- Vhosts mit separaten UIDs/GIDs mit Apache2-MPM-peruser auf Debian Etch nutzen - Seite 2


Am 25.09.2008 um 09:21 Uhr
Gibt es Bestrebungen, dass “peruser” in Zukunft ein eigenständiges Debian Paket wird und von den anderen Paketen entsprechend erkannt wird?
Wie verhält es sich denn um Stabilität und Performance?
Und kann man somit bspw. SuPHP umgehen?