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

时间:2011-03-25 20:21:49

标签: asp.net permissions iis-7.5 windows-server-2008-r2

这是IIS 7.5和ASP.NET的一个问题,我一直在研究并且无处可去。任何帮助将不胜感激。

我的问题是:在IIS 7.5中使用ASP.NET,在完全信任下运行时,IIS和/或操作系统如何允许Web应用程序写入C:\dump这样的文件夹?我怎么没有为应用程序池用户显式添加写访问权限(在这种情况下是ApplicationPoolIdentity)?

我知道这一点:

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

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

请注意,我理解这可能是为了方便起见,因为如果您在Full Trust下运行,授予用户访问它需要写入的每个文件夹是一件痛苦的事。如果要限制此访问权限,则始终可以在“中等信任”下运行该应用程序。我有兴趣了解操作系统和/或IIS允许进行这些写入的方式,即使似乎没有授予显式文件系统访问权限。

4 个答案:

答案 0 :(得分:390)

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

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

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

enter image description here

请参阅从c:\继承的特殊权限:

enter image description here

这就是您的网站ApplicationPoolIdentity可以阅读并到该文件夹​​的原因。这项权利继承自c:\驱动器。

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

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

您还应确保在创建可能敏感文件或数据的位置创建的所有文件夹都删除了Users组。您还应该确保您安装的任何应用程序都不会将敏感数据存储在c:\program files\[app name]文件夹中,而是使用用户配置文件文件夹。

所以是的,乍一看,ApplicationPoolIdentity看起来有更多的权利,但它实际上没有权利,而不是它的群组成员资格。

可以使用SysInternals Process Explorer tool检查ApplicationPoolIdentity的群组成员资格。查找使用您感兴趣的应用程序池标识运行的工作进程(您必须将User Name列添加到要显示的列列表中:

enter image description here

例如,我在这里有一个名为900300的池,其应用程序池标识为IIS APPPOOL\900300。右键单击该流程的属性,然后选择我们看到的“安全”选项卡:

enter image description here

我们可以看到IIS APPPOOL\900300Users群组的成员。

答案 1 :(得分:25)

  1. 右键单击文件夹。

  2. 点击属性

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

  4. enter image description here

    1. 点击"编辑..."屏幕上方的按钮。你会看到这样的东西:
    2. enter image description here

      1. 点击"添加..."屏幕上方的按钮。你会看到这样的东西:
      2. enter image description here

        1. 点击"地点......"屏幕上方的按钮。你会看到这样的东西。现在,转到此树结构的顶部并选择您的计算机名称,然后单击“确定”。
        2. enter image description here

          1. 现在输入" iis apppool \ your_apppool_name"然后点击"检查姓名"按钮。如果apppool存在,您将在文本框中看到您的apppool名称,并在其中加下划线。单击“确定”按钮。
          2. enter image description here

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

            2. 单击“应用”按钮,然后单击“确定”。

答案 2 :(得分:0)

IIs中的每个应用程序池都会创建自己的安全用户文件夹,默认情况下在c:\ users下具有FULL读/写权限。打开“用户”文件夹,查看其中的应用程序池文件夹,单击右键,然后检查其分配的应用程序池虚拟帐户的权限。您应该看到已添加的应用程序池帐户已分配给其根目录和子文件夹的读/写访问权限。

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

答案 3 :(得分:0)

我试图通过此方法来解决对IIS网站的访问问题,该问题在事件日志→Windows→应用程序中显示为like the following

Log Name:      Application
Source:        ASP.NET 4.0.30319.0
Date:          1/5/2012 4:12:33 PM
Event ID:      1314
Task Category: Web Event
Level:         Information
Keywords:      Classic
User:          N/A
Computer:      SALTIIS01

Description:
Event code: 4008 
Event message: File authorization failed for the request. 
Event time: 1/5/2012 4:12:33 PM 
Event time (UTC): 1/6/2012 12:12:33 AM 
Event ID: 349fcb2ec3c24b16a862f6eb9b23dd6c 
Event sequence: 7 
Event occurrence: 3 
Event detail code: 0 

Application information: 
    Application domain: /LM/W3SVC/2/ROOT/Application/SNCDW-19-129702818025409890 
    Trust level: Full 
    Application Virtual Path: /Application/SNCDW 
    Application Path: D:\Sites\WCF\Application\SNCDW\ 
    Machine name: SALTIIS01 

Process information: 
    Process ID: 1896 
    Process name: w3wp.exe 
    Account name: iisservice 

Request information: 
    Request URL: http://webservicestest/Application/SNCDW/PC.svc 
    Request path: /Application/SNCDW/PC.svc 
    User host address: 10.60.16.79 
    User: js3228 
    Is authenticated: True 
    Authentication Type: Negotiate 
    Thread account name: iisservice 

最后,我必须给Windows Everyoneread access to that folder使其正常工作。