IIS AppPoolIdentity和文件系统写入访问权限

这里有一个IIS 7.5和ASP.NET的问题,我一直在研究和取得任何地方。 任何帮助将不胜感激。

我的问题是:在IIS 7.5中使用ASP.NET,IIS和/或操作系统如何在完全信任的情况下允许Web应用程序写入类似C:\dump的文件夹? 它是如何不必为应用程序池用户明确添加写访问权限(在这种情况下是ApplicationPoolIdentity )?

我知道的很多:

  • 在IIS 7.5中,应用程序池的默认标识是ApplicationPoolIdentity
  • ApplicationPoolIdentity表示一个名为“IIS APPPOOL \ AppPoolName”的Windows用户帐户,该帐户是在创build应用程序池时创build的,其中AppPoolName是应用程序池的名称。
  • “IIS APPPOOL \ AppPoolName”用户默认是IIS_IUSRS组的成员。
  • 如果在“完全信任”下运行,则Web应用程序可以写入文件系统的许多区域(不包括C:\UsersC:\Windows等文件夹)。 例如,您的应用程序将有权写入某些文件夹,如C:\dump
  • 默认情况下, IIS_IUSRS组不具有对C:\dump读取或写入访问权限(至less不能通过Windows资源pipe理器中的“安全性”选项卡进行访问)。
  • 如果您拒绝对IIS_IUSRS写入访问权限,则在尝试写入文件夹时(如预期的那样),将会收到SecurityException。

因此,考虑到所有这些,如何授予“IIS APPPOOL \ AppPoolName”用户的写权限? w3wp.exe进程以该用户身份运行,那么允许此用户写入文件夹似乎没有明确的访问权限?

请注意,我明白这可能是为了方便起见,因为如果您在“完全信任”下运行,授予用户对每个需要写入的文件夹的访问权限是一种痛苦。 如果你想限制这个访问,你总是可以在Medium Trust下运行这个应用程序。 我有兴趣了解操作系统和/或IIS允许这些写入发生的方式,即使似乎没有授予明确的文件系统访问权限。

ApplicationPoolIdentity被分配了Users组以及IIS_IUSRS组的成员资格。 乍一看,这可能看起来有点令人担忧,但Users组有一些有限的NTFS权利。

例如,如果您尝试在C:\Windows文件夹中创build一个文件夹,则会发现不能。 ApplicationPoolIdentity仍然需要能够从Windows系统文件夹中读取文件(否则工作进程将如何dynamic加载重要的DLL)。

关于你能够写入你的c:\dump文件夹的意见。 如果您查看“高级安全设置”中的权限,您将看到以下内容:

在这里输入图像描述

看到从c:\inheritance的c:\

在这里输入图像描述

这就是您的站点的ApplicationPoolIdentity可以读取和写入该文件夹的原因。 该权利是从c:\驱动器inheritance。

在可能有数百个站点的共享环境中,每个站点都有自己的应用程序池和应用程序池标识,您可以将站点文件夹存储在删除了“ Users组和权限设置的文件夹或卷中,以便只有pipe理员和SYSTEM帐户可以访问(带inheritance)。

然后,您将单独分配每个IIS AppPool\[name]在其站点根文件夹上所需的必需权限。

您还应该确保在您存储潜在敏感文件或数据的位置创build的任何文件夹都已删除“ Users组。 您还应该确保您安装的任何应用程序不将敏感数据存储在c:\program files\[app name]文件夹中,而是使用用户configuration文件文件夹。

所以是的,乍一看, ApplicationPoolIdentity看起来比它应该拥有更多的权限,但是它实际上没有比组成员指定的更多的权限。

可以使用SysInternals Process Explorer工具检查ApplicationPoolIdentity的组成员资格。 find您感兴趣的应用程序池标识正在运行的工作进程(您将不得不将User Name名列添加到要显示的列列表中:

在这里输入图像描述

例如,我在这里有一个名为900300的池,它具有IIS APPPOOL\900300的应用程序池标识。 右键点击进程的属性并select安全选项卡,我们看到:

在这里输入图像描述

正如我们所看到的, IIS APPPOOL\900300Users组的成员。

  1. 右键点击文件夹。

  2. 点击属性

  3. 单击安全选项卡。 你会看到这样的东西:

在这里输入图像描述

  1. 点击上方屏幕中的“编辑…”button。 你会看到这样的东西:

在这里输入图像描述

  1. 点击上图中的“添加…”button。 你会看到这样的东西:

在这里输入图像描述

  1. 点击上面屏幕中的“位置…”button。 你会看到这样的东西。 现在,转到这个树结构的顶部,select您的计算机名称,然后单击确定。

在这里输入图像描述

  1. 现在input“iis apppool \ your_apppool_name”并点击“检查姓名”button。 如果存在应用程序池,则会在带有下划线的文本框中看到您的应用程序池名称。 点击确定button。

在这里输入图像描述

  1. 选中/取消选中您需要授予帐户的任何访问权限

  2. 点击应用button,然后确定。

IIs中的每个应用程序池在c:\ users下默认创build自己的安全用户文件夹,具有完全读/写权限。 打开您的用户文件夹并查看哪些应用程序池文件夹在那里,右键单击并检查分配的应用程序池虚拟帐户的权限。 您应该看到您的应用程序池帐户已经添加了分配给其根目录和子目录的读取/写入权限。

因此,这种types的文件存储访问是自动完成的,您应该可以在应用程序池用户帐户文件夹中编写任何您喜欢的文件,而无需更改任何内容。 这就是为什么创build每个应用程序池的虚拟用户帐户的原因。