Chrooting Apache 2.4 mit mod_unixd auf Debian 8 (Jessie)

Dieses Handbuch 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 im alten Apache 2.2 verwendet wurde.

1 Vorbemerkung

Ich gehe davon aus, dass Sie ein lauffähiges 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 Websites im Verzeichnis /var/wwww 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 Apache konfigurieren

Das Apache-Modul mod_unixd, das die Chroot-Funktion in Apache 2.4 anbietet, ist Teil der Apache-Kernmodule und wird unter Debian 8 statisch in die Apache-Binary kompiliert, so dass wir keine zusätzliche Software installieren müssen, um es zu verwenden.

Ich möchte das Verzeichnis /var/wwww als Verzeichnis verwenden, das das chroot-Gefängnis enthält. Debians Apache verwendet die PID-Datei /var/run/apache2.pid; wenn der Apache nach /var/www gechroottet wird, übersetzt /var/run/apache2.pid nach /var/www/var/run/apache2.pid. Deshalb erstellen wir dieses Verzeichnis jetzt:

mkdir -p /var/www/var/run
chown -R root:root /var/www/var/run

Nun müssen wir dem Apache mitteilen, dass wir /var/wwww als unser Chroot-Verzeichnis verwenden wollen. Wir öffnen /etc/apache2/apache2.conf, und direkt unter der PidFile-Zeile fügen wir eine ChrootDir-Zeile hinzu:

nano /etc/apache2/apache2.conf
[...]
#
# PidFile: The file in which the server should record its process
# identification number when it starts.
# This needs to be set in /etc/apache2/envvars
#
PidFile ${APACHE_PID_FILE}
ChrootDir /var/www
[...]

Als nächstes müssen wir unseren vhosts mitteilen, dass sich die Document Root geändert hat (z.B. übersetzt ein DocumentRoot /var/wwww jetzt in DocumentRoot /). Wir können dies entweder durch Ändern der DocumentRoot-Direktive jedes VHosts oder einfacher durch Erstellen eines Symlinks im Dateisystem tun.


2.1 Erste Methode: Ändern des DocumentRoot

Nehmen wir an, wir haben einen vhost mit DocumentRoot /var/www. Wir müssen nun die vhost-Konfiguration dieses vhost öffnen und DocumentRoot /var/www in DocumentRoot / ändern. Dementsprechend würde DocumentRoot /var/www/web1/web1/web nun in DocumentRoot /web1/web übersetzen, und so weiter. Wenn Sie diese Methode verwenden möchten, müssen Sie DocumentRoot für jeden einzelnen Vhost ändern.

2.2 Zweite Methode: Erstellen eines Symlinks im Dateisystem

Diese Methode ist einfacher, da Sie sie nur einmal durchführen müssen und keine Vhost-Konfiguration ändern müssen. Wir erstellen einen Symlink, der von /var/www/var/www/var/www auf /var/wwww zeigt:

mkdir -p /var/www/var
cd /var/www/var
ln -s ../../ www

Schließlich müssen wir den Apache stoppen, einen Symlink von /var/run/apache2.pid nach /var/www/var/run/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 ist es. Das ist es. Sie können Ihre Webseiten nun wie bisher aufrufen, und sie sollten problemlos bedient werden, sofern es sich um statische HTML-Dateien oder mit mod_php handelt.

Ich werde das 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:

<php
phpinfo();

Speichern Sie die Datei und öffnen Sie den Hostnamen Ihres Servers oder Ihrer IP-Adresse im Browser, gefolgt von /info.php. Beispiel:

http://192.168.1.100/info.php

Die folgende Seite sollte nun erscheinen, wenn PHP korrekt funktioniert:

PHP-Infoseite.

So weit so gut, aber woher wissen wir, ob der Apache wirklich entwurzelt 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 diesem Inhalt:

<?php
$var = file_get_contents('/etc/hosts');
echo 'The content of /etc/hosts is: <br />' . $var;

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

Chroot testen

Wie du sehen kannst, kann von diesem PHP-Skript aus nicht mehr auf den Inhalt der Datei /etc/hosts 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, etc., dann müssen Sie den Interpreter (z.B. /usr/bin/perl, etc.) zusammen mit allen vom Interpreter benötigten Bibliotheken in das chroot-Gefängnis kopieren. Mit dem Befehl ldd können Sie sich über die benötigten Bibliotheken informieren, z.B. über

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 Jail-Umgebung aufzubauen. Wenn Sie alle erforderlichen Dateien kopiert haben, die Seite aber immer noch nicht funktioniert, sollten Sie sich das Apache-Fehlerprotokoll /var/log/apache2/error.log ansehen. Normalerweise sagt es dir, wo das Problem liegt.

3 Links

Das könnte Dich auch interessieren …