IIS8中的IIS_IUSRS和IUSR权限

177

我刚从在Win2003上运行IIS6转移到了在Win2012上运行IIS8来托管ASP.NET应用程序。

在我的应用程序的一个特定文件夹中,我需要创建和删除文件。将文件复制到新服务器后,当我尝试删除文件时,我一直看到以下错误:

拒绝访问路径“D:\WebSites\myapp.co.uk\companydata\filename.pdf”。

当我检查IIS时,我发现应用程序正在DefaultAppPool帐户下运行,但我从未设置这个文件夹上的Windows权限,以包括IIS AppPool\DefaultAppPool

相反,为了防止客户抱怨,我在文件夹上授予了以下权限:

IUSR

  • 读取和执行
  • 列出文件夹内容
  • 读取
  • 写入

IIS_IUSRS

  • 修改
  • 读取和执行
  • 列出文件夹内容
  • 读取
  • 写入

这似乎起作用了,但我担心设置了太多特权。我在线上阅读到了关于是否实际上需要IUSR的信息不一致。请问哪些用户/权限足以在此文件夹中创建和删除文档?IUSR是否是IIS_IUSRS组的一部分?

更新和解决方案

请参见下面的答案。可惜我不得不这样做,因为最近的一些建议考虑不周,甚至是不安全的(依我之见)。


为了在Azure虚拟机(Windows Server 2012 Datacenter)上的IIS 8上使WordPress正常工作,我需要授予你所列出的IIS_IUSRS权限给inetpub / wwwroot中博客目录下的IUSR。 - dumbledad
对于那些在尝试在IIS下运行Joomla并遇到文件安全设置问题的人来说,我已经写了一篇博客文章,提供了我认为是正确解决方案的内容。这对WordPress或其他基于PHP的Web服务器程序也可能适用。http://renniestechblog.com/index.php/information/15-joomla-on-iis-part-7-preparing-for-a-new-website - RenniePet
可能是IIS AppPoolIdentity和文件系统写入访问权限的重复问题。 - KyleMit
在为用户组IIS_IUSRS添加完整权限后,工作正常。 - Thulasiram
@Thulasiram 但是你已经给了所有IIS用户完全的权限。从黑客的角度考虑一下这个问题。一个弱点站点,他们就可以完全控制其他所有站点。 - EvilDr
@EvilDr 感谢您的信息,我们现在正在更改权限... :) - Thulasiram
6个回答

191

我不太愿意发布自己的答案,但最近有些答案忽略了我在自己的问题中发布的解决方案,提出一些非常鲁莽的方法。

简言之 - 你无需编辑任何Windows用户帐户权限。这样做只会增加风险。整个过程完全是在IIS中使用继承权限进行管理的。

将修改/写入权限应用于正确的用户帐户

  1. 右键单击站点列表下出现的域,并选择编辑权限

安全性选项卡下,你会看到列出了MACHINE_NAME\IIS_IUSRS,这意味着IIS自动对目录具有只读权限(例如,在站点中运行ASP.Net)。你不需要编辑此条目

  1. 点击编辑按钮,然后点击添加...

  2. 在文本框中,输入IIS AppPool\MyApplicationPoolName,将MyApplicationPoolName替换为你的域名或访问你的站点的任何应用程序池,例如IIS AppPool\mydomain.com

  1. 按下检查名称按钮。你所键入的文本将发生变化(注意下划线):

  1. 确定 添加用户

  2. 选择新添加的用户(您的域名),现在可以安全地提供任何修改写入权限


5
这在我的IIS 8.5服务器上无效。添加IUSR可以解决问题。添加IIS AppPool\Cache(我的应用程序池名称)会导致HTTP Error 401.3 - Unauthorized错误。 - Charles Burns
21
@CharlesBurns 我也遇到了同样的问题,我发现这是我的根本原因所在:https://techras.wordpress.com/2016/03/09/error-message-401-3-you-do-not-have-permission-to-view-this-directory-or-page-using-the-credentials-you-supplied-access-denied-due-to-access-control-lists/(匿名身份验证设置为使用IUSR而不是应用程序池身份)。 - Jon
4
我有一个仅用作虚拟目录的文件夹,直到我与另一个域帐户共享它的时候(指它所指向的Windows文件夹),它一直都能正常工作,这样它可以通过我们的局域网查看文件。但是当我这样做时,虚拟目录中的文件突然变得无法访问。最终,我不得不为MyComputerName\IIS_IUSRSIUSR添加只读权限,才使其再次正常工作。这仅适用于虚拟目录(不适用于.net应用程序),但我认为其他人可能会发现它有用。 - MikeTeeVee
26
注意:当你搜索用户并且计算机是域成员时,可能找不到IIS AppPool\MyApplicationPoolName。在我这种情况下,我需要点击“位置”按钮并将位置更改为本地计算机。 - statler
4
在我的测试中,要在此处使用的特殊用户名称与域名无关,而是指分配给IIS网站的应用程序池的名称。这个应用程序池可能与你的网站域名匹配,也可能不匹配。因此,格式为:IIS AppPool\[APPLICATION POOL NAME]。应用程序池名称中的空格是被接受的。请注意,只有当“内置安全主体”选项作为名称搜索的对象类型被勾选时(在“选择用户或组”对话框的顶部字段中),才能找到此用户。 - Jpsy
显示剩余4条评论

52

IUSRIIS_IUSER组的一部分,因此我猜您可以放心地删除IUSR的权限。更多阅读

然而,随着越来越多的Windows系统服务以NETWORKSERVICE身份运行,出现了一个问题。这是因为作为NETWORKSERVICE运行的服务可能会干扰使用相同身份运行的其他服务。由于IIS工作进程默认运行第三方代码(经典ASP、ASP.NET、PHP代码),因此是时候将IIS工作进程与其他Windows系统服务隔离开来,并在唯一的身份下运行IIS工作进程。

Windows操作系统提供了一个名为“虚拟帐户”的功能,允许IIS为每个应用程序池创建唯一的身份。 DefaultAppPool是分配给您创建的所有应用程序池的默认池。

为了使其更安全,您可以将IIS DefaultAppPool身份更改为ApplicationPoolIdentity

关于权限,创建和删除总结了可以授予的所有权限。因此,您分配给 IIS_USERS 组的所有内容都是他们所需的。


3
我刚刚在Server Essentials 2012 R2下安装了IIS 8。这台机器也是一个域控制器。在AD用户和计算机中,IIS_IUSRS组是空的--它不包含IUSR用户。我想我可以将其添加到组中,但对于匿名站点,我将只授予IUSR用户权限。 - Mark Berry
7
当我授予IUSR权限时,它起作用了。当我授予IIS_IUSER权限时,它没有起作用。 - ihebiheb
2
Iusr不是IIS_Iusrs的成员(或者Windows有一个漏洞) 通常情况下,Windows使用IIS_Iusrs(执行动态页面或访问静态页面),但在某些情况下,Windows会使用Iusr而不是IIS_Iusrs。使用PHP上传文件就是其中之一(如果你只授予iis_iusr权限,你将遇到权限异常) 我认为微软应该提供“最佳实践”来授予Iusr和IIS_Iusrs的权限... - finejustice
我认为现在已经更改为应用程序池组,即(IWGP)。我授予权限给了IWGP,然后它就可以工作了。 - Rohit Arora
8
IUSR 是 IIS_IUSER 的一部分。不,它不是!IUSR 是匿名用户,而 IIS_IUSER 则是用于应用程序池用户的组。 - giammin

9
当我为站点文件夹添加了对 IIS_IUSRS 的权限后,如JavaScript和CSS这样的资源仍然无法访问(错误401,被禁止)。但是,当我添加了IUSR时,它开始工作。因此,您肯定不能删除IUSR的权限。

8
请注意,如果你使用的是IIS7+,正确的解决方案是按照我的更新答案使用IIS AppPool\MyApplicationPoolName。你不需要再搞乱IUSR(S)了! - EvilDr
3
我尝试了你的建议,但它没有起作用。我已经从权限中删除了IUSR(S),只保留了应用程序所在的池名,然后资源变得无法访问。这是在IIS 8.5上发生的。当我添加了IUSR时,它开始工作了。 - Alexander
请您发布自己的问题,并提供尽可能多的情况信息。 - EvilDr
@EvilDRr,dotNet代码将作为应用程序池用户运行(如果已配置的appPool身份验证使用该身份)。否则,对于静态资源(如图像)的匿名请求将通过匿名身份验证处理,其中IUSR是默认身份。 - xorinzor

5
您可以在您的AD环境中创建一个IUSR_[identifier]帐户,并让特定应用程序池在该IUSR_[identifier]帐户下运行:
“应用程序池”>“高级设置”>“标识”>“自定义帐户”
在“高级设置”中将您的网站设置为“应用程序用户(透明身份验证)”,而不是“特定用户”。
现在,在文件和文件夹上为该IUSR_[identifier]授予适当的NTFS权限,例如:对companydata进行修改。

谢谢,但我没有使用AD。根据最近的微软文档,IIS 7和8已经配置为按照您描述的方式工作。问题实际上是是否真的需要指定的帐户,以及哪一个是业务所需的? - EvilDr
@EvilDr 感谢您澄清您没有使用 AD。IIS_IUSRS 不是用户,而是一个组,就像 IIS 6.0 上的 IIS_WPG 一样。您可以在这里阅读有关 IIS_IUSRS 和 IUSR 的信息:链接。您可以为 IUSR 帐户设置对 companydata* 的修改权限,并将此用户添加到 IIS_IUSRS 组中,并使用该用户帐户运行应用程序池。如果您有多个 IUSR_accounts,则只需要为 IIS_IUSRS 授予共享文件夹(例如 TMP)的权限即可。 - Jan Reilink
Jan,我一直以为IUSR默认是IIS_IUSRS组的一部分?你如何检查这一点,因为IUSR帐户是内置帐户。你是说我应该取消IIS_USRS的修改并改为选中IUSR吗?考虑到单应用程序的要求,我认为这并不会真正有所区别,对吧? - EvilDr

4

IIS_IUSRS组仅在使用ApplicationPool身份验证时才有重要性。尽管在运行时此组看起来是空的,但根据Microsoft文献,IIS会将其添加到该组以运行工作进程。


1
不确定为什么这个被踩了。https://learn.microsoft.com/en-us/iis/get-started/planning-for-security/understanding-built-in-user-and-group-accounts-in-iis#understanding-the-new-iisiusrs-group - Greg

0
我会使用特定用户(而不是应用程序用户),然后在应用程序中启用模拟。一旦这样做,无论哪个帐户被设置为特定用户,这些凭据都将用于访问该服务器上的本地资源(而不是外部资源)。
特定用户设置专门用于访问本地资源。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接