FreeBSD 上使用Kerberos 5认证( 二 )


Authenticator: 在客户端向服务端进行认证时,伴随Ticket一起发送的另外一个部分,它的作用是证明发送Ticket 的用户就是拥有Ticket的用户,即防止重放攻击 。它的主要内容是一个时间戳(客户端发送Ticket的时间),在rfc1510中有它的完整的ASN.1定义 。
AS(Authentication Server): 为用户分发TGT(Ticket Granting Ticket)的服务器 。
TGT(Ticket Granting Ticket): 用户向TGS(Ticket Granting Server)证明自己身份的Ticket.
TGS(Ticket Granting Server): 为用户分发到最终目的Ticket的服务器,用户使用这个Ticket向自己要求提供服务的服务器证明自己的身份 。在实现上,AS和TGS实际上是由同一程序完成的,因为它们的实现机制并没有太大的差别,只是在加密所发出的Ticket时所使用的密钥不同(AS使用用户的密钥,而TGS使用会话密钥) 。
KDC(Key Distribution Center):密钥发放中心,通常将AS和TGS统称为KDC,有时也把AS 单独称为KDC 。
3.认证过程
1) ClIEnt → KDC:用户cnhawk向密钥分配中心(KDC)申请TGT;
2) KDC → Client:通过KDC的用户密码认证,cnhawk得到KDC发放的TGT;
3) Client → KDC:申请取得用户cnhawk所需要的host/s;
4) KDC → Client:KDC根据用户cnhawk提供的TGT,KDC向cnhawk发放host/s;
5) Client → Server:用户cnhawk向Server提供cnhawk,TGT和host/s ;Server根据主机的上保存的host/s和用户cnhawk的信息来验证cnhawk的登陆申请 。
6) Server → Client:Server确认,发送信息给Client允许cnhawk登陆Server 。
4.一个应用实例
为了更清楚的说明Kerberos 5认证协议,实际应用中的例子(具体例子可以在我们后边的实际应用中看到):假设某一局域网A,它的DNS域为the9.com;Realm为THE9.COM;Kerberos的数据库,AS以及TGS服务器都在主机test1.the9.com上 。A中主机test2.the9.com上的用户cnhawk对应的Principal为cnhawk/test2.the9.com@THE9.COM;A中的另一台主机test3.the9.com上的telnet服务器对应的Principal为host/test3.the9.com@THE9.COM 。Rlogin的客户端程序telnet和服务端程序telnetd都是支持Kerberos的,即都支持Kerberos认证协议 。cnhawk想用telnet远程登录到A中的另一台主机test3.the9.com上这时cnhawk所要完成的步骤是:
① 运行kinit程序 。kinit程序的作用是向AS申请TGT,并将获得的TGT和会话密钥放在保存Credential的文件中 。为此,cnhawk在命令行上键入:
% kinit cnhawk/test1.the9.comkinit程序在收到AS发回的消息后,就提示cnhawk输入passWord:
% kinit cnhawk/test1.the9.com cnhawk/test1.the9.com@THE9.COM"s Password: 在cnhawk正确的输入password后,kinit程序将这个password用约定的算法转化为cnhawk的密钥,并用这个密钥解密从TGS发回的消息,从而获得下一步使用的Credential 。到此,kinit程序结束 。由此可见,cnhawk的password并没有在网上传输,在网上传输的只是由cnhawk的密钥加密后的东西 。② 运行telnet的客户端程序telnet,为此cnhawk在命令行上键入:
test1# telnet -a -l cnhawk test3.the9.com telnet程序首先在保存Credential的文件中寻找未过期的TGT,并把它交给TGS,从而获得访问test3.the9.com上rlogin服务的Ticket 。接下来,它把这个Ticket和Authenticator一起发送给test3.the9.com的服务器程序telnetd 。telnetd在验证了cnhawk的身份后,就搜索本地cnhawk主目录下的文件“.k5login”,在“.k5login”文件中放有允许用rlogin远程登录到cnhawk帐户下的Principal 。在找到了cnhawk/test1.the9.com@THE9.COM之后,telnetd就申请一个虚拟终端,并fork一个shell,这时在test1.the9.com的终端上就会显示:test1# telnet -a -l cnhawk test3.the9.com
Trying test3.the9.com...
Connected to test3.the9.com.
Escape character is "^]".
[ Trying mutual KERBEROS5 (host/test3.the9.com@THE9.COM)... ]

推荐阅读