投递文章投递文章 投稿指南投稿指南 RSS订阅RSS订阅

Windows 2000的分布式安全协议

来源:iT堂整理 发布时间:2008-01-06 收藏 投稿 字体:【

如图3所示,用户登录要求客户系统向运行在域控制器的KDC发出一个请求,这个消息包括几个内容:用户名,预认证数据(包括用KDC密钥加密的时间戳,用户密码的散列值,以及对TGT请求)。TGT是一个普通的TICKET,如图2所示,它用来证实用户的身份。当这个请求到达域控制器时,KDC会在指定的域活动目录的数据库中,根据用户的实体名字来进行查找,KDC从查到的记录中取出用户密码的散列值。对TGT进行解密,进而对用户的身份进行了认证。这里要说明一点,就是在登录的过程中,用户的密码不会在网络上进行传送。
 在预认证数据被正确证实以后,KDC下一步就要建立并发送给客户一个TGT,其中包括用户名,域名,会话密钥(Kc,k,是由KDC随机生成),以及该TICKET的生存周期以及各种标志,其中,在认证数据域中,TGT还包括优先权和Windows 2000的安全号(SID)用来标志用户以及该用户所在的组(可以从活动目录中得到)。通常,TICKET的一部分用该TICKET的目的服务器的密钥进行加密。
 除了发出TGT, KDC也向客户发出会话密钥Kc,k。这个会话密钥用用户密码的散列值进行加密,当客户获得这个密文时,它会用用户密码的散列值进行解密。 
一旦一个用户成功的登录到网络上的其它计算机,他就可以开始使用上面的服务。为了保证安全性,用户必须尽可能少的向服务器提供身份认证。在WINDOWS 2000里,KERBEROS SSP通过向一个KDC出示一个TGT请求一个给定服务的TICKET。为了和TGT区分开来,这些TICKET称为服务TICKET,但是两者的格式是完全一样的。那个TICKET被发送到目的服务器,由该服务器来验证用户的身份。(实际上,在获得一个TGT以后,每个客户通过向本地计算机请求一个服务TICKET来完成登录,使得它能够向本地的服务提供身分认证)。例如当用户要使用远端系统上的一个DCOM服务程序(服务器S)时,这个用户除了运行应用的客户端部分,还会试图创建一个远程的DCOM对象,如果应用程序使用KERBEROS来进行身份认证,这个客户端应用程序就需要代表它的用户申请访问服务器的一个TICKET。每一个TICKET是一个特定用户向一个特定服务的身份认证,并且,一个分布式应用程序的客户端部分代表了这个用户,因此,这个客户端需要一个TICKET向服务器提供用户的认证。

Request Ticket
Return Ticket and Session Key
Present Ticket


当客户端第一次向一个远程的服务器发出请求时,会自动向KDC发出一个TICKET请求,如图4所示。这个请求包括用户的TGT,请求服务TICKET的应用程序的名字,以及保证该TGT是属于这个用户的证书,它包括用户名和当前时间,并用从登录时获得的会话密钥KC,K进行加密。
当KDC收到这个请求时,它对TGT进行解密(只有KDC才知道这个密钥),从TICKET中获得会话密钥。然后用这个会话密钥对证书进行解密。这个证书起到两个作用,第一,因为它是用客户/KDC的密钥进行加密,从而实现了身份上的认证,因为只有正确的输入登录密码才能够获得这个会话密钥。第二,因为这个证书包括一个时间戳,他防止一个攻击者截取一个用户的TGT,然后将伪照的TGT放到网络上。当使用一个TICKET时,就会创建一个新的证书,每个证书包括一个加密过的时间戳,由于这个时间戳是由仅被用户和 KERBEROS知道的密钥加密,防止了第三方进行伪造。为了防止重复的证书,KDC会拒绝接收过期的证书。这就要求,使用KERBEROS的系统在时间上的同步,因此,WINDOWS 2000使用由IETF定义的简单网络时间协议(SNTP)来进行时间同步。为了保证用户不是提供一个窃取到的TICKET,KDC也对发出请求的系统的IP地址和TGT中的IP地址进行验证。当上述信息得到验证以后,KDC就认为这个用户的身分得到了认证,并发回服务TICKET。KDC从TGT中复制一部分数据,包括用户名,域名和认证数据。它设置服务TICKET的标志以及开始和结束的时间。并生成一个随机会话密钥Kc,s。为了防止攻击者获得这个新的密钥,这个密钥用用户和KDC之间的密钥进行加密。
最后,用户完成了向服务器应用程序的身份认证。当客户第一次向服务器S发出请求时,它出示了用Kc,s加密后的证书。例如,在DCOM中,DCOM报文附带TICKET和证书。接收系统对TICKET解密后,从中获得会话密钥Kc,s,并对证书进行解密和验证。当验证通过后,就会获得用户的信息,包括实体的名字,域名和认证数据,并访问服务应用。所有的这些工作都由KERBEROS的SSP来完成。
虽然kerberos自己并不直接处理这个问题,但是,从收到的TICKET中获得的用户信息最终可以用来进行身份认证。具体如何实现可以不同;例如,它可以在授权过的用户表中查找用户的名字,或者可以用认证数据来确定用户,这时,服务器的LSA(本地安全授权)就会利用认证数据来创建一个安全访问令牌。以后服务进程就可以利用这个令牌来确定用户,并且访问用户需要的数据。如何实现一个认证决定并不是Kerberos的范围,但是,Kerberos确实保证了用户的身份认证。这个过程是如何实现的呢?因为用户出示的服务TICKET是用服务器S的密钥进行加密的,而且因为仅仅是KDC(和服务器S)知道这个密钥,所以这个TICKET必须由KDC创建,由于KDC只会向能够正确输入密码对预认证的数据进行加密的用户发出服务TICKET,从而保证这个用户是其声称的用户。
 反过来,客户是如何确定这个服务器就是它所请求的呢?一个攻击者可以伪照服务器S,然后通过欺骗用户来获得重要的数据,为了防止这种情况的发生,Kerberos提供了双向认证,即不仅仅客户要向服务器提供身份认证,而且服务器也要向客户提供身份认证。在具体实现时,服务器上的Kerberos SSP创建了一个包含用客户/服务器的会话密钥Kc’s加密过的时间戳的消息。当这个消息被客户端上的Kerberos SSP所接收时,它将用会话密钥进行解密。如果客户的Kerberos SSP发现这个时间戳是自己刚刚发送的,它就可以断定服务器是知道会话密钥的,而获得会话密钥要求能够解密服务器的TICKET,这需要知道服务器的密码,进而用户的身份就得到了认证。

数据的完整性和保密性

以上所述的是Kerberos提供的一个安全性的服务:身份认证。但是,Kerberos也能提供数据的完整性和保密性。
完整性
为了保证数据在传送的过程中不被篡改,发送方的Kerberos SSP会对它发送的每一个报文计算校验值,并将该值和报文一起发送。这个校验值是数据的函数值,因此当数据发生变动时,它的校验值也会发生改动。不过,如果仅仅提供一个报文和一个校验值仍然无法防止攻击者篡改数据,因为攻击者可以截获这个报文,将其修改后,从新生成校验值,然后再将它们发送出去。为了防止这种现象,数据的发送者不仅利用消息本身来计算校验值,还包括其它信息。在Windows 2000中,Kerberos用的校验值算法称作HMAC(基于散列的消息认证码),这个校验值是用RC4来进行加密的,尽管攻击者可以创建一个校验值,但是由于他不知道密钥,因此,报文的接收者是可以辨别数据的真伪了。
保密性
因为客户和服务器共享一个密钥Kc,s,每一端上Kerberos SSP都用这个密钥进行加密,由于攻击者无法更改网络上加密的数据,因此,数据的保密性蕴含着数据的完整性。

最新评论:
评论内容:请自觉遵守互联网相关政策法规。
用户名: 密码: 匿名 注册
热门文章
随机推荐
About iTtang - 联系方法  - 专题列表 - 友情链接  -  高级搜索   -  帮助中心  -