了解 IIS 中的标识

简介

本文提供有关 Internet 信息服务(IIS)中的标识的背景信息。

目录

更多信息

应用程序池标识

若要了解应用程序池标识,必须了解标识。 简单地说,n 标识 是 Windows 帐户。 在 Windows 中运行的每个进程在一个标识下运行。 应用程序由辅助进程通过使用 Windows 标识运行。 所使用的 Windows 标识依赖于应用程序池标识,该标识可以是以下任意帐户:

应用程序池标识

  • 本地系统:完全受信任的帐户,具有非常高的权限,并且还具有对网络资源的访问权限。

  • 网络服务:受限或受限服务帐户,通常用于运行标准的、最少权限的服务。此帐户的权限比本地系统帐户的权限更少。此帐户有权访问网络资源。

  • 本地服务:受限或受限服务帐户,它非常类似于网络服务,旨在运行标准、最少权限的服务。此帐户无权访问网络资源。

  • ApplicationPoolIdentity:创建新的应用程序池时,IIS 会创建一个虚拟帐户,该帐户具有新应用程序池的名称,并在此帐户下运行应用程序池工作进程。这也是一个具有最少权限的帐户。

  • 自定义帐户:除了这些内置帐户之外,您还可以通过指定用户名和密码来使用自定义帐户。

应用程序池标识之间的差异

方案1:事件日志访问

在此方案中,你有一个 web 应用程序,可在运行时创建自定义事件日志(MyWebAppZone)和事件日志源(MyWebAppZone.com)。 使用任何标识运行的应用程序都可以使用现有事件源写入事件日志。 但是,如果它们在除本地系统之外的标识下运行,则由于注册表权限不足,因此无法创建新的事件源。

我不同区域的 Web 应用程序

例如,如果您在 "网络服务" 下运行该应用程序,则会收到以下安全异常:

服务器错误

同时运行 ProcMon 跟踪时,通常会发现 NT AUTHORITY\NETWORK 服务没有以下注册表子项所需的读写访问权限:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\

这是注册表中存储事件日志的所有设置的位置。

流程监视 1

方案2:注册表访问

除了本地系统,其他应用程序池标识对注册表具有写访问权限。 在此方案中,你开发了一个简单的 web 应用程序,该应用程序可以更改和显示 Windows 自动与之同步的 Internet 时间服务器的名称。 如果在 "本地服务" 下运行此应用程序,将收到异常。 如果你检查 ProcMon 跟踪,你会发现 "NT AUTHORITY\LOCAL 服务"应用程序池标识在以下注册表子项中没有读写访问权限:

HKEY_LOCAL_MACHINE \SOFTWARE\Microsoft\Windows\CurrentVersion\DateTime\Servers.

流程监视 2

如果你检查 MyWebAppZone事件日志 (来自方案1),则会发现以下错误事件已记录。 它包含 "不允许所请求的注册表访问"错误消息。

异常类型: SecurityException 消息:不允许所请求的注册表访问。 堆栈跟踪    在 OpenSubKey (字符串名称,布尔可写)中    在 Identities.ChangeTimeServer.Page_Load (对象发件人、EventArgs e)    在 LoadRecursive ()的()    在 ProcessRequestMain (布尔 includeStagesBeforeAsyncPoint,布尔 includeStagesAfterAsyncPoint)中    在 ProcessRequest (布尔 includeStagesBeforeAsyncPoint,布尔 includeStagesAfterAsyncPoint)中    在 ProcessRequest ()中,    在 ProcessRequest (HttpContext 上下文)中    ASP.changetimeserver_aspx。ProcessRequest (HttpContext 上下文)在 c:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\root\fd06117a\f8c94323\ 中 App_Web_ysqbhk00。 2. cs:第0行    在 HttpApplication ()中的 "CallHandlerExecutionStep" 或 "HttpApplication"    在 HttpApplication ExecuteStep (IExecutionStep step、Boolean& completedSynchronously)  

方案3: Kerberos 身份验证和负载平衡环境中的自定义帐户

你已在方案1和2中看到了内置帐户之间的一些差异。 现在,我们将讨论在负载平衡环境下使用 Kerberos 身份验证时,自定义帐户是什么以及它与内置帐户相比的优势。

通过使用此方法,你可以在配置为使用特定 Windows 标识运行的应用程序池中运行应用程序。 请考虑以下图表,其中应用程序托管在包含两台服务器的负载平衡环境中,并使用 Kerberos 身份验证来标识客户端。

负载平衡器  

建议的阅读

在这种情况下,我们建议你先ead 此博客,了解Kerberos 的工作方式。

要使 Kerberos 身份验证正常工作,你必须使用计算机帐户为这两个服务器设置 SPN。 如果应用程序池在内置帐户下运行,则它将在网络上显示计算机凭据。 例如,如果计算机名为 "Server1",它会显示为 "Server1 $"。 当计算机加入域时,将自动创建此计算机帐户。 因此,如果存在 N 台服务器,则必须设置 N 个与各自的计算机帐户对应的 Spn 数。

将 SPN 注册到计算机帐户:

setspn –a HTTP/HOSTNAME MachineAccount$

例如:

setspn –a HTTP/MyWebAppZone.com Server1$

若要解决此缺陷,可以在自定义窗口(域)标识下运行应用程序,然后将 SPN 仅设置为域控制器中的特定域帐户。

将 SPN 注册到域帐户:

setspn –a HTTP/HOSTNAME domain\account

例如:

setspn –a HTTP/MyWebAppZone.com contoso.com\account_alias

返回页首

Wwwroot 中的默认权限和用户权限

IIS 7.0 和更高版本还使配置应用程序池标识和进行所有必要的更改变得更容易。 当 IIS 启动工作进程时,它必须创建一个该进程将使用的令牌。 创建此令牌时,IIS 会在运行时自动将 IIS_IUSRS 成员身份添加到辅助进程令牌。 作为 "应用程序池标识" 运行的帐户不再必须是 "IIS_IUSRS" 组的显式部分。 如果创建网站,然后将物理位置指向 C:\inetpub\wwwroot,则会将以下用户和组自动添加到网站的ccess 控件列表中。

用户/组

允许的权限

CREATOR OWNER

特殊权限

SYSTEM

完全控制

管理员

完全控制

那些

阅读 & "执行"、"列出文件夹内容"、"读取"

IIS_USRS

读取 & 执行

TrustedInstaller

完全控制

如果要禁用此功能并手动将帐户添加到 IIS_IUSRS 组,请在 Applicationhost.config 文件中将 manualGroupMembership 值设置为 true 。 以下示例显示如何对默认应用程序池执行此操作:

<applicationPools>
    <add name="DefaultAppPool">
        <processModel manualGroupMembership="true" />
    </add>
</applicationPools>

返回页首

了解配置隔离

IIS 工作进程不具有 Applicationhost.config 文件的读取访问权限。 因此,你可能想知道他们可以如何读取此文件中的任何配置集。

答案是使用 IIS 7.0 和更高版本中的配置隔离功能。 Windows Process Activation Service (WAS)将生成此文件的筛选副本,而不是让 IIS 工作进程直接读取 Applicationhost.config。 当在 IIS 工作进程内部读取配置时,每个 IIS 辅助进程都将这些副本用作 Applicationhost.config 的替换项。 默认情况下,这些文件在% SystemDrive%\inetpub\Temp\appPools目录中生成,并且命名为{AppPoolName} .config。 通过使用IIS APPPOOL \AppPoolName应用程序池安全标识符(SID),将这些文件配置为仅允许访问相应应用程序池中的 iis 工作进程。

注意 若要了解有关 SID 的详细信息,请参阅 Microsoft 文档网站上的 "安全标识符" 主题。

应用程序池

这样做的目的是防止来自应用程序池 A 的 IIS 工作进程能够读取用于应用程序池 B 的 Applicationhost.config 文件中的配置信息。

Applicationhost.config 可能包含敏感的个人信息,如自定义应用程序池标识的用户名和密码,或者虚拟目录的用户名和密码。 因此,允许所有应用程序池访问 Applicationhost.config 将中断应用程序池隔离。 如果为每个应用程序池提供对 Applicationhost.config 文件的直接访问权限,则这些池可以通过运行以下命令轻松将敏感信息从其他应用程序池中注销:

appcmd list APPPOOL "DefaultAppPool" /text:*

appcmd

返回页首

IUSR-匿名身份验证

匿名身份验证允许用户在不提示输入用户名或密码的情况下访问网站的公共区域。 在 IIS 7.0 和更高版本中,内置帐户 " IUSR"用于提供匿名访问。 此内置帐户不需要密码。 它将成为启用匿名身份验证时使用的默认标识。 在 Applicationhost.config 文件中,你可以看到以下定义:

<authentication>     <anonymousAuthentication enabled="true" userName="IUSR" /> </authentication> 这将告知 IIS 对所有匿名身份验证请求使用新的内置帐户。 执行此操作的最大优点如下所示:

  • 您不必再担心此帐户的密码即将过期。

  • 你可以使用 xcopy/o 将文件及其所有权和 ACL 信息一起无缝地复制到其他计算机。

你还可以使用特定的 Windows 帐户或应用程序池标识(而不是 IUSR 帐户)向你的网站提供匿名身份验证。

ISUR 与 Connect as 连接

"连接身份" 是 IIS 中的一个选项,可用于决定要用于访问网站的凭据。 你可以使用经过身份验证的用户凭据或特定用户凭据。 若要了解差异,请考虑以下方案:

您有一个配置为使用匿名身份验证的默认网站。 但是,你的网站内容位于另一台服务器上,而你使用 " 连接身份 " 部分通过 "测试" 域用户访问该资源。 当用户登录时,将使用 IUSR 帐户对其进行身份验证。 但是,可通过 " 连接身份" 部分中提及的用户凭据访问网站内容。

要使其更简单,匿名身份验证是网站用于标识用户的机制。 但是,当您使用此功能时,用户不必提供任何凭据。 但是,可能有类似的方案,其中内容位于网络共享中。 在这种情况下,不能使用内置帐户访问网络共享。 而是必须使用特定帐户(域)执行此操作。

返回页首

ASP.NET 模拟

模拟是指假装为其他人的行为。 在技术术语中,它是一个 ASP.NET 的安全功能,它提供控制运行应用程序代码的标识的能力。 当 ASP.NET 在经过身份验证和授权的客户端上下文中运行代码时,将发生模拟。 IIS 通过使用 IUSR 帐户提供对资源的匿名访问。 将请求传递到 ASP.NET 后,应用程序代码将通过使用应用程序池标识运行。

如果应用程序使用匿名身份验证,并且满足下列条件之一,则可以通过 IIS 和 ASP.NET 代码启用模拟:

  • 如果禁用模拟,则应用程序池标识用于运行应用程序代码。

  • 如果启用了模拟,则 "NT AUTHORITY\IUSR" 用于运行应用程序代码。

通过 IIS 启用模拟时,它会将以下标记添加到应用程序的 Web.config 文件中,以模拟 IIS 已验证帐户或用户:

<identity impersonate="true" />

若要针对 ASP.NET 应用程序的所有页面上的所有请求模拟特定用户,可以在该应用程序的 web.config 文件的 <identity> 标记中指定用户名和密码属性。

<identity impersonate="true" userName="accountname" password="password" />

若要通过 ASP.NET 代码实现模拟,请参阅以下 Knoledge 基本文章:

306158 如何在 ASP.NET 应用程序中实现模拟

打开一个模拟 "测试" 本地用户的测试网站的 IIS 工作进程,并检查是否可以找到运行应用程序代码的模拟帐户。

将应用程序池标识设置为 "ApplicationPoolIdentity",并使用 IUSR 帐户提供匿名身份验证。 你可以使用 ProcMon 轻松跟踪模拟标识。 例如,如果你检查与你正在检查的 w3wp 进程对应的 "CreateFile" 事件之一,则可以找到模拟帐户,如以下屏幕截图所示。

事件属性

返回页首

需要更多帮助?

扩展你的技能
了解培训
抢先获得新功能
加入 Microsoft 内部人员

此信息是否有帮助?

谢谢您的反馈意见!

谢谢你的反馈! 可能需要转接到 Office 支持专员。

×