simonw代码@痕记

导航

IIS7权限简述

IIS7对于以往是革命性的改变, 不再是以前缝缝补补的破衣裳, 全部重写的代码带来了更为优秀的性能与扩展能力. 他不再是一个Web Server了而变成了一个Application Server能够承载一切以通讯为基础的应用. 新的变革也带来了新的知识, 想更好的驾驭IIS7权限则是最基础的一部分也是最先需要了解的一部分. 本文让你初步了解IIS7的权限应用的基本相关知识, 了解来龙去脉不会再因应用程序突然多出一个莫名其妙权限而感到困惑. 虽然下面的内容均以Web服务为例, 但道理同样适用于以IIS7宿主的其他应用如FTP等等.

工作进程(Worker Process)

Worker Process是IIS应用程序的宿主, 在任务管理器中可以看到每一个Worker Process就是一个w3wp.exe.

image_thumb3

工作进程标识(Worker Process Identity - WPI)

是Worker Process运行时的身份:

  • 在IIS6, Windows 2008 IIS7下, 默认关联权限是NetworkService.
  • 在Windows 2008 R2 IIS7.5下, 默认是关联权限是Application Pool Identity.

这里并没有提供一个直接的手段来设置Worker Process在什么身份标识下运行, 而是通过Application Pool的身份标识设定来实现的.

应用程序池(Application Pool)

Application Pool包含至少一个或多个Worker Process(Web Garden模式). 在运行时会将Application Pool的身份注入到Worker Process中, 就会以Application Pool的身份运行. 可以认为Application Pool与其包含的Worker Process的运行身份是一致的.

应用程序池标识(Application Pool Identity)

是Application Pool运行时的身份:

  • 在IIS6, Windows 2008 IIS7下, 默认关联权限是NetworkService.
  • 在Windows 2008 SP2 IIS7下, 运行身份设置时除了LocalService, NetworkService, LocalSystem外增加了Application Pool Identity一个选项, 而这个则是一个可以设置权限的虚拟标识.
  • 在Windows 2008 R2 IIS7.5下, 默认是关联权限是Application Pool Identity.

image_thumb1

虚拟帐户 Application Pool Identity

上面提到的身份标识选项中你可以选择他, 但他只是一个统称, 并不存在实际的这个命名. 他依赖你的Application Pool的名称, 例如我的Application Pool名字叫做: SimonwAppPool, 那么这个虚拟标识的全名是: IIS AppPool\SimonwAppPool 运行在此Application Pool下的Worker Process从任务管理器中可以看到w3wp.exe是在SimonwAppPool这个用户下运行的. 可以在文件系统中对这个帐户分配权限. 这么做的好处是能够将能够将权限分离开来做粒度更细的配置, 不像是NetworkService有很多应用基于此, 设置一个权限影响一大片.

image_thumb9 

不过有时候通过UI找不到这个对象大约是个Bug, 通过命令行icacls处理即可.

什么是impersonate

这可能是一个让人容易迷糊的词汇impersonate - 扮演, 装扮. 他是指在某个特定的时刻以一个新的身份来代替已有身份来运行应用程序. 一个请求来临时在IIS处理管道中, 在authentication之前authenticated user的上下文是未知的, 这时你的应用程序以WPI的权限在运行. 在authentication之后authenticated user的上下文被建立, 但依然没有去扮演, 直至请求被映射到他的handler也就是handler mapping后应用程序开始使用扮演则将默认的WPI权限替换为authenticated user的权限来执行应用程序.

image_thumb7

举个例子, php配置fastcgi时推荐设置fcgi.impersonate=true, 体现在请求一个php文件时
false: 始终使用WPI的权限, 默认权限是NetworkService
true: 使用authenticated user, 默认为IUSR, 也就是说可以让在站点级别上设置的权限生效.

用户组与用户

在IIS7下需要注意2个特殊的用户和用户组, 在IIS6中有着类似的对应关系
IIS6:IIS_WPG - IIS7:IIS_IUSRS
IIS6:IUSR_MachineName - IIS7:IUSR

最大的改变就是他们都成为了系统内置帐户(built-in account)有着统一的SID, 这样的好处在于做不同机器/系统间的拷贝时可以连带权限一同拷贝过去了, 在以往因为SID不同换了机器权限是无法有效拷贝的只能挨个手动设置, 现在方便多了.

IIS_IUSRS组

默认他会拥有适当的权限来运行Worker Process. 所有的WPI下的运行帐户均被隐式的自动加入到这个组中, 以获得最小的运行权限. 例如当你将SimonwAppPool这个Application Pool的运行身份设置为Application Pool Identity, 那么IIS AppPool\SimonwAppPool这个用户会被自动加入到IIS_IUSRS组中拥有他的全部权限. 因此对此组权限赋值需很小心很容易不知不觉中影响一大片.

IUSR默认匿名帐户

特别需要注意的别看他是一个匿名帐户并且没有密码, 但他属于authenticated users ,而authenticated users属于Users组, 因此IUSR默认具备了Users组的权限.

image_thumb5

结束语

一年总要写一篇文章(惭愧), 年底再不写没机会了, 大部分的内容都是大半年前总结的, 今天才写出来难免错误与疏漏请及时指正. 希望能为你的IIS7配置提供有效的参考.

posted on 2009-12-09 21:12  simonw  阅读(5909)  评论(6编辑  收藏  举报