Multi-Site-Hosting - wichtige Sicherheitslücke wird übersehen, um Websites voreinander zu schützen?

9

EDIT # 2 23. Juli 2015: Auf der Suche nach einer neuen Antwort, die ein wichtiges Sicherheitselement identifiziert, das in der folgenden Konfiguration übersehen wurde, oder Grund zur Annahme geben kann, dass alles abgedeckt ist.

EDIT # 3 29. Juli 2015: Ich bin besonders auf der Suche nach einer möglichen Fehlkonfiguration, z. B. weil ich versehentlich etwas zulasse, das ausgenutzt werden könnte, um Sicherheitsbeschränkungen zu umgehen, oder schlimmer noch, etwas offen lässt.

Dies ist ein Setup für mehrere Sites / gemeinsam genutztes Hosting. Wir möchten eine gemeinsam genutzte Apache-Instanz verwenden (dh unter einem Benutzerkonto ausführen), wobei jedoch PHP / CGI als Benutzer jeder Website ausgeführt wird, um sicherzustellen, dass keine Site auf die Dateien einer anderen Site zugreifen kann Stellen Sie sicher, dass nichts übersehen wird (z. B. wenn wir nichts über die Verhinderung von Symlink-Angriffen wissen).

Folgendes habe ich bisher:

  • Stellen Sie sicher, dass PHP-Skripte als Linux-Benutzerkonto und -Gruppe der Website ausgeführt werden und entweder inhaftiert sind (z. B. mithilfe von CageFS) oder zumindest mithilfe von Linux-Dateisystemberechtigungen ordnungsgemäß eingeschränkt sind.
  • Verwenden Sie suexec, um sicherzustellen, dass CGI-Skripte nicht als Apache-Benutzer ausgeführt werden können.
  • Wenn Sie serverseitige Include-Unterstützung benötigen (z. B. in HTML-Dateien), verwenden Options IncludesNOEXECSie diese Option, um zu verhindern, dass CGI ausgeführt werden kann, wenn Sie dies nicht erwarten (obwohl dies bei Verwendung von suexec nicht so wichtig sein sollte).
  • Haben Sie einen Symlink-Angriffsschutz, damit ein Hacker Apache nicht dazu verleiten kann, die Dateien einer anderen Website als Klartext bereitzustellen und ausnutzbare Informationen wie DB-Passwörter offenzulegen.
  • Konfigurieren Sie AllowOverride/, AllowOverrideListum nur Anweisungen zuzulassen, die ein Hacker nicht ausnutzen konnte. Ich denke, dies ist weniger besorgniserregend, wenn die oben genannten Punkte ordnungsgemäß ausgeführt werden.

Ich würde mich für MPM ITK entscheiden, wenn es nicht so langsam wäre und nicht als Root ausgeführt würde, aber wir möchten speziell einen gemeinsam genutzten Apache verwenden und dennoch sicherstellen, dass dies sicher durchgeführt wird.

Ich habe http://httpd.apache.org/docs/2.4/misc/security_tips.html gefunden , aber es war zu diesem Thema nicht umfassend.

Wenn es hilfreich ist zu wissen, planen wir die Verwendung von CloudLinux mit CageFS und mod_lsapi.

Gibt es noch etwas zu tun oder zu wissen?

BEARBEITEN 20. Juli 2015: Die Leute haben einige gute alternative Lösungen eingereicht, die im Allgemeinen wertvoll sind. Bitte beachten Sie jedoch, dass diese Frage nur die Sicherheit eines gemeinsam genutzten Apache-Setups betrifft. Konkret gibt es etwas, das oben nicht behandelt wurde und das es einer Site ermöglichen könnte, auf die Dateien einer anderen Site zuzugreifen oder andere Sites irgendwie zu gefährden?

Vielen Dank!

sa289
quelle
Warten Sie so sind Sie oder blockieren Sie nicht Befehle wie shell_exec
Michael Bailey
Oder eher Funktionen. Keine Befehle.
Michael Bailey
1
Richtig - wir blockieren diese Befehle nicht. Da CageFS PHP in so hohem Maße isoliert, scheint es sich nicht zu lohnen, solche Befehle als Teil eines Tiefenverteidigungsansatzes einzuschränken, da wir sie manchmal für legitime Zwecke verwenden. Wenn der Server ein wertvolles Ziel für Hacker wäre (z. B. gespeicherte Kreditkartendaten oder ähnliches), könnten die Vorteile die Nachteile überwiegen, aber in unserem Fall halte ich die Einschränkung nicht für gerechtfertigt. Dies ist definitiv eine Überlegung wert für Leute, die CageFS oder eine gleichwertige Lösung nicht verwenden.
Sa289
1
Leider haben Sie wegen CPanel gute Antworten abgezinst - der Rest ist Geschichte.
user9517
2
Hier ist eine Zusammenfassung der Gründe, warum ich diese Antworten "abgezinst" habe. Dedizierter Apache pro Site oder Docker-Container - erfordert mehr dedizierte öffentliche IP-Adressen oder zusätzliche Komplexität des Reverse-Proxys. Selinux - erfordert die Konfiguration und Ausführung von Selinux im Erzwingungsmodus. VMs - erfordert zusätzliche Systemressourcen gegenüber einem Nicht-VM-Setup. Ich denke, das sind alles gute Lösungen, nur nicht ohne Nachteile, mit denen ich lieber nicht gehen möchte.
Sa289

Antworten:

9

Ich stimme den Artikeln, die Sie bisher haben, voll und ganz zu.

Ich habe vor ein paar Jahren ein solches Mehrbenutzer-Setup ausgeführt und im Grunde den gleichen Kompromiss gefunden: mod_php ist schnell (teilweise, weil alles im selben Prozess läuft) und suexec ist langsam, aber sicher (weil jede Anfrage eine neue fordert Prozess). Ich habe mich für suexec entschieden, weil eine Benutzerisolation erforderlich war.

Derzeit gibt es eine dritte Option, die Sie in Betracht ziehen könnten: Geben Sie jedem Benutzer einen eigenen php-fpm-Daemon. Ob dies machbar ist, hängt von der Anzahl der Benutzer ab, da jeder von ihnen mindestens einen PHP-Fpm-Prozess über sein Benutzerkonto erhalten muss (der Dämon verwendet dann einen Prefork-ähnlichen Mechanismus, um Anforderungen zu skalieren, also die Anzahl der Prozesse und ihre Speichernutzung kann einschränkende Faktoren sein). Sie benötigen auch eine automatisierte Konfigurationsgenerierung, die jedoch mit einigen Shell-Skripten möglich sein sollte.

Ich habe diese Methode nicht in großen Umgebungen verwendet, aber meiner Meinung nach ist dies eine gute Lösung, um eine gute Leistung der PHP-Website zu erzielen und gleichzeitig Benutzer auf Prozessebene zu isolieren.

mschuett
quelle
Korrigieren Sie mich, wenn ich falsch liege, aber ich denke, die mod_lsapi + CageFS-Lösung, die wir bereits für PHP planen, ist mindestens genauso gut, wenn nicht besser als PHP-FPM, nicht wahr? Danke
sa289
Ich habe keine Erfahrung mit mod_lsapi und hätte Vorbehalte gegen eine Closed-Source-Lösung für einzelne Anbieter. Aber laut Werbeseite sollte es genauso gut und genauso schnell sein, ja. - Ein Punkt, den ich untersuchen möchte, ist, wie neue Prozesse (auf neue Anforderungen) erzeugt werden und wie die effektive Benutzer-ID in die des Benutzers geändert wird. In Bezug auf die Sicherheit ist dies der schwächste Punkt. Die suexec-Dokumentation enthält eine gute Erklärung der Dinge, auf die Sie achten müssen.
Mschuett
Ich nehme an, es gibt Grund, weder Closed noch Open Source zu vertrauen, hehe (Shellshock hat 25 Jahre gebraucht, um es zu entdecken, Heartbleed 2 Jahre, und wer weiß über TrueCrypt Bescheid). Glücklicherweise denke ich, dass mod_lsapi auf dem Open-Source-Angebot von LiteSpeed ​​basiert. Es gibt also mindestens ein paar Anbieter, die sich einige davon ansehen, und wer auch immer sich den Open-Source-Code ansehen möchte, auf dem es basiert. Ich bin besonders auf der Suche nach wichtigen Sicherheitsaspekten, die im vorgeschlagenen Setup fehlen könnten (z. B. PHP als Benutzer der Site ausführen, aber suEXEC für CGI-Skripte vergessen). Danke
sa289
Wir verwenden diesen Ansatz (Webserver mit PHP-Fpm) auf ziemlich großen Websites (auf denen die Webserver-Farm über einen Load-Balancer eine Verbindung zur PHP-Fpm-Farm herstellt). Das Schöne an einer solchen Konfiguration ist, dass virtuelle Hosts auf Betriebssystemebene getrennt werden und diese Grenze nicht leicht umgangen werden kann (stellen Sie einfach sicher, dass das Home-Verzeichnis des virtuellen Hosts über Berechtigungen wie 0710 verfügt, die dem vhost-Benutzer und der Gruppe des Webserver-Prozesses gehören , dann ist es eine Frage der richtigen Berechtigungen - wenn eine Dateiwelt lesbar ist, ist sie für den Webserver zugänglich)
Galaxie
4

Alles, was Sie bisher haben, scheint gut durchdacht. Das einzige, was ich als Problem sehen könnte, ist die Tatsache, dass die meisten Exploits versuchen, auf die eine oder andere Weise Root-Zugriff zu erhalten. Selbst wenn jede Site und ihre entsprechenden Prozesse und Skripte korrekt inhaftiert sind und alles seinen eigenen Benutzer und seine eigenen Berechtigungen hat, könnte es einen Hacker mit root nicht weniger interessieren, sie werden einfach alles umgehen, was Sie eingerichtet haben.

Mein Vorschlag wäre, eine Art VM-Software (VMware, VirtualBox, Qemu usw.) zu verwenden, um jeder Site ein eigenes Betriebssystem-Gefängnis zu geben. Auf diese Weise können Sie sich als Systemadministrator keine Sorgen um eine einzelne gefährdete Site machen. Wenn ein Hacker durch das Ausnutzen von PHP (oder einer anderen Software) auf der VM eines Standorts Wurzeln schlägt, halten Sie die VM einfach an und sezieren Sie sie später, wenden Sie Korrekturen an oder kehren Sie in einen ununterbrochenen Zustand zurück. Auf diese Weise können die Site-Administratoren auch bestimmte Software- oder Sicherheitseinstellungen auf ihre spezifische Site-Umgebung anwenden (wodurch möglicherweise eine andere Site beschädigt wird).

Die einzige Einschränkung ist Ihre Hardware, aber mit einem anständigen Server und den richtigen Kernel-Erweiterungen ist dies einfach zu handhaben. Ich habe diese Art von Setup erfolgreich auf einem Linode ausgeführt, vorausgesetzt, sowohl der Host als auch der Gast waren sehr, sehr spärlich. Wenn Sie mit der Befehlszeile vertraut sind, von der ich annehme, dass Sie es sind, sollten Sie keine Probleme haben.

Diese Art der Einrichtung reduziert die Anzahl der Angriffsvektoren, die Sie überwachen müssen, und ermöglicht es Ihnen, sich auf die Sicherheit der Host-Maschinen zu konzentrieren und alles andere auf Site-by-Site-Basis zu erledigen.

T. Thomas
quelle
Ich bin damit einverstanden, dass sie eine bessere Sicherheit bieten und andere Vorteile haben, aber auch Nachteile, von denen einige von Ihnen erwähnt wurden. Die Voraussetzung für diese Frage ist jedoch ein gemeinsamer Apache. Mit CageFS sollte die Wahrscheinlichkeit eines Root-Exploits verringert werden - nicht so effektiv wie bei einer VM, aber auf ein Niveau, das ich angesichts der von uns betriebenen Websites gut finde. Mein Hauptziel ist es, Fehltritte bei der richtigen Sicherheit zu vermeiden, sodass es ein perfekter Sturm sein muss, damit jemand Root-Zugriff erhält. Zum Beispiel hätte ich leicht sehen können, dass ich in der Vergangenheit nichts über Symlink-Angriffe wusste und dass dies ein schwerwiegender Fehler war. Thx
sa289
4

Ich würde vorschlagen, dass jede Site unter einem eigenen Apache-Daemon ausgeführt wird und Apache chrootet. Alle System-PHP-Funktionen schlagen fehl, da die Apache-Chroot-Umgebung keinen Zugriff auf / bin / sh hat. Dies bedeutet auch, dass die mail () -Funktion von php nicht funktioniert. Wenn Sie jedoch einen externen Mail-Anbieter verwenden, um E-Mails von Ihrer E-Mail-Anwendung zu versenden, sollte dies für Sie kein Problem sein.

Alpha01
quelle
Ich würde es gerne so machen - wir haben es in der Vergangenheit so gemacht (abzüglich des Chrootings), aber leider hindert es uns daran, ein Standard-Control-Panel-Setup zu verwenden, und es werden auch dediziertere IP-Adressen benötigt, sofern nicht mehr getan wird -Kompliziertes Reverse-Proxy-Setup, bei dem Apache interne IP-Adressen abhört, wie sie auf der Apache-Site dokumentiert sind.
Sa289
Ah ja, das ist ein guter Punkt, den Sie dort erwähnt haben. Es wird definitiv mehr als IP dedizierte IP erfordern oder auf einen Reverse Proxy zurückgreifen müssen.
Alpha01
Wenn jemand, der diese Antwort liest, an der Dokumentation für das Reverse-Proxy-Setup interessiert ist, lesen
Sie
4

SELinux könnte hilfreich sein bei mod_selinux. Eine kurze Anleitung finden Sie hier:

Wie kann ich mit SELinux PHP-Skripte einschränken?

Da die Anweisungen etwas veraltet sind, habe ich überprüft, ob dies unter RHEL 7.1 funktioniert:

Ich habe die Version von Fedora 19 verwendet und mit Mock gegen RHEL 7.1 + EPEL kompiliert.

YMMV, wenn Sie das grundlegende Epel-Konfigurationsmodell verwenden, wird geliefert mit:

[mockbuild@fedora mod_selinux]$ mock -r rhel-7-x86_64 --rebuild \
    mod_selinux-2.4.3-2.fc19.src.rpm

Aktualisieren Sie zuerst Ihr Zielsystem, um sicherzustellen, dass selinux-policyes aktuell ist.

Auf der Zielbox installieren (oder zuerst auf Ihrem lokalen Spiegel installieren):

yum localinstall mod_selinux-2.4.3-2.el7.x86_64.rpm

Jetzt müssen Sie jedem virtuellen Host in Apache eine Kategorie zuweisen. Dies erfolgt durch Hinzufügen einer Zeile wie im folgenden Beispiel selinuxDomainVal.

<VirtualHost *:80>
    DocumentRoot /var/www/vhosts/host1
    ServerName host1.virtual
    selinuxDomainVal *:s0:c0
</VirtualHost>

<VirtualHost *:80>
    DocumentRoot /var/www/vhosts/host2
    ServerName host2.virtual
    selinuxDomainVal *:s0:c1 
</VirtualHost>

Als Nächstes kennzeichnen Sie im Dokumentstamm für jeden Host die Dokumentwurzeln in derselben Kategorie wie die in der httpd-Konfiguration angegebenen.

chcon -R -l s0:c0 /var/www/vhosts/host1
chcon -R -l s0:c1 /var/www/vhosts/host2

Wenn Sie möchten, dass die Kennzeichnung bei einer erneuten Kennzeichnung des Systems berücksichtigt wird, sollten Sie auch die lokale Richtlinie aktualisieren!

semanage fcontext -a -t httpd_sys_content_t -r s0-s0:c0 '/var/www/vhosts/host1(/.*)?' 
semanage fcontext -a -t httpd_sys_content_t -r s0-s0:c1 '/var/www/vhosts/host2(/.*)?'
füro
quelle
Ich mag die Idee, aber ich müsste Selinux auf dem Server aktivieren, was andere Schwierigkeiten mit sich bringen kann. +1, da ich denke, dass es eine großartige Lösung für Leute sein könnte, denen das nichts ausmacht.
Sa289
4

Es gibt bereits viele gute technische Antworten (siehe auch /security//q/77/52572 und Tipps zum Sichern eines LAMP-Servers ), die ich hier jedoch noch erwähnen möchte Ein wichtiger Punkt (aus einer weiteren Perspektive) zur Sicherheit: Sicherheit ist ein Prozess . Ich bin mir sicher, dass Sie dies bereits in Betracht gezogen haben, aber ich hoffe immer noch, dass es nützlich sein könnte (auch für andere Leser), es manchmal zu überdenken.

In Ihrer Frage konzentrieren Sie sich beispielsweise hauptsächlich auf die technischen Maßnahmen: "Diese Frage bezieht sich nur auf die Sicherheit eines gemeinsam genutzten Apache-Setups. Insbesondere gibt es Sicherheitsschritte, die wichtig sind, aber in der obigen Liste fehlen, wenn sie gemeinsam genutzt werden." Apache und PHP. "

Fast alle Antworten hier und auf andere 2 Fragen, die ich erwähnt habe, scheinen ebenfalls rein technisch zu sein (mit Ausnahme der Empfehlung, auf dem Laufenden zu bleiben). Und aus meiner Sicht könnte dies einigen Lesern den irreführenden Eindruck vermitteln, dass Sie für immer sicher bleiben, wenn Sie Ihren Server einmal nach den Best Practices konfigurieren. Vergessen Sie also bitte nicht die Punkte, die ich in den Antworten vermisse:

  1. Vergessen Sie zunächst nicht, dass Sicherheit ein Prozess ist und insbesondere der "Plan-Do-Check-Act" -Zyklus, wie er von vielen Standards empfohlen wird, einschließlich ISO 27001 ( http://www.isaca.org/). Journal / archives / 2011 / Volume-4 / Pages / Planning-for-and-Implementing-ISO27001.aspx ). Grundsätzlich bedeutet dies, dass Sie Ihre Sicherheitsmaßnahmen regelmäßig überarbeiten, aktualisieren und testen müssen .

  2. Aktualisieren Sie Ihr System regelmäßig. Dies hilft nicht gegen gezielte Angriffe mit Zero-Day-Schwachstellen, sondern gegen fast alle automatisierten Angriffe.

  3. Überwachen Sie Ihr System. Ich vermisse diesen Punkt in den Antworten wirklich. Aus meiner Sicht ist es äußerst wichtig, so früh wie möglich über Probleme mit Ihrem System informiert zu werden.

    Dies sagt die Statistik dazu aus: "Die durchschnittliche Zeit von der Infiltration bis zur Entdeckung beträgt 173,5 Tage" ( http://www.triumfant.com/detection.html ), "205 mittlere Anzahl von Tagen vor der Erkennung" ( https: // www2 .fireeye.com / rs / fireye / images / rpt-m-Trends-2015.pdf ). Und ich hoffe, dass diese Zahlen nicht das sind, was wir alle haben wollen.

    Es gibt viele Lösungen (einschließlich kostenloser), die nicht nur den Status des Dienstes überwachen (wie Nagios), sondern auch Intrusion Detection-Systeme (OSSEC, Snort) und SIEM-Systeme (OSSIM, Splunk). Wenn es zu kompliziert wird, können Sie zumindest "fail2ban" aktivieren und / oder Ihre Protokolle an einen separaten Syslog-Server weiterleiten und E-Mail-Benachrichtigungen über wichtige Ereignisse erhalten.

    Auch hier ist der wichtigste Punkt nicht, welches Überwachungssystem Sie wählen, sondern der wichtigste ist, dass Sie eine Überwachung haben und diese regelmäßig gemäß Ihrem "Plan-Do-Check-Act" -Zyklus überarbeiten .

  4. Seien Sie sich der Schwachstellen bewusst. Gleich wie Überwachung. Abonnieren Sie einfach eine Schwachstellenliste, um benachrichtigt zu werden, wenn eine kritische Schwachstelle für Apache oder einen anderen für Ihr Setup wichtigen Dienst entdeckt wird. Ziel ist es, über die wichtigsten Dinge informiert zu werden, die vor Ihrem nächsten geplanten Update angezeigt werden.

  5. Planen Sie, was im Falle eines Vorfalls zu tun ist (und aktualisieren und überarbeiten Sie ihn regelmäßig gemäß Ihrem "Plan-Do-Check-Act" -Zyklus). Wenn Sie Fragen zur sicheren Konfiguration stellen, bedeutet dies, dass die Sicherheit Ihres Systems für Sie wichtig wird. Was sollten Sie jedoch tun, wenn Ihr System trotz aller Sicherheitsmaßnahmen gehackt wurde? Auch hier meine ich nicht nur technische Maßnahmen wie "OS neu installieren": Wo sollten Sie einen Unfall nach geltendem Recht melden? Dürfen Sie Ihren Server sofort herunterfahren / trennen (wie viel kostet es für Ihr Unternehmen)? Wer sollte kontaktiert werden, wenn die Hauptverantwortliche im Urlaub / krank ist?

  6. Haben Sie einen Sicherungs-, Archivierungs- und / oder Ersatz- / Replikationsserver. Sicherheit bedeutet auch die Verfügbarkeit Ihres Dienstes. Überprüfen Sie regelmäßig Ihre Sicherung / Archivierung / Replikation und testen Sie auch regelmäßig die Wiederherstellungsverfahren.

  7. Penetrationstests? (siehe auch "Plan-Do-Check-Act" -Zyklus :) Wenn es Ihnen zu viel vorkommt, können Sie zumindest einige kostenlose Online-Tools ausprobieren, die Ihre Webdienste auf Malware und Sicherheitsprobleme prüfen.

Andrey Sapegin
quelle
1
Gute Ergänzung für Menschen zu beachten. Für den Fall, dass es für jemanden hilfreich ist, habe ich viel Zeit damit verbracht, die ersten beiden von Ihnen geposteten Links und deren Links zu durchsuchen, um festzustellen, ob ich etwas Wichtiges finden konnte, das ich verpasst habe. Die Ressourcen von denen verbunden , dass ich dachte , waren die sehr hilfreich waren benchmarks.cisecurity.org/downloads/show-single/... und iase.disa.mil/stigs/app-security/web-servers/Pages/index.aspx , obwohl es gab eine anständige Überlappung zwischen den beiden. Ich bin auf nichts Wichtiges gestoßen, aber trotzdem lesenswert, wenn Sicherheit an erster Stelle steht.
Sa289
3

Ihr Anwendungsfall ist ideal für Docker-Container.

Jeder Container kann einen Kunden oder Client darstellen, wobei jeder Apache-Containergruppe als zusätzliche Sicherheit eindeutige Benutzer-IDs zugewiesen werden. Der Schlüssel wäre, Root-Berechtigungen beim Start des Containers zu löschen, bevor Sie Ihren Apache-Stack starten. Jeder Kunde erhält seinen eigenen DB-Service mit seinen eigenen eindeutigen Passwörtern, ohne dass Dutzende virtueller Maschinen aufstehen müssen, von denen jede ihren eigenen speziellen Schneeflocken-Kernel und anderen Overhead benötigt. Im Zentrum von Docker steht schließlich die Chroot. Bei richtiger Verwaltung würde ich das jeden Tag über einen typischen virtuellen Cluster übernehmen.

Stephan
quelle
Würde dies bedeuten, dass es effektiv einen dedizierten Apache-Daemon pro Client geben würde? Wenn ja, würde der Nachteil meiner Meinung nach der Antwort von Alpha01 ähneln.
Sa289
Ja, es ist Alpha01 sehr ähnlich, obwohl das Andocken der Anwendungen einen Großteil der Kopfschmerzen bei der Hostkonfiguration beseitigt. Das Problem mit dem Control Panel besteht jedoch weiterhin, unabhängig davon, ob Sie den Chroot / Container-Ansatz oder den One-VM-per-Client-Ansatz verwenden.
Stephan
Vielen Dank. Selbst ohne ein Control Panel würde ich es lieber vermeiden, einen Reverse-Proxy durchführen zu müssen oder mehr öffentliche IPs zu benötigen, es sei denn, ich verstehe falsch, wie dieses Setup funktionieren würde.
Sa289
1
Die meisten Geschäfte, die ich gesehen habe (große und kleine), verwenden den Reverse-Proxy-Ansatz. Ich persönlich benutze HAProxy, es ist ideal für die Art von Isolation in großem Maßstab geeignet, die Sie suchen. Es ist sehr leistungsfähig und ermöglicht Ihnen eine sehr effiziente horizontale Skalierung. Es erfordert nicht die exotische Komplexität, die in der Lösung von mschuett offensichtlich zu sein scheint.
Stephan
2

Viele gute Vorschläge hier schon. Es gibt Dinge, die bisher in der Diskussion vermisst wurden.

Achten Sie auf Prozesse außerhalb der Prozesse, die im Rahmen der Bereitstellung von Webseiten ausgeführt werden. Stellen Sie also sicher, dass alle Ihre Cron-Jobs, die nicht vertrauenswürdige Daten berühren, als der entsprechende Benutzer und im entsprechenden Gefängnis ausgeführt werden, unabhängig davon, ob diese Jobs vom Benutzer definiert wurden oder nicht.

Nach meiner Erfahrung werden Dinge wie die Protokollanalyse, wenn sie vom Hosting-Service bereitgestellt werden, fast so oft wie nicht als Root ausgeführt, und die Protokollanalyse-Software wird nicht so oft auf Sicherheit geprüft, wie wir möchten. Dies gut zu machen ist etwas schwierig und vom Setup abhängig. Einerseits möchten Sie nicht, dass Ihr Apache-Prozess im Root-Besitz (dh der übergeordnete Prozess) in ein Verzeichnis schreibt, das der Benutzer gefährden könnte. Das bedeutet wahrscheinlich, nicht direkt ins Gefängnis zu schreiben. Auf der anderen Seite müssen Sie diese Dateien den Prozessen im Gefängnis zur Analyse zur Verfügung stellen, und Sie möchten, dass dies so zeitnah wie möglich ist. Wenn Sie Ihren Jails mit den Protokollen Zugriff auf eine schreibgeschützte Bereitstellung eines Dateisystems gewähren können, sollte dies in Ordnung sein.

PHP-Apps stellen normalerweise keine eigenen statischen Dateien bereit. Wenn Sie einen gemeinsam genutzten Apache-Prozess haben, dann schätze ich, dass Ihr Apache-Prozess Inhalte direkt aus den Gefängnissen der Host-Umgebung liest. Wenn ja, dann wirft dies eine Vielzahl von Bedenken auf.

.htaccessDateien sind offensichtlich, bei denen Sie sehr vorsichtig sein müssen, was Sie zulassen. Viele, wenn nicht die umfangreichsten PHP-Apps sind sehr abhängig von .htaccess-Dateianordnungen, die Sie wahrscheinlich nicht zulassen können, ohne Ihr geplantes Schema zu untergraben.

Weniger offensichtlich ist, wie Apache entscheidet, was eine statische Datei ist. zB Was macht es mit einer *.php.gifoder *.php.enDatei? Wenn dieser oder ein anderer Mechanismus die Unterscheidung in Bezug auf eine statische Datei täuscht, kann Apache dann überhaupt PHP von außerhalb des Gefängnisses ausführen? Ich würde einen separaten, leichten Webserver für statische Inhalte einrichten, der nicht mit Modulen für die Ausführung dynamischer Inhalte konfiguriert ist, und einen Load Balancer haben, der entscheidet, welche Anforderungen an den statischen Server und welche an den dynamischen Server gesendet werden sollen.

In Bezug auf Stefans Docker-Vorschlag ist es möglich, einen einzelnen Webserver zu haben, der sich außerhalb des Containers befindet und mit PHP-Daemons in jedem Container über den dynamischen Inhalt kommuniziert, während ein zweiter Webserver in einem Docker-Container vorhanden ist die die Volumes teilt, die jeder für seinen Inhalt verwendet, und somit in der Lage ist, den statischen Inhalt bereitzustellen, der dem im vorherigen Absatz sehr ähnlich ist. Ich empfehle Docker unter den verschiedenen Ansätzen vom Gefängnistyp, aber mit diesem oder anderen Ansätzen vom Gefängnistyp müssen Sie eine Reihe anderer Probleme lösen. Wie funktioniert das Hochladen von Dateien? Fügen Sie in jeden Container Dateiübertragungs-Daemons ein? Nehmen Sie einen Git-basierten Ansatz im PAAS-Stil? Wie können Sie im Container generierte Protokolle zugänglich machen? und sie umdrehen? Wie verwalten und führen Sie Cron-Jobs aus? Werden Sie den Benutzern irgendeine Art von Shell-Zugriff gewähren, und wenn ja, ist das ein weiterer Daemon im Container? usw. usw.

mc0e
quelle
Vielen Dank. Um Ihre Frage zu beantworten: Es ist nicht möglich, dass PHP außerhalb des Gefängnisses ausgeführt wird, selbst wenn aufgrund von CageFS eine andere Dateierweiterung verwendet wird, soweit ich das beurteilen kann. Ich habe beides versucht SetHandlerund AddTypeeine neue Erweiterung als PHP verarbeitet und sie wurde eingesperrt. Ich weiß nicht, ob es einen Ausweg gibt, aber ich hoffe, dass jemand darauf hinweist, wenn ich etwas verpasst habe. Ja, Apache liest direkt aus den Gefängnissen. Ein guter Blick auf die Cron-Jobs - es scheint, dass verschiedene Dinge, die als Root ausgeführt werden, eine Quelle für viele gemeldete Sicherheitslücken sind.
Sa289
RE : .htaccess, in der conf habe ich AllowOverrideList verwendet, um diese zuzulassen : Add{Charset,DefaultCharset,Encoding,Handler,OutputFilter,OutputFilterByType,Type} Allow Auth{GroupFile,Name,Type,UserFile} Deny DirectoryIndex ErrorDocument Expires{Active,ByType,Default} FileETag ForceType Header IndexIgnore Order php_flag php_value Redirect RedirectMatch Remove{Handler,Type} RequestHeader Require Rewrite{.various.} Satisfy Set{Env,EnvIf,EnvIfNoCase,Handler} SSLRequireSSL. Mein Anliegen ist AddType, AddHandler und SetHandler, aber Drupal verwendet SetHandler zum Beispiel zur Tiefenverteidigung in Datei-Upload-Verzeichnissen.
Sa289
Wenn Sie zulassen, dass Benutzer an Handlern basteln, müssen Sie alle definierten Aktionen durchlaufen und sicherstellen, dass sie sicher sind, nicht nur PHP.
mc0e
Guter Punkt! Ich habe bestätigt SetHandler server-infooder SetHandler server-statusin einer htaccess-Datei ist eine Möglichkeit, einen Angriff zu vereinfachen oder Informationen offenzulegen, die im Idealfall nicht offengelegt werden, wie z. B. alle VirtualHosts auf dem Server (die beispielsweise für Spear-Phishing verwendet werden könnten) oder aktuellen Datenverkehr zu anderen Websites . Möglicherweise muss ich nur einige dieser Handler / Typen aus meinem entfernen AllowOverrideList. Kennen Sie eine Liste aller möglichen Aktionen / Handler? Ich habe versucht, online zu suchen, aber keine gute Antwort gefunden.
Sa289
1
Hat Ihnen das Kopfgeld verliehen, weil unsere Diskussion zu der Sicherheitslücke in Bezug auf die Offenlegung von Informationen geführt hat, die ich nicht behandelt hatte. Bitte lassen Sie mich wissen, wenn Sie eine Antwort zum Auflisten der Aktionen / Handler haben. Thx
sa289
1

Das erste, was ich nicht sehe, ist die Prozessverwaltung, sodass ein Prozess keinen anderen Prozess der CPU oder des Arbeitsspeichers (oder der E / A) aushungern kann, obwohl Ihr Dateisystem möglicherweise so aufgebaut ist, dass dies verhindert wird. Ein Hauptvorteil eines "Container" -Ansatzes für Ihre PHP-Instanzen gegenüber dem Versuch, sie alle auf einem "OS" -Image auszuführen, besteht darin, dass Sie die Ressourcennutzung auf diese Weise besser einschränken können. Ich weiß, dass das nicht dein Design ist, aber das ist etwas zu beachten.

Wie auch immer, zurück zum Anwendungsfall von PHPs, die hinter Apache laufen und im Grunde genommen als Proxy fungieren. suexec verhindert nicht, dass etwas als Apache-Benutzer ausgeführt wird - es bietet die Möglichkeit , als anderer Benutzer ausgeführt zu werden. Ein Anliegen wird es also sein, sicherzustellen, dass alles richtig gemacht wird - die Dokumentseite weist auf diese potenzielle Gefahr hin: https://httpd.apache.org/docs/2.2/suexec.html . Also, weißt du, Salzkorn und so.

Unter Sicherheitsgesichtspunkten kann es hilfreich sein, über eine eingeschränkte Anzahl von Benutzer-Binärdateien zu verfügen, mit denen gearbeitet werden kann (die von cagefs bereitgestellt werden), insbesondere wenn diese anders oder für eine andere Bibliothek kompiliert werden (z. B. eine, die keine unerwünschten Funktionen enthält), aber die Die Gefahr besteht darin, dass Sie zu diesem Zeitpunkt nicht mehr einer bekannten Distribution für Updates folgen, sondern einer anderen Distribution (cagefs) für Ihre PHP-Installationen (zumindest in Bezug auf User Space Tools). Da Sie wahrscheinlich bereits eine bestimmte Distribution mit Cloudlinux verfolgen, ist dies ein inkrementelles Risiko, das für sich genommen nicht unbedingt interessant ist.

Ich würde AllowOverride dort belassen, wo Sie es beabsichtigt haben könnten. Die Kernidee hinter der Tiefenverteidigung besteht darin, sich nicht auf eine einzige Schicht zu verlassen, um Ihren gesamten Stapel zu schützen. Gehen Sie immer davon aus, dass etwas schief gehen kann. Mildern Sie, wenn das passiert. Wiederholen Sie diesen Vorgang, bis Sie so gut wie möglich entschärft sind, auch wenn Sie nur einen Zaun vor Ihren Standorten haben.

Die Protokollverwaltung wird der Schlüssel sein. Bei mehreren Diensten, die in isolierten Dateisystemen ausgeführt werden, kann die Integration von Aktivitäten zur Korrelation bei Problemen ein geringfügiger Schmerz sein, wenn Sie dies nicht von Anfang an eingerichtet haben.

Das ist mein Brain Dump. Ich hoffe, da ist etwas vage Nützliches drin. :) :)

Maria
quelle
Vielen Dank. Um das von Ihnen erwähnte Ressourcenproblem zu lösen, verfügt CloudLinux über Lightweight Virtual Environment (LVE) und MySQL Governor.
Sa289
Das ist sehr cool.
Mary