代理
假设用户已经向一个服务器S进行了身份认证并且试图询问服务器本地上的数据,例如一个文件。在这种情况下,由Windows2000来实现基于文件ACL的访问控制。但是如果要访问的数据不在本地上呢?
例如,用户向远程的服务器发出请求,这时,服务器S就必须向另一个服务器T发出请求,虽然服务器T的直接用户是服务器S,但实际访问的是用户,而不是服务器S。为了正确地工作,用户必须向服务器S说明他的身份,从而允许服务器S代表他向远程的服务器发出请求。
请求访问T的Ticket
返回Ticket 和会话密钥
出示Ticket
Kerberos是可以通过代理来实现的,如图5所示。如果一个客户应用程序请求服务,一个用户的TGT和它相关联密钥被发送到令一个服务器上,象所有的TICKET,TGT也是被加密过的,但是为了确保在传送过程中TGT相关联的密钥被攻击者窃取,这个密钥用客户和服务器S共享的会话密钥进行加密。
从客户到服务器S的TGT必须在它的标志位域里设置FORWARDABLE标记。当这个标记设置后,服务器S可以向KDC出示这个TGT,并请求获得访问其它服务器的TICKET,而KDC允许TGT上的IP地址和服务器S的IP地址的不一致。
当用户将设有FORWARDABLE标记的TGT和相关联的会话密钥发送给服务器S后,服务器S需要代表用户访问服务器T,它通过向KDC出示TGT和一个有效的证书来请求一张访问服务器T的TICKET,这个新的TICKET包括用户的身份,并用服务器T的密码加密。当服务器S向服务器T出示TICKET时,服务器T会认为它是直接从客户处得到的请求。
Kerberos同时也允许在不同的域的客户和服务器之间的认证,总之,不论用户要向访问哪一个服务器,都必须事先获得一个到该服务器的TICKET。
但是,仅仅与目的服务器在同一个域的KDC才可以发出这个TICKET,因此,如果用户要访问不在同一个域的服务器,他就必须从另一个域的KDC获得该服务器的TICKET。同样步骤,通过TGT从KDC获取一张TICKET,接下来的步骤就与上述相同。为了实现这个目的,这两个域必须有一个信任关系。一旦两个Windows2000域建立起了信任关系,这两个域之间就可以通过一个仅由这两个域知道的密码互相进行访问,这个共享的密码是用来加密在这两个域之间传送的数据。
请求TGT
返回TGT
请求访问服务器Q的Ticket
返回Ticket
出示Ticket
A域
B 域
图6 跨域认证
图6显示了这个过程是如何工作的,例如一个在域A的用户要访问在域B的服务器Q,域A的用户Kerberos SSP向域A出示用户的TGT,请求一张到域B的TGT,这时域A的KDC就会向用户发回一张用户可以用来向域B的KDC发出请求的TGT,这个TICKET不是用KDC的密码进行加密,而是用A和B之间共享的密码进行加密。
一旦用户获得了这个TGT,客户的Kerberos SSP就会向B的KDC出示这张TGT,请求访问服务器Q的TICKET。在域B的KDC解密用户出示的TGT。当这个TGT有效时,这个KDC就在自己的活动目录数据库中查找服务器Q的密码,并用它来创建一张到Q的TICKET,然后再将该TICKET发送给用户。
在Windows2000中,Kerberos 支持传递的信任关系,也就是说,如果一个Windows2000的域信任第二个域,而第二个域又信任第三个域,根据传递性,第一个域会自动信任第三个域。在Windows2000中,任一个域树或森林中,域之间的信任关系总是双向的,这种传递性使得每一个域仅仅需要知道在域层次中它上面和下面的域的密码。
结束语
本文说明了Windows 2000的分布式安全协议—Kerberos,并简要阐明在Windows 2000中实现的安全服务,如身份认证,数据的完整性和保密性,以及代理等。
RSS订阅






收 藏
推 荐