Ich möchte verschiedene PHP-Anwendungen auf meinem SL6.4-Webserver (RHEL 6.4-Neuerstellung) unterteilen, damit sie nicht auf die Daten der anderen zugreifen können. Es scheint, dass SELinux dazu in der Lage sein könnte, aber ich bin mir bei den Details nicht sicher. Meine Frage besteht aus zwei Teilen:
- Wie verwaltet SElinux PHP-Skripte, die im Apache-Prozess mit mod_php ausgeführt werden? Tritt der Prozess beim Ausführen des PHP-Skripts irgendwie in den Skriptkontext ein oder funktioniert dies nur, wenn Skripte über CGI oder FastCGI außer Betrieb ausgeführt werden? Wenn es zum Ausführen des PHP-Skripts in einen Skriptkontext übergeht, was verhindert, dass ein PHP-Fehler einen Übergang zurück zum Haupt-httpd-Kontext auslöst? Wenn ich eine alternative PHP-Bereitstellungsmethode benötige, wäre das gut zu wissen.
- Wie kann ich Skripte / Anwendungen trennen, damit TinyTinyRSS nicht auf Dinge zugreifen kann, die OpenCloud gehören? Es sieht so aus, als ob ich dazu in der Lage sein sollte, indem ich deaktiviere
httpd_unified
und separate Kontextehttpd_ttrss_*
undhttpd_opencloud_*
Sätze von Kontexten parallel zuhttpd_user_foo
und bereitstellehttpd_sys_foo
. Angesichts der Anzahl der Apps, die ich verwenden kann, kann es sogar ausreichen, die Unterscheidung zwischen System und Benutzer ohne neue Kontexte zu verwenden. Ich habe jedoch nicht viel Dokumentation darüber gefunden, welche Auswirkungen das Ausschalten genauhttpd_unified
hat oder wie verschiedene HTTP-Kontexte eingerichtet werden. Besonders bei PHP-Skripten läuft viamod_php
.
Ich kann problemlos neue SELinux-Richtlinienmodule erstellen, möchte jedoch eine Dokumentation, die darauf hinweist, was die neue Richtlinie bewirken muss und wie sie sich gut in die SELinux-Richtlinie integrieren lässt.
Wenn es ein verlorener Grund ist, diese Trennung nur mit SELinux zu versuchen, und ich separate httpds in verschiedenen Kontexten oder möglicherweise sogar LXC-Containern hochfahren muss, wäre dies ebenfalls eine nützliche Antwort.
Antworten:
Der beste Weg, um diese Trennungsstufe zu erreichen, besteht darin, keine Typübergänge, sondern Kategorie- / MCS-Übergänge zu verwenden. Dies verhält sich ein wenig wie die
svirt
Implementierung in libvirt KVM.OK, das erste, was Sie tun müssen, ist ein httpd-Modul namens herunterzuladen
mod_selinux
. Es schwebt schon seit einiger Zeit in den Fedora-Repos herum, hat es aber leider nie wirklich in die EL6-Systeme geschafft.In jedem Fall können Sie das Paket aus Fedora-Quellen neu erstellen. Ich habe dies auf einer Fedora-Maschine gemacht, aber Sie können das gleiche Paket einfach von einem Spiegel herunterladen. Ich habe F16 als Basis verwendet, während es läuft
httpd-2.2
.Wenn Sie es heruntergeladen haben, erstellen Sie es erneut auf Ihrer EL6-Box.
Installieren Sie schließlich das Modul.
Das RPM installiert ein Modul, für
httpd
das Sie benötigen, sowie eine Richtlinie, fürhttpd
die dies ebenfalls erforderlich ist.Die Datei für dieses Modul ist in installiert
/etc/httpd/conf.d/mod_selinux.conf
.Der erste Schritt in diesem Prozess besteht darin, die Anzahl der Kategorien zu erhöhen, unter denen der httpd-Hauptprozess ausgeführt wird, damit untergeordnete Threads erstellt werden können, die den richtigen Bereich umfassen. In der Datei ändern:
Zu
Jetzt müssen Sie jedem virtuellen Host in Apache eine Kategorie zuweisen. Dies erfolgt durch Hinzufügen einer Zeile wie im folgenden Beispiel
selinuxDomainVal
.Als Nächstes kennzeichnen Sie im Dokumentstamm für jeden Host die Dokumentwurzeln in derselben Kategorie wie die in der httpd-Konfiguration angegebenen.
Wenn Sie möchten, dass die Kennzeichnung bei einer erneuten Kennzeichnung des Systems berücksichtigt wird, sollten Sie auch die lokale Richtlinie aktualisieren!
Und das ist es! Es ist unmöglich, das Stammverzeichnis Ihres Dokuments zu verlassen und jetzt in anderen zu suchen.
quelle
mod_selinux
dies keinen vollständigen Schutz vor PHP-Fehlern bietet. Wenn ein Angreifer nach dem Ausnutzen eines virtuellen Hosts mit eingeschränktem Kontext eine kontrollierte Speicherbeschädigung ausführen kann, kann er möglicherweise Code in den Apache-Prozess einfügen, der im Standard-httpd-Kontext ausgeführt wird, oder Deaktivieren Sie diese Optionmod_selinux
für nachfolgende Anforderungen, die vom selben Arbeitsprozess verarbeitet werden. Caches wie APC werden auch von allen virtuellen Hosts gemeinsam genutzt. Wenn dies ein Problem darstellt, ist eine vollständige Prozesstrennung erforderlich (Verwendung von CGI oder FastCGI für PHP oder sogar separate httpd-Instanzen, wenn Sie auch vor httpd-Fehlern schützen möchten).setcurrent
. Ich habe unten eine zusätzliche Antwort mit Details hinzugefügt.Ich weiß, dass diese Frage 7 Jahre alt ist, aber die Antwort von @MatthewIfe oben war instrumental, erforderte aber ein paar zusätzliche Schritte. Wir verwenden CentOS8, das immer noch nicht im Lieferumfang enthalten ist. Die
mod_selinux
obige Antwort war also perfekt, um es zu installieren.Nach der Installation und nach einer korrekten Einrichtung konnte Apache jedoch die AVC-Tests nicht bestehen und konnte nicht gestartet werden. Die Fehler in dem
/var/log/httpd/error.log
,/var/log/messages
und/var/log/audit/audit.log
waren nicht sehr hilfreich.Am Ende musste ich zwei zusätzliche Dienstprogramme installieren, mit denen ich die Selinux-AVC-Fehler beheben konnte. Dies bedeutete, dass ich eine benutzerdefinierte Richtlinie erstellen musste, um dem
httpd
Dienst den Zugriff auf densetcurrent
Befehl unter Selinux zu ermöglichen.Die Lösung finden Sie hier: Apache vhost-Berechtigungstrennung mithilfe von SELinux-Kontexten unter CentOS8
Hoffe, das hilft allen anderen, darüber zu stolpern.
quelle