我应该通过 FastCGI 模拟 PHP 吗?

我应该通过 FastCGI 模拟 PHP 吗?

我正在通过 FastCGI 将最新版本的 PHP 安装到 IIS 7.5 上,并且说明说 FastCGI 应该通过设置模拟调用客户端

 fastcgi.impersonate = 1

如果我的网站有此配置

  • 专用应用程序池
  • ApplicationPoolIdentity 应用程序池标识
  • 仅匿名身份验证(作为 IUSR)

我为何要冒充?

我来自 ASP.NET 背景,其中 IUSR 获得只读权限,而应用程序池标识获得任何写入权限。授予 IUSR 写入权限通常会为 WebDAV 漏洞打开大门。因此,我犹豫是否让 PHP 作为 IUSR 运行。

我找不到很多人问这个问题(1|2) 所以我想我一定遗漏了什么。有人能帮我澄清一下吗?

答案1

13 个月后,我想重新审视自己的问题。在此期间,我将六个网站从 IIS 6 转移到 IIS 7.5,并使用我喜欢的方法对其进行配置。我只能说这些网站运行正常,没有出现任何安全问题(并不是说这些网站很受欢迎),而且在我看来,这种设置比 learn.iis.net 推荐的设置更安全。

为了方便以后使用,以下是相关设置。在 PHP INI 中:

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

在 IIS 中:

  • 应用程序池 > 身份 >应用程序池标识
  • 网站 > 身份验证 > 匿名身份验证 > 特定用户:独立专家

NTFS 权限及其应用位置:

  • 独立专家- 允许阅读,拒绝书写
    • IIS 网站的根目录。例如,在 Zend Framework 项目中,这将是 /public 目录。
    • 如果您的应用程序上传文件并将其保存在公共目录中,则需要将此权限应用于临时上传目录。这是因为move_uploaded_file将保留上传目录的权限。这是我发现的此权限设置的最大缺点。
  • 应用程序池标识IIS AppPool\<<YourApplicationPoolName>>)- 授予阅读和列表
    • PHP 应用程序的根目录。例如,在 Zend Framework 项目中,这将是整个项目。
    • 您的应用程序所包含但不在应用程序文件夹中的任何外部库(Zend、Doctrine 等)。
  • 应用程序池标识- 授予修改权
    • 您的应用程序将要写入的任何位置,例如upload_tmp_dirsession.save_patherror_log
    • 有时我需要将此权限添加到开发环境中的 PHP 应用程序的根目录中,以支持以下内容Doctrine 的代理自动生成
  • 应用程序池标识- 资助名单
    • 如果您的应用程序位于虚拟目录中,则需要将此权限添加到网站的根目录。这允许您的应用程序读取其父级 web.config。例如,如果您的应用程序根目录是http://example.com/MyPHPApp,在 example.com web 目录上设置此权限。具体来说,你只需要应用于“此文件夹和文件”、“仅在此容器内”。

我希望这能帮助那些认为 learn.iis.net 说明不理想的人。

答案2

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

模拟和文件系统访问

建议在使用 IIS 时在 PHP 中启用 FastCGI 模拟。这由 php.ini 文件中的 fastcgi.impersonate 指令控制。启用模拟后,PHP 将代表 IIS 身份验证确定的用户帐户执行所有文件系统操作。

根据文档,它仅允许 fastcgi 使用所有相同的权限(在您的情况下看起来像是 IUSR 帐户)代表客户端执行操作。换句话说,执行通常允许客户端(或匿名者)自己的凭据执行的所有操作。不多也不少。如果没有这套设置,我想可怜的 fastcgi 就会陷入瘫痪。

答案3

关于 IIS 的文件权限,有很多模糊的答案,所以我花了很多时间来解决这个问题。我到 2023 年仍然可以确认 @WimpyProgrammer 是正确的。简而言之,我的默认设置如下:

匿名身份验证更改为应用程序池标识,并将fastcgi.impersonate设置为0。

为了让应用程序读取配置文件,我在 c:\inetpub 及其子文件夹上授予以下权限: IUSR - 读取 + 拒绝写入 IIS_IUSRS - 读取和执行(包括列表)

然后每个网站的根文件夹(例如 c:\inetpub\example.com)将获得:IIS AppPool\AppPoolName - 修改(以便能够从应用程序内部更新文件)IIS_IUSRS 被删除 IUSR 继承读取 + 拒绝写入(以允许未登录的用户查看网站)

SYSTEM 等的默认设置权限保持原样,并且我已授予 FTP 隔离的单独权限。

相关内容