分类: BSD
2005-12-15 14:56:39
在希腊神话中,Kerberos是守护地狱之门的三头狗。在计算机世界里,美国麻省理工学院(MIT)把他们开发的这一网络认证系统命名为
Kerberos。
Kerberos认证协议是由美国麻省理工学院(MIT)在80年代首先提出并实现的,是该校Athena计划的一部分。因为Kerberos是一个三方
认证协议,根据称为密匙分配中心(KDC)的第三方服务中心来验证网络中计算机相互的身份,并建立密匙以保证计算机间安全连接。Kerberos协议基本
上是可行的并且有效的。KDC有两个部分组成:认证服务器AS和票据授权服务器TGS。Kerberos是一种网络认证协议,允许一台计算机通过交换加密
消息在整个非安全网络上与另一台计算机互相证明身份。一旦身份得到验证,Kerberos协议将会给这两台计算机提供密匙,以进行安全通讯对话。
Kerberos协议可以认证试图等录上网用户的身份,并通过使用密匙密码为用户间的通信加密。总的来说,Kerberos
是一种基于私钥加密算法的,需要可信任的第三方作为认证服务器的网络认证系统。它允许在网络上通讯的实体互相证明彼此的身份,并且能够阻止旁听和重放等手
段的攻击。不仅如此,它还能够提供对通讯数据保密性和完整性的保护。
Kerberos从提出到今天,共经历了五个版本的发展。其中版本1到版本3主要由该校内部使用。当它发展到版本4的时候,已经取得了在MIT校园外的广
泛认同和应用。由于版本4的传播,人们逐渐发现了它的一些局限性和缺点(例如适用网络环境有限,
加密过程存在冗余等等).MIT充分吸收了这些意见,对版本4进行了修改和扩充,形成了今天非常完善的版本5。现在可以MIT提供的Kerberos
V5的最新实现是版本krb5 1.3.3,本文中提到的实现都是以它为依据的。
2.Kerberos协议术语解释
Principal:在Kerberos中,Principal是参加认证的基本实体。一般来说有两种,一种用来表示Kerberos数据库中的用
户,另一种用来代表某一特定主机,也就是说Principal是用来表示客户端和服务端身份的实体,
Principal的格式采用ASN.1标准,即Abstract Syntax Notation
One,来准确定义),Principal是由三个部分组成:名字(name),实例(instance),REALM(域)。比如一个标准的
Kerberos的用户是:name/instance@REALM 。
Name:第一部分。在代表客户方的情况,它是一个用户名;在代表主机的情况,它是写成host。
Instance:第二部分。对name的进一步描述,例如name所在的主机名或name的类型等,可省略。它与第一部分之间用‘ / ’分隔,但是作为主机的描述时写成host/Instance。
Realm:第三部分。是Kerberos在管理上的划分,在
KDC中所负责的一个域数据库称作为Realm。这个数据库中存放有该网络范围内的所有Principal和它们的密钥,数据库的内容被Kerberos
的认证服务器AS和票据授权服务器TGS所使用。Realm通常是永远是大写的字符,并且在大多数Kerberos系统的配置中,一般Realm和该网络
环境的DNS域是一致的。与第二部分之间用‘@’分隔,缺省为本地的Realm。
比如,Principal “ cnhawk/hawk.the9.com@THE9.COM ” 表示Realm “ THE9.COM
”中主机hawk.the9.com上的用户cnhawk ,而Principal “ host/hawk.the9.com @THE9.COM
” 则通常用来表示Realm “ THE9.COM”中主机hawk.the9.com。
Credential: Ticket和与它相联系的会话密钥合在一起称为Credential。之所以有这个概念是因为它们是客户端在向服务器证明自己的身份时必需的两样东西. 在一个Ticket的生存期内客户端会将这两样东西以Credential为单位保存在一个Cache文件中。
Ticket: 一个Ticket是一个用于安全的传递用户身份所需要的信息的集合。它不仅包含该用户的身份,而且包含其它一些相关的信息。一般来说,它主要包括客户方 Principal,目的服务方Principal,客户方IP地址,时间戳(分发该Ticket的时间),该Ticket的生存期,以及会话密钥等内 容。它的格式亦用ASN.1来准确定义。
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程序在收到AS发回的消息后,就提示cnhawk输入password:
② 运行telnet的客户端程序telnet,为此cnhawk在命令行上键入:
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)... ]
[ Kerberos V5 accepts you as `` cnhawk/test1.the9.com@THE9.COM'' ]
FreeBSD/i386 (test3.the9.com) (ttyp1)
%id
uid=1001(cnhawk) gid=0(wheel) groups=0(wheel)
需要安装两台FreeBSD 5.2.1的系统,一台FreeBSD 4.9 三个系统我是用虚拟机上安装的。
测试机A
操作系统:FreeBSD test1.the9.com 5.2.1-RELEASE FreeBSD 5.2.1-RELEASE #0: Mon
Feb 23 20:45:55 GMT 2004
root@wv1u.btc.adaptec.com:/usr/obj/usr/src/sys/GENERIC i386
IP地址:192.168.0.2
机器名:test1.the9.com
测试机B
操作系统:FreeBSD test2.the9.com 4.9-RELEASE FreeBSD 4.9-RELEASE #0: Mon Oct
27 17:51:09 GMT 2003
root@freebsd-stable.sentex.ca:/usr/obj/usr/src/sys/GENERIC i386
IP地址:192.168.0.3
机器名:test2.the9.com
测试机C :
操作系统:FreeBSD test3.the9.com 5.2.1-RELEASE FreeBSD 5.2.1-RELEASE #0: Mon
Feb 23 20:45:55 GMT 2004
root@wv1u.btc.adaptec.com:/usr/obj/usr/src/sys/GENERIC i386
IP地址:192.168.0.4
机器名:test3.the9.com
2.Kerberos 5软件安装和配置
Kerberos 5直接在ports中安装就好了,最新版本为krb5-1.3.1_1。
在测试机A上安装
登陆测试机B,
将测试机A上的/etc/krb5.conf拷贝到测试机B和测试机C上;
3.Kerberos 5的调试和部署
同时reboot掉两个系统,机器启动完成以后需要同步两台服务器的时间,时间对Kerberos
来说非常重要,Kerberos默认允许的时间偏移量很小,如果两台服务器的时间差超过了Kerberos
允许值,就无法从KDC服务器上取得票据。我写了脚本定时去时间服务器上来同步时间。时间完成以后开始在测试机A上操作;
Test1# kadmin -l
kadmin> init THE9.COM //添加默认的域名应该和krb5.conf里保持一致
Realm max ticket life [unlimited]:
kadmin> add cnhawk/test1.the9.com //直接输入用户名/后面说明这个是哪个主机的用户,登陆时候使用cnhawk/test1.the9.com@THE9.CON
Max ticket life [unlimited]:
Max renewable life [unlimited]:
Attributes []:
Password: hawk
Verifying password - Password: hawk
kadmin> exit
hawk#
Issued Expires Flags Principal
Jun 7 17:12:21 Jun 8 03:12:21 I krbtgt/THE9.COM@THE9.COM
调试
我们开始使用Kerberos的认证部署网络服务,注意Kerberos通过修改用户主目录下的.klogin和.k5login文件,将你允许登陆的用户Principal添加在文件里就好了。
Issued Expires Flags Principal
Jun 11 16:21:36 Jun 12 02:21:36 I krbtgt/THE9.COM@THE9.COM
//可以了
test1# telnet -a -l the9 192.168.0.3 //开始登陆
Trying 192.168.0.3...
Connected to test2.the9.com.
Escape character is '^]'.
[ Trying mutual KERBEROS5 (host/test2.the9.com@THE9.COM)... ]
[ Kerberos V5 accepts you as `` cnhawk/test1.the9.com@THE9.COM'' ]
FreeBSD/i386 (test2.the9.com) (ttyp1)
//登陆欢迎词
%id
uid=1001(the9) gid=0(wheel) groups=0(wheel)
% //好了成功了
FreeBSD 4.9-RELEASE (GENERIC) #0: Mon Oct 27 17:51:09 GMT 2003
FreeBSD/i386 (test2.the9.com) (ttyp1)
//登陆欢迎词
%id
uid=1001(the9) gid=0(wheel) groups=0(wheel)
% //好了成功了
ftp 服务
Issued Expires Flags Principal
Jun 11 18:49:56 Jun 12 04:49:56 I krbtgt/THE9.COM@THE9.COM
%/usr/local/bin/ftp -v hawk.the9.com
Connected to hawk.the9.com.
220 hawk.the9.com FTP server (Version 5.60) ready.
334 Using authentication type GSSAPI; ADAT must follow
GSSAPI accepted as authentication type
GSSAPI authentication succeeded
Name (hawk.the9.com:cnhawk):
232 GSSAPI user cnhawk@THE9.COM is authorized as cnhawk
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>
Issued Expires Principal
Jun 7 17:19:25 >>>Expired<<< krbtgt/THE9.COM@THE9.COM
Jun 7 17:20:23 >>>Expired<<< host/cnhawk.the9.com@THE9.COM
Kerberos系统认证过程示意图
这篇文章不错,收藏先!
大家最好不要在虚拟机上做,虚拟机对时间控制的不好,因为虚拟机时间控制有点问题.
太精彩了,顶!如果能用示意图把整个Kerberos流程画出来,那就更好了
CNFUG的文章总是这麽经典