谈谈基于Kerberos的Windows Network Authentication[下篇]

六、User2User Sub-Protocol:有效地保障Server的安全

通过3个Sub-protocol的介绍,我们可以全面地掌握整个Kerberos的认证过程。实际上,在Windows 2000时代,基于Kerberos的Windows Authentication就是按照这样的工作流程来进行的。但是我在上面一节结束的时候也说了,基于3个Sub-protocol的Kerberos作为一种Network Authentication是具有它自己的局限和安全隐患的。我在整篇文章一直在强调这样的一个原则:以某个Entity的Long-term Key加密的数据不应该在网络中传递。原因很简单,所有的加密算法都不能保证100%的安全,对加密的数据进行解密只是一个时间的过程,最大限度地提供安全保障的做法就是:使用一个Short-term key(Session Key)代替Long-term Key对数据进行加密,使得恶意用户对其解密获得加密的Key时,该Key早已失效。但是对于3个Sub-Protocol的C/S Exchange,Client携带的Ticket却是被Server Master Key进行加密的,这显现不符合我们提出的原则,降低Server的安全系数。

所以我们必须寻求一种解决方案来解决上面的问题。这个解决方案很明显:就是采用一个Short-term的Session Key,而不是Server Master Key对Ticket进行加密。这就是我们今天要介绍的Kerberos的第4个Sub-protocol:User2User Protocol。我们知道,既然是Session Key,仅必然涉及到两方,而在Kerberos整个认证过程涉及到3方:Client、Server和KDC,所以用于加密Ticket的只可能是Server和KDC之间的Session Key(SKDC-Server)。

我们知道Client通过在AS Exchange阶段获得的TGT从KDC那么获得访问Server的Ticket。原来的Ticket是通过Server的Master Key进行加密的,而这个Master Key可以通过Account Database获得。但是现在KDC需要使用Server和KDC之间的SKDC-Server进行加密,而KDC是不会维护这个Session Key,所以这个Session Key只能靠申请Ticket的Client提供。所以在AS Exchange和TGS Exchange之间,Client还得对Server进行请求已获得Server和KDC之间的Session Key(SKDC-Server)。而对于Server来说,它可以像Client一样通过AS Exchange获得他和KDC之间的Session Key(SKDC-Server)和一个封装了这个Session Key并被KDC的Master Key进行加密的TGT,一旦获得这个TGT,Server会缓存它,以待Client对它的请求。我们现在来详细地讨论这一过程。


上图基本上翻译了基于User2User的认证过程,这个过程由4个步骤组成。我们发现较之我在上面一节介绍的基于传统3个Sub-protocol的认证过程,这次对了第2部。我们从头到尾简单地过一遍:

  1. AS Exchange:Client通过此过程获得了属于自己的TGT,有了此TGT,Client可凭此向KDC申请用于访问某个Server的Ticket。
  2. 这一步的主要任务是获得封装了Server和KDC的Session Key(SKDC-Server)的属于Server的TGT。如果该TGT存在于Server的缓存中,则Server会直接将其返回给Client。否则通过AS Exchange从KDC获取。
  3. TGS Exchange:Client通过向KDC提供自己的TGT,Server的TGT以及Authenticator向KDC申请用于访问Server的Ticket。KDC使用先用自己的Master Key解密Client的TGT获得SKDC-Client,通过SKDC-Client解密Authenticator验证发送者是否是TGT的真正拥有者,验证通过再用自己的Master Key解密Server的TGT获得KDC和Server 的Session Key(SKDC-Server),并用该Session Key加密Ticket返回给Client。
  4. C/S Exchange:Client携带者通过KDC和Server 的Session Key(SKDC-Server)进行加密的Ticket和通过Client和Server的Session Key(SServer-Client)的Authenticator访问Server,Server通过SKDC-Server解密Ticket获得SServer-Client,通过SServer-Client解密Authenticator实现对Client的验证。

这就是整个过程。

七、Kerberos的优点

分析整个Kerberos的认证过程之后,我们来总结一下Kerberos都有哪些优点:

1.较高的Performance

虽然我们一再地说Kerberos是一个涉及到3方的认证过程:Client、Server、KDC。但是一旦Client获得用过访问某个Server的Ticket,该Server就能根据这个Ticket实现对Client的验证,而无须KDC的再次参与。和传统的基于Windows NT 4.0的每个完全依赖Trusted Third Party的NTLM比较,具有较大的性能提升。

2.实现了双向验证(Mutual Authentication)

传统的NTLM认证基于这样一个前提:Client访问的远程的Service是可信的、无需对于进行验证,所以NTLM不曾提供双向验证的功能。这显然有点理想主义,为此Kerberos弥补了这个不足:Client在访问Server的资源之前,可以要求对Server的身份执行认证。

3.对Delegation的支持

Impersonation和Delegation是一个分布式环境中两个重要的功能。Impersonation允许Server在本地使用Logon 的Account执行某些操作,Delegation需用Server将logon的Account带入到另过一个Context执行相应的操作。NTLM仅对Impersonation提供支持,而Kerberos通过一种双向的、可传递的(Mutual 、Transitive)信任模式实现了对Delegation的支持。

4.互操作性(Interoperability)

Kerberos最初由MIT首创,现在已经成为一行被广泛接受的标准。所以对于不同的平台可以进行广泛的互操作。

相关内容:
[原创]谈谈基于Kerberos的Windows Network Authentication - Part I
[原创]谈谈基于Kerberos的Windows Network Authentication - Part II
[原创]谈谈基于Kerberos的Windows Network Authentication - Part III


作者:Artech
出处:http://artech.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
posted @ 2007-07-10 02:12 Artech 阅读(4017) 评论(34) 编辑 收藏

 回复 引用 查看   
#1楼[楼主] 2007-07-10 02:32 Artech      
终于结束了这篇文章,在自己的沙发上躺躺。
 回复 引用   
#2楼 2007-07-10 02:34 不得不说[未注册用户]
@Artech
好文章呀,觉得LZ很用心在写每一篇文章。首页现在已经很少出现这样高质量的文章了。

 回复 引用   
#3楼 2007-07-10 02:39 熬夜的人[未注册用户]
@不得不说
看了LZ的其它文章,确实如你所说,LZ的每篇文章都极具分量。LZ是个有心人。

 回复 引用 查看   
#4楼 2007-07-10 08:29 紫色阴影      
@Artech
我很佩服lz,技术强,文笔好,文章质量高 羡慕啊!!

 回复 引用 查看   
#5楼 2007-07-10 09:02 Anytao      
专注成就专业, 是Dflying Chen给我赠言,这句同样适合你。每篇都很完美。
 回复 引用 查看   
#6楼[楼主] 2007-07-10 10:42 Artech      
@不得不说
谢谢你的“用心”二字,其实园子里还有很多人在用心地写文章。

 回复 引用 查看   
#7楼[楼主] 2007-07-10 10:46 Artech      
@熬夜的人
谢谢你这样和我一样熬夜的人。
写文章其实是一个双赢的事情,为了写好一片文章,对于自己来说是一个对已学知识进行归纳、梳理得过程。同时能同别人一起分享你的所得。

 回复 引用 查看   
#8楼[楼主] 2007-07-10 10:47 Artech      
@Anytao
“完美”愧不敢当,我会记住这句话“专注成就专业”。

 回复 引用 查看   
#9楼 2007-07-10 10:58 stonezhu      
@Artech
由衷地赞美你一下,你的文章确实都质量很好!忙完看你的WCF系列。
希望LZ继续坚持。
谢谢

 回复 引用 查看   
#10楼[楼主] 2007-07-10 11:03 Artech      
@紫色阴影
谢谢,你的DLINQ系列也不错:)

 回复 引用 查看   
#11楼[楼主] 2007-07-10 11:04 Artech      
@stonezhu
谢谢,WCF希望一起交流、学习!

 回复 引用 查看   
#12楼 2007-07-10 14:30 Laser.NET      
喜欢lz的文章,都很精华!牛:)
 回复 引用 查看   
#13楼[楼主] 2007-07-10 14:47 Artech      
@Laser.NET
欢迎常来光顾:)

 回复 引用   
#14楼 2007-07-10 14:48 Bird[未注册用户]
Artech兄你平时每天花多少时间专研技术啊,呵呵。
 回复 引用 查看   
#15楼[楼主] 2007-07-10 14:53 Artech      
@Bird
这个不好说,有时候一段时间都不想看书,有时候整天看。状态好的时候看,不好的时候玩:)。
如果平均下来,每天应该有2到3个小时吧。

 回复 引用 查看   
#16楼 2007-07-10 16:45 紫色阴影      
@Artech
Artech兄有没有什么好书推荐一下?

 回复 引用 查看   
#17楼[楼主] 2007-07-10 17:12 Artech      
@紫色阴影
哪方面?

 回复 引用 查看   
#18楼 2007-07-11 00:17 紫色阴影      
@Artech
技术方面的都可以

 回复 引用 查看   
#19楼 2007-07-11 00:17 紫色阴影      
@Artech
或者你认为经典,看了很有收获的 赫赫

 回复 引用 查看   
#20楼[楼主] 2007-07-11 12:49 Artech      
@紫色阴影
我介绍几本对我比较有帮助的书吧:
在CLR和.NET Framework方面,Jeffery Richter的《Applied .NET Framework Programing》和该书的第二版《CLR via C#》,Don Box的《.NET Essential》(这本书也是一位cnBlogs的朋友推荐的)。
ASP.NET方面,Dino Esposito的《Programming Microsoft ASP.NET 2.0 Core Reference》和姊妹篇《Programming Microsoft ASP.NET 2.0 Applications: Advanced Topics 》,最近又出了一本介绍ASP.NET AJAX的《Introducing Microsoft ASP.NET AJAX (Pro - Developer) 》。
Design Pattern方面,还是觉得开山之作,GoF的《Design Pattern:Elements of Reusable OO Software》最为经典。
分布式、SOA方面,几年前看的一本《Microsoft .NET Distributed Application: Integrating XML Web Service and .NET Remoting》对我帮助很大,不过从技术上看,这本书已经过时了。另一本有Tomas Erl的SOA入门级的书《SOA:Concept,Technology and Design》篇幅不长,主要介绍一些基础的概念和原理,感觉不错。
最近在看一个Professional SQL Server 2005系列的书:《Professional SQL Server 2005 Integration Service》,《Professional SQL Server 2005 Reporting Service》... ...写得也算中规中矩。
我的床头一直放的一本书是一本老书《TCP/IP Illustrated》,很多大学都把这本书作为讲授网络的教科书,这么多年,依然值得一读,毕竟TCP/IP体系变化不大。

 回复 引用 查看   
#21楼 2007-07-11 16:43 紫色阴影      
@Artech
很不错,有时间一定看看

BTW 你看电子书还是纸张书?

 回复 引用 查看   
#22楼[楼主] 2007-07-11 17:00 Artech      
@紫色阴影
基本上是纸张书,电子书看着累。

 回复 引用 查看   
#23楼 2007-07-11 19:45 紫色阴影      
@Artech
我也是,想请教你怎么把问题钻研到这么底层的 :)

 回复 引用 查看   
#24楼[楼主] 2007-07-11 21:28 Artech      
@紫色阴影
有一次,我参加一个面试,对方问我,为什么喜欢钻研CLR和.NET Framework。 我回答说:
1. CLR和.NET Framework是整个.NET的基石,要想走得更远,必须对基础有一个很正确的认识。
2. 我的好奇心促使我把一件事情的整个来龙去脉了解清楚,如果不能就会很郁闷。呵呵,这可能个人性格有关吧。

我觉得对事物的认知应该是立体的,既要从宏观上对整个系统的构架有一个整体的认知,也需要在微观上对程序的执行有一个正确的了解。所以我喜欢研究SOA,也喜欢研究CLR。

 回复 引用 查看   
#25楼 2007-07-11 22:03 紫色阴影      
@Artech
说得很对,不管从哪个角度都要对它了如指掌
用C#以后就没有怎么钻研过底层机制,以前用STL时还能跟着书把源码看个遍
唉 以后得花点时间在.net底层上面
谢谢

 回复 引用 查看   
#26楼 2007-07-11 22:04 紫色阴影      
@Artech
你很强,我以后多向你请教
最开始看你的博客都是潜水 呵呵

 回复 引用 查看   
#27楼[楼主] 2007-07-11 22:36 Artech      
@紫色阴影
你太抬举了,以后多多交流:)

 回复 引用   
#28楼 2007-08-06 13:07 魔王[未注册用户]
请问版主,有没有一些关于Kerberos的程序实现的源代码呀,原理我懂,但是如何调用java中的库函数,建立起这套机制,我就不明白了。我的邮箱是angel_z_yu@163.com,谢谢!
 回复 引用 查看   
#29楼 2007-09-15 19:41 蛙蛙池塘      
专注成就专业,很不错,我太缺这种精神了,从来专不起来。
 回复 引用 查看   
#30楼 2008-07-07 13:15 雪叶丹枫      
在谈到Kerberos的优点时提到:Delegation需用Server将logon的Account带入到另过一个Context执行相应的操作。

能否在此解释一下这句话的意思?

 回复 引用 查看   
#31楼[楼主] 2008-07-08 09:08 Artech      
@雪叶丹枫
说得直白一点,Client 通过Machine A 访问 Machine B。如果是Impersonation的方式,Client可以一Logon user的身份访问Machine A,但是不能以相同的身份访问Machine B。如果是Delegation则可以。

 回复 引用   
#32楼 2009-03-09 22:32 hecssy[未注册用户]
好文,收藏!!
 回复 引用 查看   
#33楼[楼主] 2009-03-10 08:38 Artech      
--引用--------------------------------------------------
hecssy: 好文,收藏!!
--------------------------------------------------------
这篇文章写了很久了,没想到还有人关注,谢谢!

发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 811970 P73R/8HP2Wo=