应用程序池标识

作者:Thomas Deml

无论是在自己的服务器上还是在云中运行网站,安全性都必须位于优先事项列表的首位。 如果是这样,你会很高兴地听到 IIS 有一个称为应用程序池标识的安全功能。 此功能是在 Windows Server 2008 和 Windows Vista 的 Service Pack 2 (SP2) 中引入的。 应用程序池标识允许在唯一帐户下运行应用程序池,而无需创建和管理域或本地帐户。 应用程序池帐户的名称对应于应用程序池的名称。 下图显示了作为 DefaultAppPool 标识运行的 IIS 工作进程 (W3wp.exe)。

Screenshot of the Task Manager screen with a focus on the W 3 W P dot E X E I I S worker process.

应用程序池标识帐户

默认情况下,IIS 6.0 和 IIS 7 中的工作进程作为网络服务运行。 网络服务是一个内置的 Windows 标识。 它不需要密码,并且只有用户特权;也就是说,它的特权相对较低。 作为低特权帐户运行是一种良好的安全做法,因为恶意用户无法使用软件 bug 接管整个系统。

然而,随着时间的推移,随着越来越多的 Windows 系统服务开始作为网络服务运行,出现了一个问题。 这是因为作为网络服务运行的服务可以篡改在同一标识下运行的其他服务。 由于 IIS 工作进程默认运行第三方代码(经典 ASP、ASP.NET、PHP 代码),因此是时候将 IIS 工作进程与其他 Windows 系统服务隔离,并在唯一标识下运行 IIS 工作进程。 Windows 操作系统提供一个名为“虚拟帐户”的功能,允许 IIS 为其每个应用程序池创建唯一标识。 有关虚拟帐户的详细信息,请参阅服务帐户分步指南

配置 IIS 应用程序池标识

如果在 Windows Server 2008 R2 或更高版本的 IIS 上运行 IIS 7.5,则无需执行任何操作即可使用新标识。 对于创建的每个应用程序池,新应用程序池的 Identity 属性默认设置为 ApplicationPoolIdentity。 IIS 管理进程 (WAS) 将使用新应用程序池的名称创建一个虚拟帐户,并默认在此帐户下运行应用程序池的工作进程。

若要在 Windows Server 2008 上运行 IIS 7.0 时使用此虚拟帐户,必须将创建的应用程序池的 Identity 属性更改为 ApplicationPoolIdentity。 下面为解决方法:

  1. 打开 IIS 管理控制台 (INETMGR.MSC)。

  2. 打开计算机节点下的“应用程序池”节点。 选择要更改为在自动生成的应用程序池标识下运行的应用程序池。

  3. 右键单击应用程序池并选择“高级设置

    Screenshot of the Advanced Settings dialog with the Identity setting being highlighted.

  4. 选择“标识”列表项,然后单击省略号(带有三个点的按钮)。

  5. 以下对话框随即出现:

    Screenshot of the Application Pool Identity dialog with the Application Pool Identity option being highlighted.

  6. 选择“内置帐户”按钮,然后从组合框中选择标识类型 ApplicationPoolIdentity

若要使用命令行执行相同的步骤,可以通过以下方式调用 appcmd 命令行工具:

%windir%\system32\inetsrv\appcmd.exe set AppPool <your AppPool> -processModel.identityType:ApplicationPoolIdentity

保护资源

每当创建新的应用程序池时,IIS 管理进程将创建一个安全标识符 (SID),该标识符表示应用程序池本身的名称。 例如,如果使用名称“MyNewAppPool”创建应用程序池,则会在 Windows 安全系统中创建名为“MyNewAppPool”的安全标识符。 从此开始,可以使用此标识保护资源。 但是,标识不是真正的用户帐户;它不会在 Windows 用户管理控制台中显示为用户。

可以通过在 Windows 资源管理器中选择文件并将“DefaultAppPool”标识添加到文件的访问控制列表 (ACL) 来尝试此操作。

  1. 打开“Windows 资源管理器”

  2. 选择一个文件或目录。

  3. 右键单击该文件并选择“属性

  4. 选择“安全”选项卡

  5. 单击“编辑”按钮,然后单击“添加”按钮

  6. 单击“位置”按钮,确保选择自己的计算机。

    Screenshot of the Select Users or Groups dialog.

  7. 在“输入要选择的对象名称:”文本框中,输入 IIS AppPool\DefaultAppPool

  8. 单击“检查名称”按钮,然后单击“确定”。

通过执行此操作,你选择的文件或目录现在还允许 DefaultAppPool 标识访问。

可以使用 ICACLS 工具通过命令行执行此操作。 以下示例提供对 DefaultAppPool 标识的完全访问权限。

ICACLS test.txt /grant "IIS AppPool\DefaultAppPool:F"

有关详细信息,请参阅 ICACLS

在 Windows 7 和 Windows Server 2008 R2 及更高版本的 Windows 上,默认设置是将应用程序池作为应用程序池标识运行。 为实现这一点,引入了名为“AppPoolIdentity”的新标识类型。 如果选择“AppPoolIdentity”标识类型(Windows 7 和 Windows Server 2008 R2 及更高版本上的默认值),IIS 将作为应用程序池标识运行工作进程。 对于所有其他标识类型,安全标识符将仅注入到进程的访问令牌中。 如果注入了标识符,则仍然可以为 ApplicationPoolIdentity 对内容进行 ACL 访问,但令牌的所有者可能不是唯一的。 有关此概念的详细信息,请参阅 IIS 7 中的新增功能 - 应用池隔离博客文章。

访问网络

在域环境中使用网络服务帐户有很大的好处。 作为网络服务运行的工作进程将以计算机帐户身份访问网络。 当计算机加入域时,将生成计算机帐户。 它们如下所示:

<domainname>\<machinename>$,

例如:

mydomain\machine1$

这样做的好处是,可以对文件共享或 SQL Server 数据库等网络资源进行 ACL 访问,以允许此计算机帐户访问。

应用程序池标识怎么样?

好消息是,应用程序池标识还使用计算机帐户访问网络资源。 不需要进行任何更改。

应用程序池标识的兼容性问题

指导文档

应用程序池标识的最大兼容性问题可能是早期的指导文档,这些文档明确建议你对网络服务的资源进行 ACL 访问,即 IIS 6.0 和 IIS 7.0 中 DefaultAppPool 的默认标识。 客户在 IIS 7.5 或更高版本上运行时,必须将其脚本更改为“IIS AppPool\DefaultAppPool”(或其他应用程序池名称)的 ACL(请参阅上面的示例,了解如何执行此操作)。

用户配置文件

IIS 不会加载 Windows 用户配置文件,但某些应用程序可能会利用它来存储临时数据。 SQL Express 是执行此操作的应用程序的示例。 但是,必须创建用户配置文件,以便将临时数据存储在配置文件目录或注册表配置单元中。 网络服务帐户的用户配置文件由系统创建,并且始终可用。 但是,切换到唯一的应用程序池标识时,系统不会创建任何用户配置文件。 只有标准应用程序池(DefaultAppPool 和经典 .NET AppPool)在磁盘上具有用户配置文件。 如果管理员创建新的应用程序池,则不会创建用户配置文件。

但是,如果需要,可以通过将 LoadUserProfile 属性设置为“true”来将 IIS 应用程序池配置为加载用户配置文件。

总结

应用程序池标识是针对 Windows Server 2008、Windows Vista 和更高版本的 Windows 引入的一项功能强大的新隔离功能。 它将使运行 IIS 应用程序更加安全可靠。