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

Jetzt 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 ../../ www

Schließ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 stop
ln -s /var/www/var/run/apache2.pid /var/run/apache2.pid  
service apache2 start

Das 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.php

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

http://192.168.1.100/info.php

Die folgende Seite sollte jetzt angezeigt werden, wenn PHP korrekt funktioniert:

PHP-Infoseite.

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

mit folgendem Inhalt:

' . $var;

und öffnen Sie die URL zur Testdatei in einem Browser. Das Ergebnis ist:

Test Chroot

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

Wenn 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/perl
root@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

Share: X/Twitter LinkedIn

Erhalte neue Beiträge in deinem Posteingang.

Kein Spam. Jederzeit abmelden.