Kerberos 身份验证故障排除指南
本指南提供了排查 Kerberos 身份验证问题时使用的基本概念。
故障排除清单
与 Kerberos 相关的错误是另一种服务失败的症状。 Kerberos 协议依赖于许多服务,这些服务必须可用且正常运行才能进行任何身份验证。
若要确定 Kerberos 身份验证是否出现问题,请在客户端、目标服务器或提供身份验证的域控制器上使用“源”(如 Kerberos、kdc、LsaSrv 或 Netlogon)筛选系统事件日志中是否存在来自任何服务的错误。 如果存在任何此类错误,则也可能存在与 Kerberos 协议关联的错误。
目标服务器安全事件日志上的失败审核可能会显示发生登录失败时正在使用 Kerberos 协议。
在检查 Kerberos 协议之前,请确保以下服务或条件正常运行:
- 网络基础结构正常运行,且所有计算机和服务都可以通信。
- 域控制器可访问。 可以在客户端或目标服务器上运行命令
nltest /dsgetdc:<Domain Name> /force /kdc
(例如nltest /dsgetdc:contoso.com /force /kdc
)。 - 域名系统 (DNS) 已正确配置,并相应地解析主机名和服务。
- 时钟跨域同步。
- Windows Server 的所有关键更新和安全更新将安装。
- 所有软件(包括非 Microsoft 软件)都将更新。
- 如果运行的是服务器操作系统,则会重启计算机。
- 所需的服务和服务器可用。 Kerberos 身份验证协议需要正常运行的域控制器、DNS 基础结构和网络才能正常工作。 在开始对 Kerberos 协议进行故障排除之前,请验证是否可以访问这些资源。
如果已检查所有这些条件,并且仍然遇到身份验证问题或 Kerberos 错误,则需要进一步寻找解决方案。 问题可能是由如何 Kerberos 协议的配置方式或使用 Kerberos 协议的其他技术的配置方式引起的。
常见问题和解决方案
Kerberos 委派问题
在典型方案中,模拟帐户是分配给 Web 应用程序的服务帐户或 Web 服务器的计算机帐户。 模拟帐户是需要通过 Web 应用程序访问资源的用户帐户。
使用 Kerberos 有三种类型的委派:
完全委派(不受约束的委派)
应尽可能避免完全委派。 用户(前端用户和后端用户)可以位于不同的域和不同的林中。
约束委派(仅 Kerberos 和协议转换)
用户可以来自任何域或林,但前端和后端服务应在同一域中运行。
基于资源的约束委派 (RBCD)
用户可以来自任何域,前端和后端资源可以来自任何域或林。
最常见的 Kerberos 委派故障排除
- 服务主体名称缺失或重复
- 名称解析失败或响应不正确(为服务器名称提供错误的 IP 地址)
- 大型 Kerberos 票证大小(MaxTokenSize)和环境未正确设置
- 防火墙或路由器阻止了端口
- 未为服务帐户授予适当的特权(用户权限分配)
- 前端或后端服务不在同一域和约束委派设置(而不是 RBCD)
有关详细信息,请参阅:
单一登录(SSO)中断并提示进行身份验证一次
请考虑下列情形:
- 客户端和服务器应用程序,如 Microsoft Edge 和 Internet Information Services (IIS) 服务器。 IIS 服务器配置有 Windows 身份验证(协商)。
- 客户端和服务器应用程序,例如 SMB 客户端和 SMB 服务器。 默认情况下,SMB 服务器配置有协商安全支持提供程序接口 (SSPI)。
用户打开Microsoft Edge 并浏览内部网站 http://webserver.contoso.com
。 网站配置有 Negotiate,此网站会提示进行身份验证。 用户手动输入用户名和密码后,用户将获得身份验证,网站按预期工作。
注意
此方案是客户端和服务器的一个示例。 对于配置了集成 Windows 身份验证的任何客户端/服务器,采用相同的故障排除方法。
集成Windows 身份验证在用户级别或计算机级别中断。
疑难解答方法
查看可在应用程序或计算机级别启用的集成身份验证设置的客户端配置。 例如,所有基于 HTTP 的应用程序都会在尝试执行集成身份验证时查找站点位于受信任的区域中。
打开 inetcpl.cpl (Internet 选项),所有基于 HTTP 的应用程序都用于 Internet Explorer 配置,并查看网站是否配置为 本地 Intranet。
应用程序还具有执行集成Windows 身份验证的配置。
Microsoft Edge 或 Internet Explorer 具有启用集成 Windows 身份验证的设置。
查看应用程序配置,客户端计算机可以获取给定服务主体名称(SPN)的 Kerberos 票证。 在此示例中,SPN 为
http/webserver.contoso.com
.找到 SPN 时的成功消息:
C:>klist get http/webserver.contoso.com Current LogonId is 0:0x9bd1f A ticket to http/webserver.contoso.com has been retrieved successfully.
找不到 SPN 时出现错误消息:
C:>klist get http/webserver.contoso.com klist failed with 0xc000018b/-1073741429: The SAM database on the Windows Server does not have a computer account for this workstation trust relationship.
确定相应的 SPN 并将其添加到相应的用户、服务或计算机帐户。
如果已确定可以检索 SPN,则可以使用以下命令验证它们是否已注册到正确的帐户:
setspn -F -Q */webserver.contoso.com
身份验证 DC 发现问题
配置有集成Windows 身份验证的应用程序服务器需要域控制器(DC)对用户/计算机和服务进行身份验证。
在身份验证过程中无法联系域控制器会导致错误 1355:
指定的域不存在或无法联系
无法访问配置了集成Windows 身份验证的资源,出现错误 1355
注意
错误消息可能与应用程序角度不同,但错误的含义是客户端或服务器无法发现域控制器。
下面是此类错误消息的示例:
-
尝试加入域“Contoso”时发生以下错误:
指定的域不存在,或无法访问。 -
找不到域 contoso.com 的域控制器
-
无法联系域控制器 1355
问题的首要原因
客户端上的 DNS 配置错误
可以运行
ipconfig /all
命令并查看 DNS 服务器列表。受信任域或林中域控制器上的 DNS 配置错误
客户端和域控制器之间阻止的网络端口
DC 发现端口:UDP 389 (UDP LDAP) 和 UDP 53 (DNS)
疑难解答步骤
nslookup
运行以下命令以标识任何 DNS 配置错误。- 在客户端和域控制器之间打开所需的端口。 有关详细信息,请参阅如何为 Active Directory 域和信任关系配置防火墙。
日志分析测试方案
环境和配置
客户端计算机
Client1.contoso.com
(Windows 11 计算机)加入域Contoso.com
。用户
John
用户属于
Contoso.com
客户端计算机并登录。客户端计算机上的 Internet 选项
所有网站都是本地 Intranet 区域的一部分。
服务器
IISServer.contoso.com
(Windows Server 2019) 加入域Contoso.com
。身份验证配置
Windows 身份验证已启用。
身份验证提供程序:协商
启用的提供程序按如下所示进行设置:
身份验证流
- 用户
John
登录Client1.contoso.com
,打开Microsoft Edge 浏览器并连接到IISServer.contoso.com
。 - 客户端计算机将执行以下步骤(上图中的步骤 1):
- DNS 解析程序缓存
IISServer.contoso.com
以验证此信息是否已缓存。 - DNS 解析程序检查 HOSTS 文件中是否存在 C:\Windows\System32\drivers\etc\Hosts 中的任何映射
IISServer.contoso.com
。 - 将 DNS 查询发送到首选 DNS 服务器(在 IP 配置设置上配置),该服务器也是环境中的域控制器。
- DNS 解析程序缓存
- 域控制器上运行的 DNS 服务将调查其配置的区域,解析主机 A 记录,并使用 IP 地址
IISServer.contoso.com
(上图中的步骤 2)进行响应。 - 客户端计算机将在 TCP 端口 80 上
IISServer.contoso.com
执行 TCP 三向握手。 - 客户端计算机将向该客户端发送匿名 HTTP 请求
IISServer.contoso.com
。 - 侦听端口 80 的 IIS 服务器将收到请求
Client1.contoso.com
,查看 IIS 服务器身份验证配置,并将 HTTP 401 质询响应作为身份验证配置(上图中的步骤 3)发送回客户端计算机的 HTTP 401 质询响应。 - 运行
Client1.contoso.com
Microsoft Edge 进程将知道 IIS 服务器配置有 Negotiate,并将验证网站是否是本地 Intranet 区域的一部分。 如果网站位于本地 Intranet 区域中,则 Microsoft Edge 进程将调用 LSASS.exe 以获取具有 SPNHTTP\IISServer.contoso.com
的 Kerberos 票证(上图中的步骤 5)。 - 域控制器(KDC 服务)将收到请求
Client1.contoso.com
,搜索其数据库以获取 SPNHTTP\IISServer.contoso.com
并查找IISServer.contoso.com
配置了此 SPN。 - 域控制器将使用具有 IIS 服务器的票证的 TGS 响应(上图中的步骤 6)进行响应。
- 客户端计算机上的 Microsoft Edge 进程将使用域控制器颁发的 Kerberos TGS 票证将 Kerberos 应用程序协议 (AP) 请求发送到 IIS Web 服务器。
- IIS 进程将调用 Web 服务器上的LSASS.exe 来解密票证,并使用 SessionID 和用户组成员身份创建令牌进行授权。
- IIS 进程将从LSASS.exe获取令牌的句柄,以做出授权决策并允许用户与 AP 响应连接。
工作流的网络监视器分析
注意
需要是本地管理员组的用户才能执行以下活动。
在客户端计算机上安装Microsoft网络监视器(
Client1.contoso.com
)。在提升的命令提示符窗口中运行以下命令(cmd.exe):
ipconfig /flushdns
启动网络监视器。
打开 Microsoft Edge 浏览器并键入
http://iisserver.contoso.com
。网络跟踪分析:
对主机 A 记录的域控制器的 DNS 查询:
IISServer.contoso.com
。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
连接到 IIS Web 服务器
IISServer.contoso.com
(匿名连接)时Client1.contoso.com
Microsoft Edge 进程。3027 00:59:30.1609409 Client1.contoso.com iisserver.contoso.com HTTP HTTP:Request, GET / Host: iisserver.contoso.com
IIS 服务器使用 HTTP 响应 401 进行响应:协商和 NTLM(在 IIS 服务器上执行的配置)。
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
Kerberos 请求通过
Client1.contoso.com
SPN 转到域控制器DCA.contoso.com
:HTTP/iisserver.contoso.com
。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
使用 Kerberos 请求进行响应,该请求具有具有 Kerberos 票证的 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
现在会使用 Kerberos AP 请求转到 IIS 服务器。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 服务器使用身份验证完成的响应来响应。
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
以查看命令Client1.contoso.com
输出中的 Kerberos 票证。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
查看 IIS 服务器上的事件 ID 4624,其中显示了
Success
审核:
默认情况下,
Success
在 Windows 的所有服务器操作系统上启用或Failure
审核。 可以验证是否通过以下命令启用审核。如果未启用审核,请启用审核。 查看以下列表中的登录类别。 可以看到,登录子类别已启用
Success and Failure
。C:\>auditpol /get /Subcategory:"logon" System audit policy Category/Subcategory Setting Logon/Logoff Logon Success and Failure
如果未看到登录,
Success and Failure
请运行以下命令以启用它:C:\>auditpol /set /subcategory:"Logon" /Success:enable /Failure:enable The command was successfully executed.
查看 IISServer.contoso.com 上的成功安全事件 ID 4624
观察以下字段:
Logon type
:3(网络登录)Security ID
在New Logon
字段中:Contoso\John
Source Network Address
:客户端计算机的 IP 地址Logon Process
和Authentication Package
: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
排查身份验证工作流问题
使用以下方法之一来排查该问题。
验证是否可以解析 IIS Web 服务器 (
IISServer.contoso.com
) 的名称Client1.contoso.com
。使用以下 cmdlet 验证 DNS 服务器是否响应正确的 IIS 服务器 IP 地址:
PS C:\> Resolve-DnsName -Name IISServer.contoso.com Name Type TTL Section IPAddress ---- ---- --- ------- --------- IISServer.contoso.com A 1200 Answer 192.168.2.104
使用以下 cmdlet 验证客户端计算机和 IIS Web 服务器(
IISServer.contoso.com
)之间是否打开了网络端口:PS C:\> Test-NetConnection -Port 80 IISServer.contoso.com ComputerName : IISServer.contoso.com RemoteAddress : 192.168.2.104 RemotePort : 80 InterfaceAlias : Ethernet 2 SourceAddress : 192.168.2.101 TcpTestSucceeded : True
验证是否从域控制器获取 Kerberos 票证。
在尝试访问网站的用户的上下文中打开普通命令提示符(而不是管理员命令提示符)。
运行
klist purge
命令。如下所示运行
klist get http/iisserver.contoso.com
命令:PS C:\> 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
你会发现在列中获取 SPN
http/IISServer.contoso.com
Cached Ticket (2)
的 Kerberos 票证。
使用默认凭据验证 IIS Web 服务是否在 IIS 服务器上运行。
在尝试访问网站的用户的上下文中打开正常的 PowerShell 提示符(而不是管理员 PowerShell 提示符)。
PS C:\> invoke-webrequest -Uri http://IIsserver.contoso.com -UseDefaultCredentials PS C:\> 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...
查看 IIS 服务器上的安全事件日志:
- 成功事件日志 4624
- 错误事件日志 4625
隔离过程:可以使用下面的故障排除步骤来验证 IIS 服务器上的其他服务是否可以处理 Kerberos 身份验证。
先决条件:
IIS 服务器应运行 Windows 的服务器版本。
IIS 服务器应为 SMB(端口 445)等服务打开端口。
创建新共享,或向用户提供
John
对计算机上已共享的其中一个文件夹(例如 Software$)的读取权限。登录到
Client1.contoso.com
。打开 Windows 资源管理器。
键入 \IISServer.contoso.com \Software$。
打开
IISServer.contoso.com
安全事件并验证是否观察到事件 ID 4624。以用户
John
身份打开普通命令提示符Client1.contoso.com
。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
在 . 上
Client1.contoso.com
收集网络跟踪。 查看网络跟踪,观察哪个步骤失败,以便进一步缩小步骤范围并解决问题。