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) 和环境未正确设置
  • 防火墙或路由器阻止的端口
  • 服务帐户未提供适当的权限(用户权限分配)
  • 前端或后端服务不在同一域中和约束委派设置中

有关详细信息,请参阅:

单一登录(SSO)中断并提示进行身份验证一次

请考虑下列情形:

  • 客户端和服务器应用程序,如 Microsoft Edge 和 Internet Information Services (IIS) 服务器。 IIS 服务器配置有 Windows 身份验证(协商)。
  • 客户端和服务器应用程序,例如 SMB 客户端和 SMB 服务器。 默认情况下,SMB 服务器配置有协商安全支持提供程序接口 (SSPI)。

用户打开Microsoft Edge 并浏览内部网站 http://webserver.contoso.com。 网站配置有 Negotiate,此网站会提示进行身份验证。 用户手动输入用户名和密码后,用户将获得身份验证,网站按预期工作。

注意

此方案是客户端和服务器的一个示例。 对于配置集成Windows 身份验证的任何客户端和服务器,故障排除技术都是相同的。

集成Windows 身份验证在用户级别或计算机级别中断。

疑难解答方法

  • 查看可在应用程序或计算机级别启用的集成身份验证设置的客户端配置。 例如,所有基于 HTTP 的应用程序都会在尝试执行集成身份验证时查找站点位于受信任的区域中。

    打开 inetcpl.cplInternet 选项),所有基于 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)

疑难解答步骤

  1. nslookup运行以下命令以标识任何 DNS 配置错误。
  2. 在客户端和域控制器之间打开所需的端口。 有关详细信息,请参阅如何为 Active Directory 域和信任关系配置防火墙

日志分析测试方案

环境和配置

  • 客户端计算机

    Client1.contoso.com (Windows 11 计算机)加入域 Contoso.com

  • 用户 John

    用户属于 Contoso.com 客户端计算机并登录。

  • 客户端计算机上的 Internet 选项

    所有网站都是本地 Intranet 区域的一部分。

    Internet 属性的屏幕截图,其中显示了所有网站都是本地 Intranet 区域的一部分。

  • Server

    IISServer.contoso.com (Windows Server 2019) 加入域 Contoso.com

  • 身份验证配置

    Windows 身份验证已启用

    显示 Windows 身份验证已启用的 Internet 信息服务管理器窗口的屏幕截图。

  • 身份验证提供程序:协商

    启用的提供程序按如下所示进行设置:

    “提供程序”窗口的屏幕截图,其中显示了“已启用的提供程序”包括协商。

身份验证流

身份验证流的屏幕截图。

  1. 用户 John 登录 Client1.contoso.com,打开Microsoft Edge 浏览器并连接到 IISServer.contoso.com
  2. 客户端计算机将执行以下步骤(上图中的步骤 1):
    1. DNS 解析程序缓存 IISServer.contoso.com 以验证此信息是否已缓存。
    2. DNS 解析程序检查 HOSTS 文件中是否存在 C:\Windows\System32\drivers\etc\Hosts 中的任何映射IISServer.contoso.com
    3. 将 DNS 查询发送到首选 DNS 服务器(在 IP 配置设置上配置),该服务器也是环境中的域控制器。
  3. 域控制器上运行的 DNS 服务将调查其配置的区域,解析主机 A 记录,并使用 IP 地址 IISServer.contoso.com (上图中的步骤 2)进行响应。
  4. 客户端计算机将在 TCP 端口 80 上 IISServer.contoso.com执行 TCP 三向握手。
  5. 客户端计算机将向该客户端发送匿名 HTTP 请求 IISServer.contoso.com
  6. 侦听端口 80 的 IIS 服务器将收到请求 Client1.contoso.com,查看 IIS 服务器身份验证配置,并将 HTTP 401 质询响应作为身份验证配置(上图中的步骤 3)发送回客户端计算机的 HTTP 401 质询响应。
  7. 运行 Client1.contoso.com Microsoft Edge 进程将知道 IIS 服务器配置有 Negotiate,并将验证网站是否是本地 Intranet 区域的一部分。 如果网站位于本地 Intranet 区域中,则 Microsoft Edge 进程将调用 LSASS.exe 以获取具有 SPN HTTP\IISServer.contoso.com 的 Kerberos 票证(上图中的步骤 5)。
  8. 域控制器(KDC 服务)将收到请求 Client1.contoso.com,搜索其数据库以获取 SPN HTTP\IISServer.contoso.com 并查找 IISServer.contoso.com 配置了此 SPN。
  9. 域控制器将使用具有 IIS 服务器的票证的 TGS 响应(上图中的步骤 6)进行响应。
  10. 客户端计算机上的 Microsoft Edge 进程将使用域控制器颁发的 Kerberos TGS 票证将 Kerberos 应用程序协议 (AP) 请求发送到 IIS Web 服务器。
  11. IIS 进程将调用 Web 服务器上的LSASS.exe 来解密票证,并使用 SessionID 和用户组成员身份创建令牌进行授权。
  12. IIS 进程将从LSASS.exe获取令牌的句柄,以做出授权决策并允许用户与 AP 响应连接。

工作流的网络监视器分析

注意

需要是本地管理员组的用户才能执行以下活动。

  1. 在客户端计算机上安装Microsoft网络监视器Client1.contoso.com)。

  2. 在提升的命令提示符窗口中运行以下命令(cmd.exe):

    ipconfig /flushdns
    
  3. 启动网络监视器。

  4. 打开 Microsoft Edge 浏览器并键入 http://iisserver.contoso.com

  5. 网络跟踪分析:

    1. 对主机 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
      
    2. 来自域控制器上的 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
      
    3. 连接到 IIS Web 服务器IISServer.contoso.com(匿名连接)时Client1.contoso.comMicrosoft Edge 进程。

      3027    00:59:30.1609409    Client1.contoso.com    iisserver.contoso.com    HTTP    HTTP:Request, GET /
      Host:  iisserver.contoso.com
      
    4. 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
      
    5. Kerberos 请求通过 Client1.contoso.com SPN 转到域控制器 DCA.contoso.comHTTP/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
      
    6. 域控制器 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
      
    7. 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
      
    8. 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)
      
  6. 运行命令 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
    
  7. 查看 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 IDNew Logon 字段中: Contoso\John
  • Source Network Address:客户端计算机的 IP 地址
  • Logon ProcessAuthentication PackageKerberos
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 票证。

    1. 在尝试访问网站的用户的上下文中打开普通命令提示符(而不是管理员命令提示符)。

    2. 运行 klist purge 命令。

    3. 如下所示运行 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$)的读取权限。

      1. 登录到 Client1.contoso.com

      2. 打开 Windows 资源管理器。

      3. 键入 \IISServer.contoso.com \Software$

      4. 打开 IISServer.contoso.com 安全事件并验证是否观察到事件 ID 4624。

      5. 以用户John身份打开普通命令提示符Client1.contoso.comklist 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
        
      6. 在 . 上 Client1.contoso.com收集网络跟踪。 查看网络跟踪,观察哪个步骤失败,以便进一步缩小步骤范围并解决问题。