Isolieren von Apache-Virtualhosts vom Rest des Systems

11

Ich richte einen Webserver ein, der eine Reihe verschiedener Websites als Apache VirtualHosts hostet. Jede dieser Websites bietet die Möglichkeit, Skripte auszuführen (hauptsächlich PHP, möglicherweise andere).

Meine Frage ist, wie ich jeden dieser VirtualHosts voneinander und vom Rest des Systems isoliere. Ich möchte nicht, dass beispielsweise Website X die Konfiguration von Website Y oder einer der "privaten" Dateien des Servers liest.

Im Moment habe ich die VirtualHosts mit FastCGI, PHP und SUExec wie hier beschrieben eingerichtet ( http://x10hosting.com/forums/vps-tutorials/148894-debian-apache-2-2-fastcgi-php-5-suexec) -easy-way.html ), aber die SUExec verhindert nur, dass Benutzer andere als ihre eigenen Dateien bearbeiten / ausführen. Die Benutzer können weiterhin vertrauliche Informationen wie Konfigurationsdateien lesen.

Ich habe darüber nachgedacht, die globale UNIX-Leseberechtigung für alle Dateien auf dem Server zu entfernen, da dies das oben genannte Problem beheben würde, bin mir jedoch nicht sicher, ob ich dies sicher tun kann, ohne die Serverfunktion zu stören.

Ich habe mich auch mit der Verwendung von chroot befasst, aber es scheint, dass dies nur pro Server und nicht pro virtuellem Host möglich ist.

Ich suche nach Vorschlägen, die meine VirtualHosts vom Rest des Systems isolieren.

PS Ich verwende Ubuntu 12.04 Server

Meine ANTWORT: Ich endete damit, dass ich fast meiner aktuellen Konfiguration folgte, aber ein Chroot-Gefängnis für alle virtuellen Hosts durchführte, z. B. das Chroot-Gefängnis in /var/wwwund dann alle Benutzerdaten in Unterordnern mit Gruppen- / anderen R / W / X-Berechtigungen deaktiviert. Diese Option war besonders deshalb wünschenswert, weil alles ohne Änderungen am Quellcode möglich ist.

Ich habe die Antwort von @Chris ausgewählt, weil sie gründlich geschrieben wurde und auch FTP und SELinux berücksichtigt

JesperB
quelle

Antworten:

4

Dies kann durch Aktivieren des Moduls mod_users in Apache erfolgen.

Sie müssen UserDir in Ihrer Apache-Konfiguration einrichten. Ich schlage vor, dass Sie dies in einer separaten Konfigurationsdatei tun und diese einschließen. Wickeln Sie das Include in ein

<IfModule mod_users.c>
   Include conf/extra/userdir.conf
</IfModule>

Ich kann Ihnen das gesamte Tutorial geben, aber damit können Sie mit der Konfiguration von Apache beginnen: http://www.techytalk.info/enable-userdir-apache-module-ubuntu-debian-based-linux-distributions/

Hinweis Wenn Sie SELinux ausführen (und dies sollten Sie tun), müssen Sie Apache Lesezugriff auf die Benutzerheime gewähren. Sie können dies tun, indem Sie Folgendes einstellen:

sudo setsebool -P httpd_enable_homedirs=On

Außerdem sind Dateiberechtigungen für das Benutzerverzeichnis public_html und Empfangsberechtigungen für die übergeordneten Verzeichnisse bis zum Stammverzeichnis erforderlich.

Natürlich müssen Sie chroot für die Benutzer einrichten, zum Beispiel in vsftpd. Installieren:

apt-get vsftpd

Um das Chrooting zu konfigurieren, öffnen Sie /etc/vsftpd/vsftpd.conf mit vi oder nano. Suchen und kommentieren oder hinzufügen: chroot_local_user = yes

Sie können das gleiche Verhalten für SFTP erhalten, das ich über FTP empfehle, öffnen Sie / etc / ssh / sshd_config und fügen Sie einen Match-Block und diese Zeile hinzu:

Subsystem   sftp    internal-sftp

Match Group web_users
    ChrootDirectory %h
    ForceCommand internal-sftp
    AllowTcpForwarding no
Match

Dadurch wird jeder Benutzer in der Gruppe web_users chroot . Außerdem müssten Sie den Zugriff auf die Shell verweigern, indem Sie sie auf / sbin / nologin setzen:

useradd -G "web_users" -s /sbin/nologin new_user

Wenn dies ein öffentlicher Produktionsserver sein soll, empfehle ich dringend, dass Sie das Betriebssystem, OpenSSH, Apache, PHP, vsftpd etwas härten und einige strenge iptables und TCP-Wrapper anwenden. Ich empfehle Ihnen, SELinux auch an Ort und Stelle zu lassen.

Chris
quelle
3
Ich sehe nicht, wie mod_userdirvirtuelles Hosting von separaten Domains angeboten wird. Außerdem habe ich Bedenken hinsichtlich der Sicherheit in Bezug auf die Isolation, da ich zwischen den Benutzerverzeichnissen in Apache nichts darüber finden kann. Es scheint diese Funktion einfach nicht zu bieten.
Gertvdijk
6

Ich schlage vor, einen Blick auf suphpoder PHP-FPM zu werfen .

Grundsätzlich kann der PHP-Interpreter einem bestimmten Benutzer, der für diesen VirtualHost konfiguriert ist, "su". Auf diese Weise können Sie allgemeine Dateisystemberechtigungen verwenden, um jeden einzelnen VirtualHost zu isolieren.

Ich würde FPM aus Leistungsgründen empfehlen. Von der Homepage aus ist dies für Sie am interessantesten:

Interessant sind auch die Benutzer- und Gruppenoptionen pro Pool, mit denen Sie diesen bestimmten fpm-Pool unter der angegebenen UID und GID ausführen können. Auf Wiedersehen suphp!

gertvdijk
quelle
4

Schau hinein chroot.

Einige Ausgangspunkte:

Apache Chrooting leicht gemacht

Chroot-Umgebung für Apache (Debian)

Apache Chroot Jail: Virtuelles Hosting

Tacotuesday
quelle
1
Ich habe mir diese Links angesehen, aber es scheint nicht so, als könnte ich pro virtuellem Host chrooten. Vielleicht sollte ich ein globales www-Verzeichnis definieren, in das ich mich wie ein Chroot einarbeiten soll /var/www, und alle Hosts müssen sich dort in einem Unterverzeichnis befinden, wobei jedes dieser Unterverzeichnisse die globale Ausführungs- / Leseberechtigung entfernt hat?
JesperB
Mein Hauptpunkt war chroot, und Sie können es pro virtuellem Server tun. Hier ist ein Beispiel. In diesem Fall verwenden sie mod_chroot.
Tacotuesday