定位Kerberos配置过程中的问题,可尝试如下步骤,也可学习逗点云的《Kerberos调试系列》课程:

1.使用Kerberos Tray或Kerberos List确认有尝试连接的服务的TGS票证。如果有访问的服务的TGS票证并且仍然收到错误消息,考虑以下两种可能性:
•可能遇到SPN问题。有关SPN问题的详细信息,可查阅错误: KDC_ERR_PRINCIPAL_NOT_UNIQUE。
•可能遇到授权问题而不是身份验证问题。如果是这种情况,就可能不是Kerberos身份验证的问题。
2.如果没有TGS票证,使用Kerberos Tray或Kerberos List确认是否拥有TGT。
•如果确认有TGT票据但是依然没有TGS票证,检查系统事件日志。系统日志中记录的错误将帮助确定无法获取TGS票证的原因。
3.如果正在使用Windows操作系统并且显示成功登录, 可以检查客户端上的安全事件日志,以查看系统是否使用NTLM而不是Kerberos身份验证。使用NTLM的原因可能是

•该应用程序使用NTLM。
•Kerberos身份验证失败,Negotiate使用NTLM

4. 如果Kerberos身份验证失败,则系统事件日志或网络跟踪中捕获的数据包包含KDC或Kerberos SSP返回的Kerberos错误代码,可以调试以获取更多信息。

以下部分详细介绍了Kerberos身份验证环境中用户遇到的最常见问题,解释了这些问题的可能原因,并建议了如何解决这些问题。

时间同步(时钟偏差)

Kerberos身份验证在设计之初就考虑了旨在防止”Replay”(重放)的攻击。在重放攻击中,恶意用户捕获网络流量并尝试重新发送捕获消息,以欺骗Kerberos身份验证服务器接受攻击者提供的凭据为合法用户。Kerberos身份验证通过两种机制阻止重放攻击:

  • Kerberos客户端在Authenticator(验证器)内加密时间戳,然后将Authenticator发送到KDC,如果KDC服务器验证它从Authenticator(验证者)解密的时间是和KDC服务器上的本地时间差别在指定量内(默认值是5分钟),则KDC可认为所呈现的凭证是真实的

KDC所产生的所有票据都有过期时间,因此,如果票据被截获泄露,则不能在过期时间范围之外使用该票据,可以通过调节票据的过期时间以使重放攻击的风险降到最小

由于上述机制,Kerberos身份验证依赖于KDC服务器,客户端和KDC 服务上设置的日期和时间。如果KDC与请求票证的客户端之间的时间差别太大,则KDC无法确定该请求是合法的还是可能的重放攻击的。因此,必须同步网络上所有计算机上的时间才能使Kerberos身份验证正常运行

问题

Authenticator(验证器)或KRB_AS_REQ中的客户端时间戳与KDC服务器之间的时间差异大于Kerberos配置文件中指定的Maximum tolerance for computer clock synchronization(时钟同步的最大容差设置)

问题确认

通过查看事件查看器(Event Viewer)中的日志,可以诊断有时钟偏差引起的Kerberos错误。错误代码为:0x25:KRB_AP_ERR_SKEW

解决办法

同步KDC服务器,客户端和KDC 服务上设置的日期和时间。有关使用外部时间源同步域中所有计算机的信息,可以参阅Microsoft知识库中的“如何在Windows 2000中配置授权时间服务器”,http://go.microsoft.com/fwlink/?LinkId=23042

UDP错误故障

默认情况下,Kerberos身份验证使用用户数据报协议User Datagram Protocol(UDP)来传输数据

问题

UDP是一种无状态的传输协议,如网络质量不好,在传输过程中容易丢包,造成数据缺失。UDP不能保证发送的数据包完整地到达其目的地,因此,在网络拥塞的环境中,数据传输丢失比较常见。

问题确认

可以通过查看网络监视器捕获的数据来诊断UDP碎片

解决办法

降低UDP造成数据传输丢失的唯一方法是减少网络流量, 这是不切实际的解决方案 。

将Kerberos身份验证服务配置为使用TCP传输票据可以解决票据数据丢失的故障 。TCP提供数据传输保证,发送的数据包将完整地到达其目的地,可以在任何网络环境中使用。为了强制Kerberos身份验证使用TCP,请参阅Microsoft知识库中的“如何强制Kerberos使用TCP而不是UDP”,http://go.microsoft.com/fwlink/?LinkId=23043

SPN (Service Principal Name)

服务主体名称(SPN)是服务器上运行的某个服务的唯一标识符。如果服务要使用Kerberos身份验证,就需要为其设置SPN,以便客户端可以识别该服务。

在Windows 操作系统下,通常,在Active Directory中创建账户时设置SPN,该SPN将和运行该服务的用户账户关联起来。

 问题

如果没有为Kerberos服务设置SPN,那么客户端将无法定位该服务,由此,未设置SPN遇到的常见故障是KDC_ERR_C_PRINCIPAL_UNKNOWN或KDC_ERR_S_PRINCIPAL_UNKNOWN错误,这两个错误通常表示SPN未正确设置。如果没有正确设置SPN,就无法进行Kerberos身份验证

解决办法

多个服务可以同时在同一用户帐户下运行,设置SPN需要保证SPN具有唯一性,组成SPN的四个部分可以保证SPN的唯一性:

服务(Service): 通过该服务名来区分在同一帐户下运行的多个服务

运行服务的用户帐户

运行服务的计算机

运行该服务的计算机端口

上述四部分可以唯一地标识在网络上运行的任何服务,并且可用于对任何服务进行相互认证

SPN 由ServiceName/Host:Port组成,其中:

ServiceName是SPN的服务名称

Host是SPN所属计算机的名称

端口是SPN注册要运行的服务的端口

NTLM身份验证

在使用Windows操作系统时,有时会发现安全日志中记录了使用NTLM身份验证而非使用Kerberos身份验证机制,可能的原因如下:

问题

  • Windows NT 4.0操作系统不支持Kerberos身份验证。如果服务运行在Windows NT服务器上,则身份验证时则使用NTLM,并且身份验证将由域控制器来执行
  • 系统使用Kerberos协议尝试进行身份验证但是失败,然后系统尝试使用NTLM进行身份验证。 Windows Server 2003,Windows XP和Windows 2000使用SPNEGO(协商算法)来协商使用的身份验证协议。 虽然Kerberos协议是默认协议,但如果Kerberos认证失败,Negotiate将尝试NTLM认证

解决办法

可以通过检查事件日志中的错误或网络监视器捕获的数据包来进行调查采用NTLM 身份验证的原因