Soll ich PHP über FastCGI vortäuschen?

16

Ich installiere die neueste Version von PHP über FastCGI auf IIS 7.5, und alle Anweisungen besagen, dass FastCGI die Identität des aufrufenden Clients annehmen soll

 fastcgi.impersonate = 1

Wenn meine Website diese Konfiguration haben wird

  • dedizierter Anwendungspool
  • Anwendungspoolidentität von ApplicationPoolIdentity
  • Nur anonyme Authentifizierung (als IUSR)

Warum möchte ich mich ausgeben?

Ich komme aus einem ASP.NET-Hintergrund, in dem der IUSR schreibgeschützte Berechtigungen erhält und die Anwendungspoolidentität Schreibberechtigungen erhält. Wenn Sie dem IUSR Schreibzugriff gewähren, werden in der Regel WebDAV-Sicherheitslücken geschlossen. Ich zögere also, PHP als IUSR laufen zu lassen.

Ich kann nicht viele Leute finden, die diese Frage stellen ( 1 | 2 ), also denke ich, dass mir etwas fehlen muss. Kann das jemand für mich klären?

WimpyProgrammer
quelle

Antworten:

17

13 Monate später wollte ich meine eigene Frage überdenken. In dieser Zeit habe ich ein halbes Dutzend Websites von IIS 6 auf IIS 7.5 übertragen und sie mit meiner bevorzugten Methode konfiguriert. Alles, was ich sagen kann, ist, dass die Websites funktionieren, keine Sicherheitsprobleme hatten (nicht, dass dies beliebte Websites sind), und meiner Meinung nach ist das Setup sicherer als von learn.iis.net empfohlen.

Für die Nachwelt sind hier die relevanten Einstellungen. In der PHP INI:

cgi.force_redirect = 0
cgi.fix_pathinfo=1
fastcgi.impersonate = 0

In IIS:

  • Anwendungspool> Identität> ApplicationPoolIdentity
  • Website> Authentifizierung> Anonyme Authentifizierung> Bestimmter Benutzer: IUSR

Die NTFS-Berechtigungen und wo sie angewendet werden sollen:

  • IUSR - Lesen gewähren , Schreiben verweigern
    • Das Stammverzeichnis der IIS-Website. In einem Zend Framework-Projekt wäre dies beispielsweise das Verzeichnis / public.
    • Wenn Ihre Anwendung Dateien hochlädt und in einem öffentlichen Verzeichnis speichert, müssen Sie diese Berechtigung auf das temporäre Upload-Verzeichnis anwenden. Dies liegt daran, move_uploaded_filedass die Berechtigungen des Upload-Verzeichnisses erhalten bleiben. Dies ist der größte Nachteil dieser Berechtigungskonfiguration, die ich gefunden habe.
  • ApplicationPoolIdentity ( IIS AppPool\<<YourApplicationPoolName>>) - Lesen und Auflisten gewähren
    • Das Stammverzeichnis Ihrer PHP-Anwendung. In einem Zend Framework-Projekt wäre dies beispielsweise das gesamte Projekt.
    • Alle externen Bibliotheken (Zend, Doctrine usw.), die in Ihrer Anwendung enthalten sind und sich nicht im Anwendungsordner befinden.
  • ApplicationPoolIdentity - Ändern gewähren
    • Jeder Ort , an dem Ihre Anwendung schreiben wie upload_tmp_dir, session.save_path, und error_log.
    • Manchmal muss ich diese Berechtigung zum Stammverzeichnis der PHP-Anwendung in meiner Entwicklungsumgebung hinzufügen, um beispielsweise die automatische Generierung von Proxys durch Doctrine zu unterstützen .
  • ApplicationPoolIdentity - Grant-Liste
    • Befindet sich Ihre Anwendung in einem virtuellen Verzeichnis, müssen Sie diese Berechtigung zum Stammverzeichnis der Website hinzufügen. Auf diese Weise kann Ihre Anwendung die übergeordnete Datei web.config lesen. Wenn Ihr Anwendungsstamm beispielsweise http://example.com/MyPHPApp lautet , legen Sie diese Berechtigung im Webverzeichnis example.com fest. Insbesondere müssen Sie nur auf "Diesen Ordner und Dateien", "Nur in diesem Container" anwenden.

Ich hoffe, dies hilft allen anderen, die entscheiden, dass die learn.iis.net-Anweisungen nicht ideal sind.

WimpyProgrammer
quelle
Vielen Dank dafür! Batch-Skript zur Automatisierung hinzugefügt. Funktioniert gut für meine Installation.
Sire
Sie sollten die Impersanierung aktivieren und Authentifizierung> Anonymer Zugriff> Auf Anwendungspoolidentität bearbeiten festlegen. Legen Sie dann die Dateisystemberechtigungen nur mit IIS APPPOOL \ <Anwendungspoolname> fest.
Monstieur
@ Kurian Ja, dieser Ansatz ist einfacher und entspricht den learn.iis.net-Anweisungen. Bietet es weitere Vorteile? Ich habe mich für das oben beschriebene System entschieden, weil es die Berechtigungen der Anwendung von den Berechtigungen des Webbenutzers trennt.
WimpyProgrammer
Es verhindert, dass mehrere Anwendungen auf die Daten des anderen zugreifen. Ohne ApplicationPoolIdentity kann eine gehackte Anwendung zum Hacken anderer Anwendungen auf diesem Server verwendet werden. Zweitens können Sie FastCGI genauso wie ASP.NET behandeln, was die Berechtigungen betrifft.
Monstieur
Ich stimme dem ersten Teil zu. ApplicationPoolIdentity eignet sich hervorragend für Sandbox-Anwendungen, weshalb ich es auch oben benutze. Zum zweiten Punkt, denke ich, verwalten wir unsere ASP.NET-Sites anders. Wenn ich eine ASP.NET-Site einrichte, verwende ich IUSR für den anonymen Benutzer und ApplicationPoolIdentity für den Anwendungspool, und die Berechtigungen sehen sehr ähnlich aus wie oben beschrieben.
WimpyProgrammer
1

Siehe: http://www.php.net/manual/en/install.windows.iis6.php

Identitätswechsel und Dateisystemzugriff

Es wird empfohlen, den FastCGI-Identitätswechsel in PHP zu aktivieren, wenn Sie IIS verwenden. Dies wird durch die Direktive fastcgi.impersonate in der Datei php.ini gesteuert. Wenn der Identitätswechsel aktiviert ist, führt PHP alle Dateisystemvorgänge für das Benutzerkonto aus, das durch die IIS-Authentifizierung ermittelt wurde.

Pro Dokumentation erlaubt es fastcgi einfach, im Namen des Kunden mit den gleichen Berechtigungen zu handeln (in Ihrem Fall mit dem IUSR-Konto). Mit anderen Worten, um alle Aktionen auszuführen, die normalerweise für die Anmeldeinformationen des Clients (oder Anons) zulässig sind. Nicht mehr und nicht weniger. Ohne dieses Set stelle ich mir vor, dass der schlechte Fastcgi verkrüppelt wäre.

Bob der Zerstörer
quelle
Da dies in seiner Situation der Fall ist, würde der Zugriff auf der Grundlage des Gastkontos oder etwas anderem erfolgen.
Matt
Danke für deine Antworten Matt und Bob! Ich begann zu glauben, dass niemand einen Stich nehmen würde.
WimpyProgrammer
2
Wenn PHP ohne Identitätswechsel ausgeführt wird, wird es als Anwendungspoolidentität ausgeführt. Auf diese Weise kann ich dem anon-Benutzer Leserechte gewähren und Schreibzugriff auf die App-Identität gewähren. PHP ist also ohne Identitätswechsel nicht hilflos. Ich habe einen Test erstellt, der Klarheit schafft. IUSR (anon): Lesen gewährt, Schreiben verweigert. App-Identität: Berechtigung zum Lesen / Schreiben. Mit ausgeschaltetem Identitätswechsel kann ich weiterhin Dateien per Code schreiben. Mit Identitätswechsel kann ich nicht. Aber ich möchte nicht, dass der IUSR Schreibzugriff hat. Ich denke, ich werde einige Fragen in anderen Foren stellen und hierher zurückkehren, wenn ich mehr weiß.
WimpyProgrammer