当前,在微软的Kerberos身份验证的实现,存储在智能卡上的公钥证书只有长期的非对称公钥。
用于票据授权票(TGT)和服务票据(service ticket)session keys的session keys是短期的、只是用于会话或者服务票据有效期间。
Kerberos身份验证的主要组件就是票据(ticket),Kerberos messages被用来请求和传递票据。Kerberos身份验证中有两种票据,TGTs和服务票据。
Kerberos客户端发送向KDC发送票据请求:
|
请求的票据类型 |
KDC 的服务 |
|
TGT |
Authentication service 身份验证服务 |
|
Service ticket |
Ticket-granting service 票据授权服务 |
票据请求包括:
|
• |
请求属性(flags),例如,票据是否可更新的 |
|
• |
加密方式 |
KDC响应客户端的身份验证请求,返回一个客户的身份验证票,这个特殊的身份验证票被叫做TGT(ticket-granting ticket),一个TGT能够是身份验证服务安全的把请求者的信任证传送给票据授权服务。
TGT 是:
|
• |
一个用户从身份验证服务那获得的初始身份票据 |
|
• |
用于请求服务票据 |
|
• |
仅用于票据授权服务 |
TGT被一个KDC共享的密钥加密,客户端无法读取TGT,只有KDC服务器能够读取TGT从而访问用户的信任证、session keys和其它信息。类似一个普通的服务票据,TGT包含一个服务(这里是KDC)跟客户端通讯的session key的副本,TGT被KDC的长期密钥加密。
从客户端的观点,TGT就是另一个票据,在客户尝试连接到一个服务,客户端首先检查缓存中有没有对应这个服务的服务票据,如果没有,再检查是不是有TGT,如果发现了TGT,客户端在缓存中取出相应的跟KDC之间通讯用的session key(Ticket Granting Service Session key),用这个session key准备一个验证器authenticator(关于验证器在本文的后面有描述),把这个验证器和TGT连同请求的服务一起发送到KDC。换句话说,获准进入KDC和获准进入域中的其它服务是不同的――它要求一个session key、一个验证器和一个TGT。
从KDC的观点看,TGT能避免客户每次请求一个服务时都要验证一次身份造成的性能损失,KDC只需要在用户申请初始TGT时验证用户的身份一次,在所有其它跟客户端交换信息时,KDC使用自己的长期密钥解密TGT,获取session key,用它再解密用户的验证器。
服务票据能够使票据授权服务(TGS)安全的传送请求者的信任证到目标服务器或者服务。
KDC响应客户请求连接到一个服务,返回给客户端两个Session key的副本,客户端的Session key用KDC跟客户端共享的密钥加密,服务端的Session key连同包含用户信息的服务票据一起打包,然后用KDC跟服务共享的密钥加密。服务票据(连同服务端的Session key的副本)由客户端管理直到客户端跟相应的服务联系。
服务票据不同于票据授权服务(TGS),服务票据被用于服务的验证,并且只是针对特定的目标服务。
服务票据被KDC跟特定的服务共享的长期密钥加密,因此,虽然客户端管理着服务票据,但是客户端不能读它。只有KDC和目标服务能读取服务票据,能够安全的访问客户的信任证,Session key 和其它信息。
注意:
|
• |
KDC简单的提供了一个票据授权服务(TGS),它不能保证信息一定会被送到预想的地址,如果KDC messages不幸落入他人之手,只有他知道客户端的密钥才能解密出Session key,只有他知道服务器的密钥,才能解密出服务票据。 |
当客户端收到KDC的回复,获取了服务票据和客户端的session key 的副本,把它们两个存放在一个安全缓存(在内存中,不是硬盘上)里。当客户端需要进入一个服务器,它向服务器发送一个message,这个message包含被服务器的密钥加密的服务器票据和被Session key加密的验证器,服务器票据和验证器做为客户端在这个服务器上的信任证
服务器不存储跟客户端通讯使用的Session key,客户端有责任在它的credentials cache中保存服务票据并在每次访问服务器是提交合格票据。无论何时,服务器能从客户端收到服务票据,服务器能够用它的密钥解密票据并从中获取session key。当服务器不在需要这个session key时,将会丢弃它。
客户端不需要每次访问特定的服务器都要访问KDC获取服务票据,服务票据是可以重用的。为了防止有人偷取服务票据的可能性,服务票据有一个过期时间,这个时间由KDC在生成服务票据时在票据数据结构内说明的。
服务票据的有效期长短由领域的策略决定,虽然RFC的建议最长的生命期是一天,在MIT Kerberos V5和Windows 2000、Windows Server 2003这两种kerberos实现中,缺省票据有效期不超过10小时,大概为一般的登陆会话的时间长度。当用户登出,credentials cache被清除,所有的服务票据,还有所有的session key都被销毁。
就我们的目的,下面列出的票据中的字段和对它们的描述已经足够,更详细严密的票据数据结构和信息请参看RFC1510。
票据的开始的三个字段没有被加密,这些信息是明文,也是为了方便客户端用这些信息在缓存中管理它们。
票据内容
|
字 段 名 |
描述 |
|
Ticket Version Number |
5,版本号,表示kerberos V5 |
|
Realm |
发出票据的领域(域)名,KDC只能在它自己的领域发行票据,所以也是服务器的领域名 |
|
Server Name |
服务器名 |
|
|
以下字段用服务器密钥加密 |
|
Flags |
指示怎样、什么时候这个票据被使用的标志。关于标志的详细信息请看下面的表。 |
|
Key |
用于加密和解密客户跟目标服务器之间信息的session key |
|
Client Realm |
请求服务者的领域名 |
|
Client Name |
请求服务者的名字 |
|
Transited |
在客户端在跨域验证时要作为验证的一部分的kerberos领域的列表 |
|
Authentication Time |
客户端初次验证的时间。当KDC签发一个TGT时会在这个字段打上时间戳。当KDC根据一个TGT签发一个服务票据时,KDC从TGT中拷贝拷贝这个时间戳到服务票据的这个字段。 |
|
Start Time |
票据有效期的开始时间 |
|
End Time |
票据的过期时间 |
|
Renew Till |
(可选)票据中的flag标志字段为RENEWABLE时,最大过期时间。 |
|
Client Address |
(可选)一个或者多个能够使用这个票据的客户端地址。如果这个字段被忽略,这个票据能够从任何地址发出。 |
|
Authorization-Data |
(可选)这个字段包含客户端的身份认证的信息。在MIT的kerberos的实现中,这个字段一般包含访问限制,比如,这是一个客户端发送给打印服务器希望打印一个文件的票据,这个字段可能包含这个文件名,限制服务器只能为客户端打印这个文件。 在微软的实现中,这个字段是比较重要的,因为它包含了用户的SID和客户端所属的组的SID,这个数据用来建立用户的访问令牌(客户端的特许属性) |
下表列出Kerberos的票据中Flag字段的可能值及其描述。Flag字段是个用0或1表示含义的字段,虽然这个字段有32bit长,Kerberos只使用了其中的11位。
Ticket Flag字段
|
Flag |
描述 |
|
FORWARDABLE |
(只对TGT有意义)告诉票据授权服务允许根据当前TGT签发一个新的不同的网络地址的TGT。FORWARDABLE标志一般只被身份验证服务解释,应用服务器将忽略它。FORWARDABLE标志的解释跟PROXIABLE标志相似,除了TGT也可能被签发为不同的网络地址。这个标志缺省的被复位,但是用户可以在申请初始TGT时要求把这个标志置位。 |
|
FORWARDED |
指示是否是被转发的,或者是从一个转发的TGT签发的 |
|
PROXIABLE |
(只对TGT有意义)PROXIABLE标志一般只能由票据授权服务来解释,应用服务将忽略它。如果置位,这个标志告诉票据授权服务它可以基于这个票据签发一个不同网络地址的新票据(但不是一个新的TGT),这个标志缺省被置位。 |
|
PROXY |
PROXY标志在TGS签发一个新的代理票据时被置位。应用服务器可以检查这个标志并可以为了检查跟踪要求附加的验证。 |
|
MAY-POSTDATE |
(只对TGT有意义)告诉票据授权服务可以签发postdated的票据 |
|
POSTDATED |
指示这个票据就是postdated的票据 |
|
INVALID |
指示是无效的,在使用之前必须经过KDC的验证。一个postdated的票据是无效的,直到它的开始时间有效 |
|
RENEWABLE |
跟End Time 和 Renew Till字段结合使用, KDC的周期性更新票据的生命周期 |
|
INITIAL |
表示这个票据是身份验证服务初次签发的票据,不是基于别的TGT派生签发的。 |
|
PRE-AUTHENT |
指示客户在票据签发前已经被KDC验证了身份。这个标志通常表示票据中的验证器的存在,它也标志着用智能卡登录时信任令牌的存在。 |
|
HW-AUTHENT |
指示初始的身份验证需要硬件。 |