确保网站的安全隔离

作者:Tali Smith

介绍

在共享托管环境中隔离网站的建议与 Internet Information Services 7 (IIS 7) 及更高版本的所有常规安全隔离建议一致。 具体而言,建议执行以下操作:

  • 每个网站使用一个应用程序池。
  • 使用专用用户帐户作为应用程序池的标识。
  • 配置匿名用户标识以使用应用程序池标识。
  • 确保在 Php.ini 文件中启用 FastCGI 模拟。

应用程序池的体系结构视图显示在下图中。

Diagram of the relationship between Application Pool I Ds in User Mode and the H T T P dot SYS in Kernal Mode.

图 1:应用程序池

创建应用程序池

可以通过 UI 或命令行创建应用程序池。

  1. 在 IIS 管理器中,导航到“连接”窗格。
  2. 选择“应用程序池”选项,然后选择“添加应用程序池”以打开“添加应用程序池”对话框。
  3. 输入应用程序池的唯一名称。
  4. 选择要使用的应用程序池的 Microsoft® .NET Framework 版本(如果有),然后选择管道模式。

创建完池后,可以根据需要更改其设置。

  1. 在“连接”窗格中,选择“应用程序池”。
  2. 在“工作”窗格中,选择要配置的应用程序池。
  3. 在“操作”窗格中,选择“基本设置”。 请注意,除了对话框标题之外,“基本设置”对话框和“添加应用程序池”对话框看起来完全相同。

也可使用命令行。 使用:

appcmd add apppool /name:string

请注意,字符串是应用程序池的名称。

“编辑应用程序池”对话框让你可以配置 IIS 7 及更高版本如何处理应用程序池的工作进程回收。

Screenshot of the Edit Application Pool dialog box.

图 2:编辑应用程序池

应用程序池标识

应用程序池标识是一项新的安全功能,可用于在唯一帐户下运行应用程序池,而无需创建和管理域或本地帐户。 应用程序池帐户的名称对应于应用程序池的名称。 下图显示了作为 DefaultAppPool 标识运行的 IIS 工作进程 (w3wp.exe)。

Screenshot of the Windows Task Manager screen with a focus on the w 3 w p dot e x e file in the Image Name field and the DefaultAppPool identity in the User Name field.

图 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):

  1. 启动 Windows 资源管理器。
  2. 选择某个文件或目录。
  3. 右键单击文件名,然后单击“属性”。
  4. 单击“安全”选项卡。
  5. 单击“编辑”,然后单击“添加”。
  6. 单击“位置”,然后选择你的计算机。
  7. 在“输入要选择的对象名称”文本框中,键入“iis apppool\defaultapppool”
  8. 单击“检查名称”,然后单击“确定”

你之前选择的文件或目录现在也允许 DefaultAppPool 标识访问。

Screenshot of the Select Users or Groups screen.

图 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 宿主非常有用。

  1. 将每个网站(或 Web 应用程序)配置为在其自己的 Web 应用程序池中运行。
  2. 通过编辑匿名身份验证属性,将匿名身份验证配置为使用应用程序池标识,而不是行业可用性报告 (IUSR) 帐户。
  3. 从网站的文件和文件夹中移除 IUSRS 组和 IUSR 帐户的 NTFS 权限。
  4. 使用 Icacls.exe 工具为应用程序池的 SID 提供对网站的文件和文件夹的“读取”(以及可选的“执行”和“写入”)访问权限。 可以使用 IIS APPPOOL\ApplicationPoolName 作为用户授予读取权限。

配置完 NTFS 权限后,只有注入到特定 w3wp.exe 进程的 SID 才能读取网站的内容。 在其他 w3wp.exe 进程中运行的所有代码(即使使用相同的标识运行)将无法访问此网站的内容。

注意

本文基于 IIS 团队编写并于 2009 年 5 月 27 日发布的应用程序池标识中的材料。