使用 PHP 在 IIS 上托管多个站点 (2)。每个站点都在自己的应用程序池下运行,因此w3wp.exe
(IIS 工作进程)的每个实例都php-cgi.exe
在各自的应用程序池标识下运行。
我有一个文件夹C:\Web
,其中包含与网络服务器相关的文件。目录结构如下:
C:\WEB
├───AVP
│ ├───1.0
│ │ └───wwwroot
│ │ ├───api
│ │ ├───images
│ │ ├───scripts
│ │ └───styles
│ ├───PHPLogs
│ └───Sessions
├───Dev01
│ ├───PHPLogs
│ ├───Sessions
│ └───wwwroot
└───IISLogs
├───W3SVC
└───W3SVC1.old
我正在尝试设置权限,以便每个站点都无法访问其他站点的文件,以防一个站点上的脚本存在漏洞。
我尝试过的操作:
从 上的“用户”组中删除了权限C:\Web
,因为应用程序池身份是用户组的成员。然后,我将为每个应用程序池标识为其自己的目录添加显式权限。 IE 'IIS AppPool\Site1' 将具有 读/写权限C:\Web\AVP
,但不具有读/写权限C\Web\Dev01
。然而,有一个复杂的问题:该C:\Web
文件夹也通过网络共享 - 这是为了让我可以从其他计算机编辑网络文件。我已经使用“高级共享”菜单完成了此操作,并且我已向用户分配了共享权限:
这是可行的,但是如果我只从(和子文件夹)中删除“用户”组C:\Web
,PHP 实例仍然可以访问这些文件。我还必须删除“经过身份验证的用户”(我不完全理解)的权限,以阻止我的应用程序池身份访问这些文件。然而这样做会破坏网络访问......
这样做的最佳方法是什么?
相信我可能已经解决了这个问题。似乎用户要能够通过网络访问文件夹/文件,他们需要授予共享权限(参见 OP 中的图像)和 NTFS 权限。
通常,“经过身份验证的用户”组似乎负责向网络用户授予 NTFS 权限,但在这种情况下显然不是这样。
为了解决此问题,我只是删除了“用户”和“经过身份验证的用户”组的权限,然后按计划向每个文件夹添加了特定应用程序池标识的权限。然后,为了启用网络访问,我专门向 上的“NetworkFilesAdmin”用户授予了 NTFS 权限
C:\Web
。这工作正常 - 不确定这是否是最好的方法?