使用日志分析测试方案排查 Kerberos 身份验证问题

本文使用假设的客户端和服务器部署来演示 Kerberos 身份验证问题的故障排除方法。

环境和配置

  • 用户“John”属于域 contoso.com

  • 所有域的域名系统(DNS)服务器都是域控制器。

  • John 登录到配置如下的客户端计算机:

    • 名称和域: Client1.contoso.com

    • 作系统:Windows 11

    • 浏览器:Microsoft Edge

    • 监视应用程序:网络监视器(从 Microsoft网络监视器安装)

    • Internet 选项配置:所有 contoso.com 站点都属于本地 Intranet 区域

      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 身份验证已启用

        Internet Information Services Manager 窗口的屏幕截图,其中显示了已启用 Windows 身份验证。

      • 已启用的身份验证提供程序列表包括 Negotiate,如以下屏幕截图所示:

        “提供程序”窗口的屏幕截图,其中显示启用的提供程序中包括“协商 (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 在客户端计算机上发生,并包括以下步骤:

  1. DNS 解析程序服务缓存 IISServer.contoso.com 以检查此信息是否已缓存。
  2. DNS 解析程序服务检查 HOSTS 文件(C:\Windows\System32\drivers\etc\Hosts)是否有任何映射 IISServer.contoso.com
  3. DNS 客户端服务将 DNS 查询发送到首选 DNS 服务器(在 IP 配置设置上配置)。

步骤 2 发生在 DNS 服务器(域控制器)上,并包括以下步骤:

  1. DNS 服务器服务会检查其配置的区域,找到主机“A”记录,并解析 IISServer.contoso.com 为 IP 地址 192.168.2.104
  2. DNS 服务器将 IP 地址返回到客户端计算机。

步骤 3 在客户端计算机上发生,并包括以下步骤:

  1. 客户端计算机使用 TCP 端口 80 执行 TCP 三向握手IISServer.contoso.com
  2. 客户端计算机将匿名 HTTP 请求发送到 IISServer.contoso.com

步骤 4 在目标服务器上发生,并包括以下步骤:

  1. Web 服务(运行为 IISServer.contoso.com)接收来自 Client1.contoso.com 的请求。
  2. Web 服务将响应消息发送到 Client1.contoso.com 包含“HTTP 401”质询响应。 该消息将 Negotiate 指定为首选身份验证提供程序,将 NTLM 指定为辅助身份验证提供程序。

步骤 5 在客户端计算机上发生,并包括以下步骤:

  1. 客户端计算机从 IISServer.contoso.com中接收质询响应消息。
  2. Microsoft Edge 进程验证是否 IISServer.contoso.com 属于本地 Intranet 区域。 因此,身份验证过程应使用 Kerberos 而不是 NTLM。
  3. Microsoft Edge 进程调用 LSASS.exe 以查找服务票证 IISServer.contoso.com
  4. 在这种情况下,客户端计算机没有适当的服务票证。 Microsoft Edge 进程向 Kerberos 分发中心 (KDC) 发送票证请求。

步骤 6 发生在域控制器上,并包括以下步骤:

  1. 域控制器(KDC 服务)接收请求 Client1.contoso.com ,并搜索使用 SPN HTTP\IISServer.contoso.com (或 HOST\IISServer.contoso.com) 的服务。
  2. 域控制器将请求的服务标识为在上下文 IISServer.contoso.com中运行的 Web 服务。
  3. 域控制器将响应发送到客户端计算机,其中包括 Web 服务的服务票证 IISServer.contoso.com

步骤 7 在域控制器上发生,并包括以下步骤:

  1. Microsoft Edge 进程将创建包含服务票证的 Kerberos 应用程序协议(AP)消息。
  2. Microsoft Edge 进程将 AP 消息发送到 IISServer.contoso.com,以响应“HTTP 401”质询响应消息。

步骤 8 在 Web 服务器上发生,并包括以下步骤:

  1. IIS 进程查询本地 LSASS.exe 进程。
  2. LSASS.exe 进程解密票证,然后为包含 SessionID 和 John 组成员身份的用户创建令牌。
  3. LSASS.exe 进程将令牌句柄返回给 IIS 进程。
  4. IIS 进程检查令牌中的组信息,以确保 John 有权访问请求的页面。
  5. IIS 进程将请求的页面发送到浏览器。

使用网络监视器记录身份验证测试

使用以下步骤在类似于“ 环境和配置 ”部分中介绍的环境上收集跟踪数据。 在此测试期间,系统组件应按照 预期身份验证流 部分中所述的方式进行交互。

注释

若要使用本节中的过程,必须属于本地管理员组:

  1. 在客户端计算机上,打开管理命令提示符窗口,然后运行 ipconfig /flushdns
  2. 打开网络监视器并开始录制。
  3. 打开 Microsoft Edge。 在地址栏中输入 http://iisserver.contoso.com
  4. 当 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.comIISServer.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.comClient1.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.comIISServer.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 (网络登录)
  • “新建登录”字段中的安全 IDContoso\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
    

验证客户端计算机上的票证信息

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

  2. 按给定顺序运行以下命令:

    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 身份验证,请执行以下步骤:

  1. 在目标服务器上,创建文件共享或标识用于测试的现有文件共享。 确保(在“John”角色中)对文件夹具有“读取”权限。

  2. 在客户端计算机上,以用户“John”身份登录,然后打开 Windows 资源管理器。

  3. 在地址栏中,输入 \\IISServer.contoso.com \Software$

  4. 在目标服务器上,打开事件查看器,然后查看安全事件。 验证是否有新的事件 ID 4624 事件,或事件 ID 4625 事件。

  5. 在客户端计算机上,在命令提示符处运行 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