Apache Konfiguration · 6 min read · Jan 02, 2026

Vhosts unter separaten UIDs/GIDs mit Apache2 mpm-peruser auf Debian Etch ausführen

Vhosts unter separaten UIDs/GIDs mit Apache2 mpm-peruser auf Debian Etch ausführen

Version 1.0
Autor: Falko Timme

Dieser Artikel erklärt, wie Sie apache2-mpm-peruser auf einem Debian Etch-Server installieren und konfigurieren können. apache2-mpm-peruser ist ein MPM (Multi-Processing Module) für den Apache 2-Webserver, sehr ähnlich wie apache2-mpm-itk, aber schneller (fast so schnell wie apache2-mpm-prefork). mpm-peruser ermöglicht es Ihnen, jeden Ihrer vhosts unter einer separaten UID und GID auszuführen - kurz gesagt, die Skripte und Konfigurationsdateien für einen vhost müssen nicht mehr für alle anderen vhosts lesbar sein. Es basiert auf metuxmpm, einer funktionierenden Implementierung des perchild MPM. Das Ergebnis ist eine gesunde und sichere Webserver-Umgebung für Ihre Benutzer, ohne Bastellösungen wie PHPs safe_mode.

Dieses Dokument kommt ohne jegliche Gewährleistung! Ich gebe keine Garantie, dass dies für Sie funktioniert!

1 Vorbemerkung

Aus Geschwindigkeitsgründen werfen Sie einen Blick auf http://blog.stuartherbert.com/php/2008/03/20/using-mpm-peruser-to-secure-a-shared-server/.

Ich gehe davon aus, dass Sie eine funktionierende Apache2-Installation mit mod_php auf Ihrem Debian Etch-Server haben, z.B. installiert wie folgt:

apt-get install apache2-mpm-prefork libapache2-mod-php5

Wenn Sie eine PHP-Datei mit der Funktion phpinfo(); erstellen, z.B. so…

vi /var/www/info.php

| |

… und sie in einem Browser aufrufen, werden Sie sehen, dass prefork in der Zeile Geladene Module unter apache2handler aufgeführt ist:

2 Installation von apache2-mpm-peruser

Im Gegensatz zu apache2-mpm-itk ist apache2-mpm-peruser nicht als Debian-Paket verfügbar, daher werde ich mein eigenes Debian-Paket erstellen (ich werde das Quellpaket apache2-mpm-itk als Grundlage für den Aufbau meines apache2-mpm-peruser Debian-Pakets verwenden, da sie so ähnlich sind).

Bevor ich mit dem Erstellen des Pakets beginne, installiere ich einige Voraussetzungen:

apt-get install build-essential dpkg-dev fakeroot debhelper dpatch apache2-prefork-dev libcap-dev apache2-src autoconf

Dann gehe ich nach /usr/src und lade das Quellpaket apache2-mpm-itk 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 benenne ich das Verzeichnis apache2-mpm-itk in apache2-mpm-peruser um:

mv apache2-mpm-itk-2.2.3-01 apache2-mpm-peruser-2.2.3-01

Dann gehe ich in dieses Verzeichnis, lade den mpm-peruser-Patch herunter und lösche den bereits im Verzeichnis vorhandenen mpm-itk-Patch:

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

Jetzt gehen wir in das 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 benennen alle Dateien um, die itk im Dateinamen enthalten:

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

Als nächstes müssen wir die changelog-Datei ändern, z.B. so:

cat /dev/null > changelog  
vi changelog

| apache2-mpm-peruser (2.2.3-01-1) stable; urgency=low * Erster Port zu Apache 2.2. -- Falko Timme <[email protected]> Fri, 15 Aug 2008 14:29:36 +0100 |

Stellen Sie sicher, dass die letzte Zeile genau ein Leerzeichen am Anfang hat (vor –) und zwei Leerzeichen zwischen der E-Mail-Adresse und dem Datum!

Jetzt öffnen wir die control-Datei und ersetzen alle Vorkommen von apache2-mpm-itk durch apache2-mpm-peruser. Ich lasse die Beschreibung unverändert, ersetze jedoch ITK durch Peruser. In der Zeile Konflikte 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 <[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: multiuser MPM für Apache 2.2 Der Peruser Multi-Processing Module (MPM) funktioniert in etwa auf die gleiche Weise wie das klassische "prefork"-Modul (d.h. ohne Threads), außer dass es Ihnen ermöglicht, jeden einzelnen vhost auf einen bestimmten Systembenutzer zu beschränken. Dies ermöglicht es Ihnen, mehrere verschiedene Websites auf einem einzigen Server auszuführen, ohne sich Sorgen machen zu müssen, dass sie die Dateien des anderen lesen können. . Bitte beachten Sie, dass dieses MPM hochgradig experimentell ist und nicht aus dem gleichen Baum wie die anderen MPMs stammt. |

Als nächstes ändern wir die rules-Datei:

vi rules

Ersetzen Sie

| 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 |

Ersetzen Sie

| 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 |

Ersetzen Sie

| 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/ |

Ersetzen Sie

| 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 wie folgt 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 für 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 müssen - wir können jetzt das Paket erstellen:

cd ..  
dpkg-buildpackage

Das Paket wird im Verzeichnis /usr/src 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, heißt apache2-mpm-peruser_2.2.3-01-1_i386.deb. Bevor wir es installieren können, müssen wir apache2-mpm-prefork deinstallieren, da es mit apache2-mpm-peruser in Konflikt steht (denken Sie an die control-Datei):

apt-get remove apache2-mpm-prefork

server1:/usr/src# apt-get remove apache2-mpm-prefork
Lese Paketlisten… Fertig
Baue Abhängigkeitsbaum… Fertig
Die folgenden Pakete werden entfernt:
apache2-mpm-prefork libapache2-mod-php5
0 aktualisiert, 0 neu installiert, 2 zu entfernen und 68 nicht aktualisiert.
Möchten Sie fortfahren [Y/n]? <– Y
(Lese Datenbank … 29620 Dateien und Verzeichnisse sind derzeit installiert.)
Entferne libapache2-mod-php5 …
Modul php5 deaktiviert; führen Sie /etc/init.d/apache2 force-reload aus, um es vollständig zu deaktivieren.
Entferne apache2-mpm-prefork …
Webserver anhalten (apache2)….
server1:/usr/src#

Leider entfernt dies auch das Paket libapache2-mod-php5, sodass PHP nicht mehr funktioniert. Das werden wir gleich angehen.

Jetzt können wir das Paket apache2-mpm-peruser installieren:

dpkg -i apache2-mpm-peruser_2.2.3-01-1_i386.deb

Jetzt, wenn Sie versuchen, das Paket libapache2-mod-php5 erneut zu installieren, werden Sie sehen, dass apt darauf besteht, apache2-mpm-peruser zu entfernen und apache2-mpm-prefork neu zu installieren, was wir nicht wollen - daher brechen wir dies ab:

server1:/usr/src# apt-get install libapache2-mod-php5
Lese Paketlisten… Fertig
Baue Abhängigkeitsbaum… Fertig
Die folgenden zusätzlichen Pakete werden installiert:
apache2-mpm-prefork
Vorgeschlagene Pakete:
php-pear
Die folgenden Pakete werden entfernt:
apache2-mpm-peruser
Die folgenden neuen Pakete werden installiert:
apache2-mpm-prefork libapache2-mod-php5
0 aktualisiert, 2 neu installiert, 1 zu entfernen und 61 nicht aktualisiert.
Möchten Sie fortfahren [Y/n]? <– n
Abbrechen.
server1:/usr/src#

Dies geschieht, weil der Maintainer beim Erstellen des Pakets libapache2-mod-php5 ihm mitgeteilt hat, dass es entweder von apache2-mpm-prefork oder apache2-mpm-itk abhängt. Das bedeutet, dass wir libapache2-mod-php5 aus den Quellen neu erstellen und das Paket apache2-mpm-peruser zu den Abhängigkeiten dieses Pakets hinzufügen müssen (Sie können dies auch mit jedem anderen Paket tun, wenn Sie dasselbe Problem mit anderen Paketen haben). Ich werde darauf gleich eingehen.

Share: X/Twitter LinkedIn

Erhalte neue Beiträge in deinem Posteingang.

Kein Spam. Jederzeit abmelden.