作者:Tali Smith
介绍
在共享托管环境中隔离网站的建议与 Internet Information Services 7 (IIS 7) 及更高版本的所有常规安全隔离建议一致。 具体而言,建议执行以下操作:
- 每个网站使用一个应用程序池。
- 使用专用用户帐户作为应用程序池的标识。
- 配置匿名用户标识以使用应用程序池标识。
- 确保在 Php.ini 文件中启用 FastCGI 模拟。
应用程序池的体系结构视图显示在下图中。
图 1:应用程序池
创建应用程序池
可以通过 UI 或命令行创建应用程序池。
- 在 IIS 管理器中,导航到“连接”窗格。
- 选择“应用程序池”选项,然后选择“添加应用程序池”以打开“添加应用程序池”对话框。
- 输入应用程序池的唯一名称。
- 选择要使用的应用程序池的 Microsoft® .NET Framework 版本(如果有),然后选择管道模式。
创建完池后,可以根据需要更改其设置。
- 在“连接”窗格中,选择“应用程序池”。
- 在“工作”窗格中,选择要配置的应用程序池。
- 在“操作”窗格中,选择“基本设置”。 请注意,除了对话框标题之外,“基本设置”对话框和“添加应用程序池”对话框看起来完全相同。
也可使用命令行。 使用:
appcmd add apppool /name:string
请注意,字符串是应用程序池的名称。
“编辑应用程序池”对话框让你可以配置 IIS 7 及更高版本如何处理应用程序池的工作进程回收。
图 2:编辑应用程序池
应用程序池标识
应用程序池标识是一项新的安全功能,可用于在唯一帐户下运行应用程序池,而无需创建和管理域或本地帐户。 应用程序池帐户的名称对应于应用程序池的名称。 下图显示了作为 DefaultAppPool 标识运行的 IIS 工作进程 (w3wp.exe)。
图 3:应用程序池标识帐户
应用程序池标识帐户
默认情况下,IIS 6、IIS 7 及更高版本中的工作进程作为 NETWORKSERVICE 运行。 NETWORKSERVICE 是一个内置的 Windows® 标识。 NETWORKSERVICE 不需要密码,并且只有用户特权(特权相对较低)。 作为低特权帐户运行是一种良好的安全做法,因为这可以防止恶意用户使用软件 bug 接管系统。
但是,随着时间的推移,越来越多的 Windows 系统服务作为 NETWORKSERVICE 运行,这些服务可以篡改同一标识下运行的其他服务。 由于 IIS 工作进程默认运行第三方代码(PHP、经典 ASP 和 Microsoft® ASP.NET),因此有必要将 IIS 工作进程与其他 Windows 系统服务隔离,并在唯一标识下运行 IIS 工作进程。 Windows 操作系统提供一项称为“虚拟帐户”的功能,允许 IIS 为其每个应用程序池创建唯一标识。
每当创建新的应用程序池时,IIS 管理过程会创建一个安全标识符 (SID),表示应用程序池本身的名称。 例如,如果使用名称“MyNewAppPool”创建应用程序池,则会在 Windows 安全系统中创建名为“MyNewAppPool”的 SID。 可使用此标识保护资源。 然而,请注意,该标识不是真正的用户帐户,它不会在 Windows 用户管理控制台中显示为用户。
尝试在 Windows 资源管理器®中选择某个文件并将“DefaultAppPool”标识添加到其访问控制列表 (ACL):
- 启动 Windows 资源管理器。
- 选择某个文件或目录。
- 右键单击文件名,然后单击“属性”。
- 单击“安全”选项卡。
- 单击“编辑”,然后单击“添加”。
- 单击“位置”,然后选择你的计算机。
- 在“输入要选择的对象名称”文本框中,键入“iis apppool\defaultapppool”
- 单击“检查名称”,然后单击“确定”。
你之前选择的文件或目录现在也允许 DefaultAppPool 标识访问。
图 4:选择用户或组
还可以将命令行与 Icacls.exe 工具一起使用。 下面提供了对 DefaultAppPool 标识的完全访问权限:
ICACLS test.txt /grant "IIS AppPool\DefaultAppPool":F
在 Windows® 7 和 Windows Server® 2008 R2 操作系统上,默认运行应用程序池作为此安全标识符(作为应用程序池标识)。 名为“AppPoolIdentity”的新标识类型可用。 如果选择“AppPoolIdentity”标识类型(Windows 7 和 Windows Server 2008 R2 上的默认值),IIS 将作为应用程序池标识运行工作进程。 对于所有其他标识类型,安全标识符只会注入到进程的访问令牌中。 如果注入了标识符,则仍可为 AppPool 标识对内容进行 ACL 设置,但令牌的所有者可能并不唯一。 请参阅下面的“隔离应用程序池”部分。
访问网络
在域环境中使用 NETWORKSERVICE 帐户有好处。 作为 NETWORKSERVICE 运行的工作进程可以作为计算机帐户访问网络。 当计算机加入域时,将生成计算机帐户:
<domainname>\<machinename>$,
例如:
mydomain\machine1$
网络资源(如文件共享或 Microsoft® SQL Server® 数据库)可以进行 ACL 设置,以允许访问此计算机帐户。 应用程序池标识还使用计算机帐户访问网络资源。 不需要进行任何更改。
应用程序池标识的兼容性问题
应用程序池标识的挑战是,指导文档显式建议为 NETWORKSERVICE(IIS 6.0 和 7.0 中 DefaultAppPool 的默认标识)的资源进行 ACL 设置。 用户在 IIS 7.5 及更高版本上运行时必须更改其脚本,为“IIS AppPool\DefaultAppPool”进行 ACL 设置。
IIS 不会加载 Windows 用户配置文件,但某些应用程序(如 Microsoft® SQL Server® 2008 Express)仍可使用它(例如,为了存储临时数据)。 必须创建用户配置文件,以将临时数据存储在配置文件目录或注册表配置单元中。 NETWORKSERVICE 帐户的用户配置文件由系统创建,并且始终可用。 但是,切换到唯一的应用程序池标识时,系统不会创建用户配置文件。 只有标准应用程序池(DefaultAppPool 和经典 .NET AppPool)在磁盘上具有用户配置文件。 如果管理员创建了新的应用程序池,则不会创建任何用户配置文件。
然而,请注意,可以将 IIS 应用程序池配置为加载用户配置文件,方法是将“LoadUserProfile”设置设为“true”。
隔离应用程序池
将应用程序分成多个应用程序池不仅可以提高性能,还能提高服务器和站点可靠性。 但是,在之前版本的 IIS 中,有时很难将 Web 应用程序池彼此隔离。 如果将多个应用程序池配置为使用相同的标识运行,则在一个应用程序池中运行的代码可以使用文件系统对象 (FSO) 访问属于另一个池的资源。
在 IIS 7 中,每个应用程序池都有一个配置文件,该文件是在应用程序池启动时生成的。 这些文件默认存储在 %systemdrive%\inetpub\temp\AppPools
文件夹中。
每个应用程序池还具有添加到相关 w3wp.exe 进程的安全标识符 (SID)。 应用程序池的配置文件加入了访问控制列表 (ACLed),从而仅允许访问该 SID。
可以使用 Icacls.exe 工具来识别应用于任何给定应用程序池配置文件的 SID,方法是:
icacls.exe %systemdrive%\inetpub\temp\appPools\appPool.config /save output.txt
用户可以使用应用程序池 SID 来为其内容设置 ACL 并保护其网站。 这对于需要接受来自各种外部源的内容的 Web 宿主非常有用。
- 将每个网站(或 Web 应用程序)配置为在其自己的 Web 应用程序池中运行。
- 通过编辑匿名身份验证属性,将匿名身份验证配置为使用应用程序池标识,而不是行业可用性报告 (IUSR) 帐户。
- 从网站的文件和文件夹中移除 IUSRS 组和 IUSR 帐户的 NTFS 权限。
- 使用 Icacls.exe 工具为应用程序池的 SID 提供对网站的文件和文件夹的“读取”(以及可选的“执行”和“写入”)访问权限。 可以使用 IIS APPPOOL\ApplicationPoolName 作为用户授予读取权限。
配置完 NTFS 权限后,只有注入到特定 w3wp.exe 进程的 SID 才能读取网站的内容。 在其他 w3wp.exe 进程中运行的所有代码(即使使用相同的标识运行)将无法访问此网站的内容。
注意
本文基于 IIS 团队编写并于 2009 年 5 月 27 日发布的应用程序池标识中的材料。