Apache Chroot · 4 min read · Dec 26, 2025
Chrooting Apache 2.4 mit mod_unixd auf Debian 8 (Jessie)
Diese Anleitung erklärt, wie man mod_unixd mit Apache 2.4 auf einem Debian Jessie System einrichtet. Mit mod_unixd können Sie Apache in einer sicheren Chroot-Umgebung ausführen und Ihren Server weniger anfällig für Einbruchsversuche machen, die versuchen, Schwachstellen in Apache oder Ihren installierten Webanwendungen auszunutzen. Das Modul mod_unixd ist ein Ersatz für das mod_chroot-Modul, das in der alten Apache 2.2 verwendet wurde.
1 Vorbemerkung
Ich gehe davon aus, dass Sie ein laufendes Debian 8 System mit einem funktionierenden Apache haben, z.B. wie in diesem Tutorial gezeigt: Debian 8 Jessie LAMP-Server-Tutorial mit Apache 2, PHP 5 und MariaDB. Darüber hinaus gehe ich davon aus, dass Sie eine oder mehrere Webseiten im Verzeichnis /var/www eingerichtet haben (z.B. wenn Sie ISPConfig verwenden).
Der Server, den ich hier verwende, hat die IP-Adresse 192.168.1.100 und den Hostnamen server1.example.com. Bitte ersetzen Sie diese Werte durch die IP-Adresse und den Hostnamen Ihres Servers, wo immer sie im Tutorial vorkommen.
2 Konfigurieren von Apache
Das Apache-Modul mod_unixd, das die Chroot-Funktion in Apache 2.4 bietet, ist Teil der Apache-Kernmodule und ist statisch in die Apache-Binärdatei auf Debian 8 kompiliert, sodass wir keine zusätzliche Software installieren müssen, um es zu verwenden.
Ich möchte das Verzeichnis /var/www als das Verzeichnis verwenden, das das Chroot-Gefängnis enthält. Der Apache von Debian verwendet die PID-Datei /var/run/apache2.pid; wenn Apache in /var/www chrooted ist, übersetzt sich /var/run/apache2.pid in /var/www/var/run/apache2.pid. Daher erstellen wir dieses Verzeichnis jetzt:
mkdir -p /var/www/var/run
chown -R root:root /var/www/var/runJetzt müssen wir Apache mitteilen, dass wir /var/www als unser Chroot-Verzeichnis verwenden möchten. Wir öffnen /etc/apache2/apache2.conf und fügen direkt unter der PidFile-Zeile eine ChrootDir-Zeile hinzu:
nano /etc/apache2/apache2.conf[...]
#
# PidFile: Die Datei, in der der Server seine Prozess-
# identifikationsnummer aufzeichnen sollte, wenn er startet.
# Dies muss in /etc/apache2/envvars festgelegt werden
#
PidFile ${APACHE_PID_FILE}
ChrootDir /var/www
[...] Als nächstes müssen wir unseren vhosts mitteilen, dass sich das Dokumentenstammverzeichnis geändert hat (zum Beispiel übersetzt sich ein DocumentRoot /var/www jetzt in DocumentRoot /). Wir können dies entweder tun, indem wir die DocumentRoot-Direktive jedes vhosts ändern, oder einfacher, indem wir einen Symlink im Dateisystem erstellen.
2.1 Erste Methode: Ändern des DocumentRoot
Angenommen, wir haben einen vhost mit DocumentRoot /var/www. Wir müssen jetzt die vhost-Konfiguration dieses vhosts öffnen und DocumentRoot /var/www in DocumentRoot / ändern. Dementsprechend würde sich DocumentRoot /var/www/web1/web jetzt in DocumentRoot /web1/web übersetzen, und so weiter. Wenn Sie diese Methode verwenden möchten, müssen Sie den DocumentRoot für jeden einzelnen vhost ändern.
2.2 Zweite Methode: Erstellen eines Symlinks im Dateisystem
Diese Methode ist einfacher, da Sie es nur einmal tun müssen und keine vhost-Konfiguration ändern müssen. Wir erstellen einen Symlink, der von /var/www/var/www auf /var/www zeigt:
mkdir -p /var/www/var
cd /var/www/var
ln -s ../../ wwwSchließlich müssen wir Apache stoppen, einen Symlink von /var/run/apache2.pid nach /var/www/var/run/apache2.pid erstellen und ihn erneut starten:
service apache2 stopln -s /var/www/var/run/apache2.pid /var/run/apache2.pid
service apache2 startDas war’s. Sie können jetzt Ihre Webseiten wie gewohnt aufrufen, und sie sollten ohne Probleme bereitgestellt werden, solange es sich um statische HTML-Dateien oder um mod_php handelt.
Ich werde dies jetzt mit einer phpinfo()-Seite testen. Öffnen Sie eine neue info.php-Datei mit nano im Dokumentenstamm der Standardwebsite:
nano /var/www/html/info.phpund fügen Sie den folgenden Inhalt hinzu:
Speichern Sie die Datei und öffnen Sie den Hostnamen Ihres Servers oder die IP-Adresse im Browser, gefolgt von /info.php. Beispiel:
Die folgende Seite sollte jetzt angezeigt werden, wenn PHP korrekt funktioniert:

So weit, so gut, aber wie wissen wir, ob Apache wirklich chrooted ist? Lassen Sie uns versuchen, auf eine Datei zuzugreifen, die sich außerhalb des Chroot befindet; ich werde hier zum Beispiel /etc/hosts verwenden.
nano /var/www/html/testchroot.phpmit folgendem Inhalt:
' . $var;und öffnen Sie die URL zur Testdatei in einem Browser. Das Ergebnis ist:

Wie Sie sehen können, kann der Inhalt der Datei /etc/hosts von diesem PHP-Skript nicht mehr zugegriffen werden.
Löschen Sie die Testdateien, wenn Sie sie nicht mehr benötigen:
rm /var/www/html/testchroot.php
rm /var/www/html/info.phpWenn Sie CGI verwenden, z.B. Perl, Ruby usw., müssen Sie den Interpreter (z.B. /usr/bin/perl usw.) zusammen mit allen Bibliotheken, die der Interpreter benötigt, in das Chroot-Gefängnis kopieren. Sie können die erforderlichen Bibliotheken mit dem ldd-Befehl herausfinden, z.B.
ldd /usr/bin/perlroot@server1:/var/www/html# ldd /usr/bin/perl
linux-vdso.so.1 (0x00007ffe951f4000)
libperl.so.5.20 => /usr/lib/x86_64-linux-gnu/libperl.so.5.20 (0x00007f1dafe54000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f1dafc50000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f1daf94f000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f1daf732000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f1daf387000)
libcrypt.so.1 => /lib/x86_64-linux-gnu/libcrypt.so.1 (0x00007f1daf150000)
/lib64/ld-linux-x86-64.so.2 (0x00007f1db0214000)
root@server1:/var/www/html#oder verwenden Sie die Jailkit-Tools, um die Gefängnisumgebung zu erstellen. Wenn Sie alle erforderlichen Dateien kopiert haben, die Seite jedoch immer noch nicht funktioniert, sollten Sie sich das Apache-Fehlerprotokoll /var/log/apache2/error.log ansehen. Normalerweise sagt es Ihnen, wo das Problem liegt.
3 Links
- mod_unixd: https://httpd.apache.org/docs/2.4/mod/mod_unixd.html
- Apache: http://httpd.apache.org/
- Debian: http://www.debian.org/
Erhalte neue Beiträge in deinem Posteingang.
Kein Spam. Jederzeit abmelden.