In dieser Anleitung wird erläutert, wie Sie mod_unixd mit Apache 2.4 auf einem Debian-Jessie-System einrichten. 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 Modul mod_chroot, das im 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. 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 /var/www-Verzeichnis 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 bietet, ist Teil der Apache-Kernmodule und wird 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. Debians Apache verwendet die PID-Datei /var/run/apache2.pid; wenn Apache nach /var/www chrooted wird, wird /var/run/apache2.pid zu /var/www/var/run/apache2.pid übersetzt. Deshalb erstellen wir jetzt dieses Verzeichnis:
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 wollen. Wir öffnen /etc/apache2/apache2.conf und fügen direkt unter der PidFile-Zeile 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 der Dokumentenstamm geändert hat (zum Beispiel wird ein DocumentRoot /var/www jetzt in DocumentRoot / übersetzt). Wir können dies entweder tun, indem wir die DocumentRoot-Direktive jedes vhost ändern, oder einfacher, indem wir einen symbolischen Link im Dateisystem erstellen.
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/web nun in DocumentRoot /web1/web übersetzt und so weiter. Wenn Sie diese Methode verwenden möchten, müssen Sie das 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 ausführen müssen und keine vhost-Konfiguration ändern müssen. Wir erstellen einen Symlink, der von /var/www/var/www auf /var/www:
zeigtmkdir -p /var/www/var
cd /var/www/var
ln -s ../../ www
Schließlich müssen wir Apache stoppen, einen symbolischen Link von /var/run/apache2.pid zu /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 ist es. Sie können Ihre Webseiten nun wie bisher aufrufen und sollten problemlos bedient werden, sofern es sich um statische HTML-Dateien handelt oder mod_php verwendet wird.
Ich werde das jetzt mit einer phpinfo() Seite testen. Öffnen Sie eine neue info.php-Datei mit nano im Dokumentenstammverzeichnis der Standard-Website:
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 die IP-Adresse im Browser, gefolgt von /info.php. Beispiel:
http://192.168.1.100/info.php
Die folgende Seite sollte jetzt erscheinen, wenn PHP korrekt funktioniert:
So weit so gut, aber woher wissen wir, ob Apache wirklich chrooted ist? Versuchen wir, auf eine Datei zuzugreifen, die sich außerhalb der 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:
Wie Sie sehen können, kann von diesem PHP-Skript 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. Perl, Ruby usw., dann müssen Sie den Interpreter (z. B. /usr/bin/perl usw.) zusammen mit allen vom Interpreter benötigten Bibliotheken in das Chroot-Gefängnis kopieren. Über die benötigten Bibliotheken können Sie sich mit dem ldd-Befehl informieren, z. B.
ldd /usr/bin/perl
[email protected]:/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)
[email protected]:/var/www/html#
oder verwenden Sie die Jailkit-Tools, um die Jail-Umgebung zu erstellen. Wenn Sie alle erforderlichen Dateien kopiert haben, die Seite aber immer noch nicht funktioniert, sollten Sie einen Blick in das Apache-Fehlerprotokoll /var/log/apache2/error.log werfen . 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/