本文使用假设的客户端和服务器部署来演示 Kerberos 身份验证问题的故障排除方法。
环境和配置
用户“John”属于域
contoso.com
。所有域的域名系统(DNS)服务器都是域控制器。
John 登录到配置如下的客户端计算机:
名称和域:
Client1.contoso.com
作系统:Windows 11
浏览器:Microsoft Edge
监视应用程序:网络监视器(从 Microsoft网络监视器安装)
Internet 选项配置:所有
contoso.com
站点都属于本地 Intranet 区域
在客户端计算机上,John 连接到配置如下的目标服务器:
名称和域:
IISServer.contoso.com
作系统:Windows Server 2019
目标服务:在 Internet Information Services 上运行的网站(IIS)
目标服务帐户:计算机帐户(服务在上下文
IISServer.contoso.com
中运行)目标服务端口:TCP 端口 80
身份验证配置(在 Internet Information Services Manager 中配置):
Windows 身份验证已启用。
已启用的身份验证提供程序列表包括 Negotiate,如以下屏幕截图所示:
登录审核配置:已启用登录成功审核和登录失败审核。
注释
默认情况下,所有 Windows Server作系统都已启用成功和失败登录审核。 若要验证此设置,请打开管理命令提示符窗口,然后运行以下命令:
auditpol /get /Subcategory:"logon"
如果启用此设置,此命令将生成以下输出:
System audit policy Category/Subcategory Setting Logon/Logoff Logon Success and Failure
如果未看到此结果,请运行以下命令以启用成功和失败审核日志记录:
auditpol /set /subcategory:"Logon" /Success:enable /Failure:enable
预期的身份验证流
下图显示了 Kerberos 请求和响应消息的顺序以及上一部分所述的环境中的这些消息的路径。
当登录到客户端计算机 Client1.contoso.com
的用户 John 打开Microsoft Edge 浏览器并连接到 IISServer.contoso.com
时,该过程将启动。
步骤 1 在客户端计算机上发生,并包括以下步骤:
- DNS 解析程序服务缓存
IISServer.contoso.com
以检查此信息是否已缓存。 - DNS 解析程序服务检查 HOSTS 文件(C:\Windows\System32\drivers\etc\Hosts)是否有任何映射
IISServer.contoso.com
。 - DNS 客户端服务将 DNS 查询发送到首选 DNS 服务器(在 IP 配置设置上配置)。
步骤 2 发生在 DNS 服务器(域控制器)上,并包括以下步骤:
- DNS 服务器服务会检查其配置的区域,找到主机“A”记录,并解析
IISServer.contoso.com
为 IP 地址192.168.2.104
。 - DNS 服务器将 IP 地址返回到客户端计算机。
步骤 3 在客户端计算机上发生,并包括以下步骤:
- 客户端计算机使用 TCP 端口 80 执行 TCP 三向握手
IISServer.contoso.com
。 - 客户端计算机将匿名 HTTP 请求发送到
IISServer.contoso.com
。
步骤 4 在目标服务器上发生,并包括以下步骤:
- Web 服务(运行为
IISServer.contoso.com
)接收来自Client1.contoso.com
的请求。 - Web 服务将响应消息发送到
Client1.contoso.com
包含“HTTP 401”质询响应。 该消息将 Negotiate 指定为首选身份验证提供程序,将 NTLM 指定为辅助身份验证提供程序。
步骤 5 在客户端计算机上发生,并包括以下步骤:
- 客户端计算机从
IISServer.contoso.com
中接收质询响应消息。 - Microsoft Edge 进程验证是否
IISServer.contoso.com
属于本地 Intranet 区域。 因此,身份验证过程应使用 Kerberos 而不是 NTLM。 - Microsoft Edge 进程调用 LSASS.exe 以查找服务票证
IISServer.contoso.com
。 - 在这种情况下,客户端计算机没有适当的服务票证。 Microsoft Edge 进程向 Kerberos 分发中心 (KDC) 发送票证请求。
步骤 6 发生在域控制器上,并包括以下步骤:
- 域控制器(KDC 服务)接收请求
Client1.contoso.com
,并搜索使用 SPNHTTP\IISServer.contoso.com
(或HOST\IISServer.contoso.com
) 的服务。 - 域控制器将请求的服务标识为在上下文
IISServer.contoso.com
中运行的 Web 服务。 - 域控制器将响应发送到客户端计算机,其中包括 Web 服务的服务票证
IISServer.contoso.com
。
步骤 7 在域控制器上发生,并包括以下步骤:
- Microsoft Edge 进程将创建包含服务票证的 Kerberos 应用程序协议(AP)消息。
- Microsoft Edge 进程将 AP 消息发送到
IISServer.contoso.com
,以响应“HTTP 401”质询响应消息。
步骤 8 在 Web 服务器上发生,并包括以下步骤:
- IIS 进程查询本地 LSASS.exe 进程。
- LSASS.exe 进程解密票证,然后为包含 SessionID 和 John 组成员身份的用户创建令牌。
- LSASS.exe 进程将令牌句柄返回给 IIS 进程。
- IIS 进程检查令牌中的组信息,以确保 John 有权访问请求的页面。
- IIS 进程将请求的页面发送到浏览器。
使用网络监视器记录身份验证测试
使用以下步骤在类似于“ 环境和配置 ”部分中介绍的环境上收集跟踪数据。 在此测试期间,系统组件应按照 预期身份验证流 部分中所述的方式进行交互。
注释
若要使用本节中的过程,必须属于本地管理员组:
- 在客户端计算机上,打开管理命令提示符窗口,然后运行
ipconfig /flushdns
。 - 打开网络监视器并开始录制。
- 打开 Microsoft Edge。 在地址栏中输入
http://iisserver.contoso.com
。 - 当 Microsoft Edge 操作完成后,停止在网络监视器中进行录制。
查看身份验证测试生成的数据
身份验证测试生成以下信息:
- 网络监视器跟踪数据
- 票证数据
- 身份验证事件的审核成功和审核失败事件数据
本部分的其余部分更详细地介绍了身份验证流生成的数据。
查看重要事件的跟踪数据
在跟踪数据中,查找类似于以下跟踪摘录的信息:
针对主机“A”记录
IISServer.contoso.com
的域控制器的 DNS 查询:3005 00:59:30.0738430 Client1.contoso.com DCA.contoso.com DNS DNS:QueryId = 0x666A, QUERY (Standard query), Query for iisserver.contoso.com of type Host Addr on class Internet
来自域控制器上的 DNS 服务的 DNS 响应:
3006 00:59:30.0743438 DCA.contoso.com Client1.contoso.com DNS DNS:QueryId = 0x666A, QUERY (Standard query), Response - Success, 192.168.2.104
从 Microsoft Edge 进程
Client1.contoso.com
到IISServer.contoso.com
IIS Web 服务器的匿名请求:3027 00:59:30.1609409 Client1.contoso.com iisserver.contoso.com HTTP HTTP:Request, GET / Host: iisserver.contoso.com
HTTP 401 质询响应消息从
IISServer.contoso.com
到Client1.contoso.com
3028 00:59:30.1633647 iisserver.contoso.com Client1.contoso.com HTTP HTTP:Response, HTTP/1.1, Status: Unauthorized, URL: /favicon.ico Using Multiple Authetication Methods, see frame details WWWAuthenticate: Negotiate WWWAuthenticate: NTLM
请求向域控制器
DCA.contoso.com
发送服务票证,适用于以HTTP/iisserver.contoso.com
作为其 SPN 的服务(也称为 TGS 请求消息):3034 00:59:30.1834048 Client1.contoso.com DCA.contoso.com KerberosV5 KerberosV5:TGS Request Realm: CONTOSO.COM Sname: HTTP/iisserver.contoso.com
来自
DCA.contoso.com
的服务票证响应,其中包括用于IISServer.contoso.com
的服务票证(也称为 TGS 响应消息):3036 00:59:30.1848687 DCA.contoso.com Client1.contoso.com KerberosV5 KerberosV5:TGS Response Cname: John Ticket: Realm: CONTOSO.COM, Sname: HTTP/iisserver.contoso.com Sname: HTTP/iisserver.contoso.com
Microsoft Edge 进程中的第二个请求从
Client1.contoso.com
到IISServer.contoso.com
。 此消息包括服务票证:3040 00:59:30.1853262 Client1.contoso.com iisserver.contoso.com HTTP HTTP:Request, GET /favicon.ico , Using GSS-API Authorization Authorization: Negotiate Authorization: Negotiate YIIHGwYGKwYBBQUCoIIHDzCCBwugMDAuBgkqhkiC9xIBAgIGCSqGSIb3EgECAgYKKwYBBAGCNwICHgYKKwYBBAGCNwICCqKCBtUEggbRYIIGzQYJKoZIhvcSAQICAQBugga8MIIGuKADAgEFoQMCAQ6iBwMFACAAAACjggTvYYIE6zCCBOegAwIBBaENGwtDT05UT1NPLkNPTaIoMCagAwIBAqEfMB0bBEhUVFAbF SpnegoToken: 0x1 NegTokenInit: ApReq: KRB_AP_REQ (14) Ticket: Realm: CONTOSO.COM, Sname: HTTP/iisserver.contoso.com
从 IIS 服务器的信息到
Client1.contoso.com
. 此消息指示用户已经过身份验证和授权:3044 00:59:30.1875763 iisserver.contoso.com Client1.contoso.com HTTP HTTP:Response, HTTP/1.1, Status: Not found, URL: / , Using GSS-API Authentication WWWAuthenticate: Negotiate oYG2MIGzoAMKAQChCwYJKoZIgvcSAQICooGeBIGbYIGYBgkqhkiG9xIBAgICAG+BiDCBhaADAgEFoQMCAQ+ieTB3oAMCARKicARuIF62dHj2/qKDRV5XjGKmyFl2/z6b9OHTCTKigAatXS1vZTVC1dMvtNniSN8GpXJspqNvEfbETSinF0ee7KLaprxNgTYwTrMVMnd95SoqBkm/FuY7WbTAuPvyRmUuBY3EKZEy NegotiateAuthorization: GssAPI: 0x1 NegTokenResp: ApRep: KRB_AP_REP (15)
查看客户端计算机上的票证信息
在客户端计算机上的命令提示符下,运行 klist tickets
。 输出应类似于以下摘录:
Client: John @ CONTOSO.COM
Server: HTTP/iisserver.contoso.com @ CONTOSO.COM
KerbTicket Encryption Type: AES-256-CTS-HMAC-SHA1-96
Ticket Flags 0x40a10000 -> forwardable renewable pre_authent name_canonicalize
Start Time: 11/28/2022 0:59:30 (local)
End Time: 11/28/2022 10:58:56 (local)
Renew Time: 12/5/2022 0:58:56 (local)
Session Key Type: AES-256-CTS-HMAC-SHA1-96
Cache Flags: 0
Kdc Called: DCA.contoso.com
查看目标服务器上的审核事件
在事件查看器中 IISServer.contoso.com
,转到 Windows 日志>安全 日志以查看登录(登录)事件。 查找事件 ID 4624 或 4625 的实例,并检查以下字段:
- 关键字: 审核成功 或 审核失败
- 登录类型: 3 (网络登录)
- “新建登录”字段中的安全 ID:Contoso\John
- 源网络地址:客户端计算机的 IP 地址
- 登录过程 和 身份验证包: Kerberos
事件记录的全文类似于以下摘录:
Log Name: Security
Source: Microsoft-Windows-Security-Auditing
Date: 11/28/2022 12:59:30 AM
Event ID: 4624
Task Category: Logon
Level: Information
Keywords: Audit Success
User: N/A
Computer: IISServer.contoso.com
Description:
An account was successfully logged on.
Subject:
Security ID: NULL SID
Account Name: -
Account Domain: -
Logon ID: 0x0
Logon Information:
Logon Type: 3
Restricted Admin Mode: -
Virtual Account: No
Elevated Token: No
Impersonation Level: Impersonation
New Logon:
Security ID: CONTOSO\John
Account Name: John
Account Domain: CONTOSO.COM
Logon ID: 0x1B64449
Linked Logon ID: 0x0
Network Account Name: -
Network Account Domain: -
Logon GUID: {<GUID>}
Process Information:
Process ID: 0x0
Process Name: -
Network Information:
Workstation Name: -
Source Network Address: 192.168.2.101
Source Port: 52655
Detailed Authentication Information:
Logon Process: Kerberos
Authentication Package: Kerberos
对身份验证工作流进行故障排除
查看网络跟踪,观察哪个步骤失败,以便缩小问题发生过程中的位置。 使用此信息来确定哪些故障排除方法可以帮助你解决问题。
验证网络连接
如果 DNS 或 TCP 通信中似乎出现问题,请检查以下交互:
验证是否可以从客户端计算机(
Client1.contoso.com
)解析目标服务器(IISServer.contoso.com
)的名称。验证 DNS 服务器是否正确解析目标服务器 IP 地址。 为此,请打开 PowerShell 窗口,然后运行以下 cmdlet:
Resolve-DnsName -Name IISServer.contoso.com
此 cmdlet 的输出应类似于以下摘录:
Name Type TTL Section IPAddress ---- ---- --- ------- --------- IISServer.contoso.com A 1200 Answer 192.168.2.104
验证客户端计算机和目标服务器之间是否打开了所需的网络端口。 为此,请运行以下 cmdlet:
Test-NetConnection -Port 80 IISServer.contoso.com
此 cmdlet 的输出应类似于以下摘录:
ComputerName : IISServer.contoso.com RemoteAddress : 192.168.2.104 RemotePort : 80 InterfaceAlias : Ethernet 2 SourceAddress : 192.168.2.101 TcpTestSucceeded : True
验证客户端计算机上的票证信息
在尝试访问网站的用户的上下文中打开标准命令提示符窗口(而不是管理命令提示符窗口)。
按给定顺序运行以下命令:
klist purge klist get http/iisserver.contoso.com
这些命令的输出应类似于以下摘录:
Current LogonId is 0:0xa8a98b A ticket to http/iisserver.contoso.com has been retrieved successfully. Cached Tickets: (2) #0> Client: John @ CONTOSO.COM Server: krbtgt/CONTOSO.COM @ CONTOSO.COM KerbTicket Encryption Type: AES-256-CTS-HMAC-SHA1-96 Ticket Flags 0x40e10000 -> forwardable renewable initial pre_authent name_canonicalize Start Time: 11/28/2022 1:28:11 (local) End Time: 11/28/2022 11:28:11 (local) Renew Time: 12/5/2022 1:28:11 (local) Session Key Type: AES-256-CTS-HMAC-SHA1-96 Cache Flags: 0x1 -> PRIMARY Kdc Called: DCA.contoso.com #1> Client: John @ CONTOSO.COM Server: http/iisserver.contoso.com @ CONTOSO.COM KerbTicket Encryption Type: AES-256-CTS-HMAC-SHA1-96 Ticket Flags 0x40a10000 -> forwardable renewable pre_authent name_canonicalize Start Time: 11/28/2022 1:28:11 (local) End Time: 11/28/2022 11:28:11 (local) Renew Time: 12/5/2022 1:28:11 (local) Session Key Type: AES-256-CTS-HMAC-SHA1-96 Cache Flags: 0 Kdc Called: DCA.contoso.com
此摘录表明已成功取回票证。 票证的详细信息在缓存票证部分中标记为“#1>”。
使用默认凭据验证 IIS Web 服务是否在 IIS 服务器上运行
在尝试访问网站的用户的上下文中打开标准 PowerShell 提示窗口(而不是管理 PowerShell 提示窗口):
invoke-webrequest -Uri http://IIsserver.contoso.com -UseDefaultCredentials
这些命令的输出应类似于以下摘录:
StatusCode : 200
StatusDescription : OK
Content : <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" cont...
RawContent : HTTP/1.1 200 OK
Persistent-Auth: true
Accept-Ranges: bytes
Content-Length: 703
Content-Type: text/html
Date: Mon, 28 Nov 2022 09:31:40 GMT
ETag: "3275ea8a1d91:0"
Last-Modified: Fri, 25 Nov 2022...
查看目标服务器上的安全事件日志
在目标服务器上的事件查看器中,转到 Windows 日志>安全 日志。 查找事件 ID 4624(审核成功)或 4625(审核失败)的实例。
验证其他服务是否正常运行
若要验证目标服务器上的其他服务是否可以处理 Kerberos 身份验证,请执行以下步骤:
在目标服务器上,创建文件共享或标识用于测试的现有文件共享。 确保(在“John”角色中)对文件夹具有“读取”权限。
在客户端计算机上,以用户“John”身份登录,然后打开 Windows 资源管理器。
在地址栏中,输入 \\IISServer.contoso.com \Software$。
在目标服务器上,打开事件查看器,然后查看安全事件。 验证是否有新的事件 ID 4624 事件,或事件 ID 4625 事件。
在客户端计算机上,在命令提示符处运行
klist tickets
命令。 命令输出应包括服务票据CIFS/IISServer.contoso.com
,如以下摘录所示:#1> Client: John @ CONTOSO.COM Server: cifs/iisserver.contoso.com @ CONTOSO.COM KerbTicket Encryption Type: AES-256-CTS-HMAC-SHA1-96 Ticket Flags 0x40a10000 -> forwardable renewable pre_authent name_canonicalize Start Time: 11/28/2022 1:40:22 (local) End Time: 11/28/2022 11:28:11 (local) Renew Time: 12/5/2022 1:28:11 (local) Session Key Type: AES-256-CTS-HMAC-SHA1-96 Cache Flags: 0 Kdc Called: DCA.contoso.com