Dois-je me faire passer pour PHP via FastCGI?

16

J'installe la dernière version de PHP sur IIS 7.5 via FastCGI, et toutes les instructions indiquent que FastCGI doit emprunter l'identité du client appelant en définissant

 fastcgi.impersonate = 1

Si mon site Web aura cette configuration

  • pool d'applications dédié
  • identité du pool d'applications d'ApplicationPoolIdentity
  • authentification anonyme uniquement (comme IUSR)

pourquoi je veux imiter?

Je viens d'un arrière-plan ASP.NET, où l'IUSR obtient des autorisations en lecture seule et l'identité du pool d'applications obtient des autorisations d'écriture. Donner un accès en écriture à l'IUSR ouvre généralement la porte aux vulnérabilités WebDAV. J'hésite donc à laisser PHP fonctionner comme IUSR.

Je ne trouve pas beaucoup de gens qui posent cette question ( 1 | 2 ), donc je pense que je dois manquer quelque chose. Quelqu'un peut-il clarifier cela pour moi?

WimpyProgrammer
la source

Réponses:

17

13 mois plus tard, je voulais revoir ma propre question. Pendant ce temps, j'ai transféré une demi-douzaine de sites Web d'IIS 6 vers IIS 7.5 et les ai configurés avec ma méthode préférée. Tout ce que je peux dire, c'est que les sites Web fonctionnent, ils n'ont eu aucun problème de sécurité (pas que ce soient des sites populaires), et à mon avis, la configuration est plus sécurisée que ce que learn.iis.net recommande.

Pour la postérité, voici les paramètres pertinents. Dans PHP INI:

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

Dans IIS:

  • Pool d'applications> Identité> ApplicationPoolIdentity
  • Site Web> Authentification> Authentification anonyme> Utilisateur spécifique: IUSR

Les autorisations NTFS et où les appliquer:

  • IUSR - Grant Read, Deny Write
    • Répertoire racine du site Web IIS. Par exemple, dans un projet Zend Framework, ce serait le répertoire / public.
    • Si votre application télécharge des fichiers et les enregistre dans un répertoire public, vous devez appliquer cette autorisation au répertoire de téléchargement temporaire. En effet move_uploaded_file, les autorisations du répertoire de téléchargement seront préservées. C'est le plus gros inconvénient de cette configuration d'autorisations que j'ai trouvé.
  • ApplicationPoolIdentity ( IIS AppPool\<<YourApplicationPoolName>>) - Accorder la lecture et la liste
    • La racine de votre application PHP. Par exemple, dans un projet Zend Framework, ce serait le projet entier.
    • Toutes les bibliothèques externes (Zend, Doctrine, etc.) incluses par votre application qui ne se trouvent pas dans le dossier d'application.
  • ApplicationPoolIdentity - Grant Modify
    • Tout emplacement où votre application rédigera tels que upload_tmp_dir, session.save_pathet error_log.
    • Parfois, j'ai besoin d'ajouter cette autorisation à la racine de l'application PHP dans mon environnement de développement pour prendre en charge des choses comme la génération automatique de procurations de Doctrine .
  • ApplicationPoolIdentity - Liste de subventions
    • Si votre application se trouve dans un répertoire virtuel, vous devrez ajouter cette autorisation à la racine du site Web. Cela permet à votre application de lire son web.config parent. Par exemple, si la racine de votre application est http://example.com/MyPHPApp , définissez cette autorisation sur le répertoire Web example.com. Plus précisément, vous devez uniquement appliquer à "Ce dossier et fichiers", "dans ce conteneur uniquement".

J'espère que cela aide toute personne qui décide que les instructions de learn.iis.net ne sont pas idéales.

WimpyProgrammer
la source
Merci beaucoup pour cela! Ajout d'un script batch pour automatiser. Fonctionne bien pour mon installation.
Père
Vous devez activer l'emprisonnement et définir l'authentification> accès anonyme> modifier à l'identité du pool d'applications. Définissez ensuite uniquement les autorisations du système de fichiers à l'aide d'IIS APPPOOL \ <Nom du pool d'applications>.
Monstieur
@Kurian Oui, cette approche est plus simple et selon les instructions de learn.iis.net. Offre-t-il d'autres avantages? J'ai choisi le système décrit ci-dessus car il sépare les autorisations de l'application des autorisations de l'internaute.
WimpyProgrammer
Il empêche plusieurs applications d'accéder aux données des autres. Sans ApplicationPoolIdentity si une application est piratée, elle peut être utilisée pour pirater d'autres applications sur ce serveur. Deuxièmement, cela vous permet de traiter FastCGI de la même manière qu'ASP.NET en ce qui concerne les autorisations.
Monstieur
Je suis d'accord avec la première partie. ApplicationPoolIdentity est idéal pour les applications de sandboxing, c'est pourquoi je l'utilise également ci-dessus. Pour votre deuxième point, je suppose que nous gérons nos sites ASP.NET différemment. Lorsque je configure un site ASP.NET, j'utilise IUSR pour l'utilisateur anonyme et ApplicationPoolIdentity pour le pool d'applications, et les autorisations sont très similaires à celles décrites ci-dessus.
WimpyProgrammer
1

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

Usurpation d'identité et accès au système de fichiers

Il est recommandé d'activer l'emprunt d'identité FastCGI en PHP lorsque vous utilisez IIS. Ceci est contrôlé par la directive fastcgi.impersonate dans le fichier php.ini. Lorsque l'emprunt d'identité est activé, PHP effectuera toutes les opérations du système de fichiers au nom du compte d'utilisateur qui a été déterminé par l'authentification IIS.

Selon la documentation, il permet simplement à fastcgi d'agir au nom du client en utilisant les mêmes autorisations (dans votre cas, ce qui ressemble au compte IUSR). En d'autres termes, pour effectuer toutes les actions normalement autorisées sur les propres informations d'identification du client (ou anon). Ni plus ni moins. Sans cet ensemble, j'imagine que les pauvres fastcgi seraient paralysés.

bob-le-destructeur
la source
Cela étant le cas dans sa situation, il aurait accès sur la base du compte invité ou quelque chose.
Matt
Merci pour vos réponses Matt et Bob! Je commençais à penser que personne ne prendrait un coup de couteau.
WimpyProgrammer
2
Lorsque PHP est exécuté sans usurpation d'identité, il s'exécute en tant qu'identité du pool d'applications. Cela me permet de donner des droits en lecture seule à l'utilisateur anon et de donner un accès en écriture à l'identité de l'application. PHP n'est donc pas impuissant sans usurpation d'identité. J'ai créé un test qui pourrait clarifier. IUSR (anon): lecture autorisée, écriture refusée. identité de l'application: lecture / écriture autorisée. Avec l'emprunt d'identité désactivé, je peux toujours écrire des fichiers via du code. Avec l'usurpation d'identité, je ne peux pas. Mais je ne veux pas que l'IUSR ait un accès en écriture. Je pense que je vais poser quelques questions dans d'autres forums et revenir ici quand j'en saurai plus.
WimpyProgrammer