Udostępnij za pośrednictwem


PAC在Kerberos认证协议中的作用(二)——案例分享

上一周我们的AD博客讲到了Kerberos的基本认证流程以及PAC作为微软的Kerberos版本重要特性之一, 在其中所起的作用, 那么这一周我们将延续这一主题, 讲讲在一个更具有现实性的系统环境下PAC在微软的Kerberos中到底起了什么样的作用。 

这一周我们将基于一个真实案例来展开讨论,分析PAC在其中所起到的作用。

考虑以下的这种情况:

开发人员用java编写一个应用程序, 通过Kerberos提供的接口kinit()从KDC去获取TGT,从而能够访问Web Server的服务。Web Server通过Kerberos Delegation代理用户访问File Server,从而最终使用户获取到所需文件。

这里为了能让大家更好地理解这个案例,首先为大家介绍下什么是Kerberos Delegation:

在很多情况下, 我们部署在服务器上的应用程序是一种multi-tier的模式, 也就是说这些应用程序被分割成不同的模块, 这些模块之间有明确的层次关系,例如如下图所示, 在一个典型的web service程序中, 服务器端的程序被分为3个tier, 第一个tier是Web Server, 之后是Application Server, 最后一层是Database Server。 出于安全性的考虑, 我们不能够将Application和Database服务器的位置暴露给用户, 那么用户就需要将自己的身份信息提交给这后两层的服务器令其代理自己访问后端的服务。

 

这个代理的过程就是Kerberos Delegation。

介绍完Kerberos Delegation,我们回到之前的案例,开发人员在执行程序的过程中始终无法完成认证过程,Web Server返回HTTP 401错误代码(没有足够的权限)。然而奇怪的现象是,对于域中的一般用户,访问这一Web Server,却毫无问题。

经过初步检查,我们确认了整个网络的服务器及域控制器上的KDC均工作正常,那为什么还是无法访问呢?

我们进行进一步的研究,比对正常用户访问和通过程序访问过程中抓取的网络包,发现一个奇怪的现象——KDC返回给普通用户和应用程序的TGT的网络报文大小有明显的差异。

用户发出的KRB_TGT_REQ中包含了pre-authentication数据(参见上一周我们所讲的PAC的配置和管理), 返回的TGT大小相对较大,大约为800 byte;应用程序发出的KRB_TGT_REQ中不包含pre-authentication数据, 返回的TGT就只有200 byte, 而在这种情况下, 认证就会失败。

通过之前对PAC的介绍,大家肯定可以推测出在那些比较小的TGT中所缺失的就是所谓的PAC数据,通过这些TGT申请的Service Ticket自然也不会包含PAC信息。所以,当应用程序发送给Web Server的Service Ticket不包含PAC时,Web Server无法生成对应的访问令牌(Token)。不仅Kerberos Delegation会失败,我们会发现即使是此程序进行正常的HTTP访问也会失败。

我们的IIS server是一台Windows Server,它是通过LSA call到AcceptSecurityContext()这个Function来为访问者创建token和访问线程。当LSA发现user提供的Service Ticket中没有PAC信息,访问自然就失败了。

那对于此类问题,在不改动服务器及域环境结构的情况下,我们如何解决呢?

 以下我们提供两种方案来解决:

1. 在AS Request中提供PAData;

2. 在AS Request中设置"include-PAC" flag;

说明:

Microsoft KDC 所颁发的TGT会根据AS Request中不同的设置而不同。如果AS Request中包含Pre-Authentication data,或者“include-PAC” flag 被置位,MS KDC 所颁发的TGT 中将会包含客户端的 PAC 信息(存放在Authorization Data field);如果AS Requests 中,Pre-Authentication data 和"include-PAC" flag 都没有指明,那么MS KDC 所颁发的TGT 中不包含PAC 信息。

其实对于Vista之后的Windows PC和服务器,默认的AS Request中已经不包含Pre-Authentication data了,所以我们一般都是通过”include-PAC”这一个flag,实现KDC返回TGT时自动包含PAC信息。

建议: 对于开发人员来说,在编写使用Kerberos进行认证时的代码时,我们推荐使用以上两种方法来避免因没有PAC而导致的认证失败问题。

我们通过两周的时间来为大家分享了PAC在Kerberos认证中的重要作用以及可能产生的问题。希望对广大AD的用户、开发和管理人员有所帮助。

 

谢谢,

屈贝伟 | 企业平台支持部AD技术工程师 | 微软亚太区全球技术支持中心

 

本博文仅供参考,微软公司对其内容不作任何责任担保或权利赋予。