分享
 
 
 

FreeBSD上使用Kerberos5认证

王朝system·作者佚名  2008-05-21
窄屏简体版  字體: |||超大  

cnhawk < xwzheng@sina.com >第一部分 Kerberos 协议介绍1.Kerberos 协议简介

在希腊神话中,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 cnhawk/test1.the9.com

kinit程序在收到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.comTrying 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)%iduid=1001(cnhawk) gid=0(wheel) groups=0(wheel)第二部分 Kerberos 5安装和应用1.系统安装

需要安装两台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上安装

Test1# cd /usr/ports/security/krb5/Test1# make && make install

测试机B上安装FreeBSD 4.9 在安装的时候就选择krb5

在B上安装DNS

Test2# cd /usr/ports/dns/bind9Test2# make && make install

在测试机C上安装

Test3# cd /usr/ports/security/krb5/Test3# make && make install

我们的选择测试机A为KDC服务器,测试机B为客户端。

好我们现在登陆测试机A,在/etc/rc.conf里添加上以下两条

kerberos5_server_enable="YES"kadmind5_server_enable="YES"

这样服务器下次重新启动以后就可以直接启动kerberos5服务了,然后创建/etc/krb5.conf,加上以下的内容;

[libdefaults]default_realm = THE9.COM[realms]THE9.COM = {kdc = test1.the9.comadmin_server = test1.the9.comdefault_domain = the9.com}[domain_realm].the9.com = THE9.COM[logging]default = FILE:/var/log/krb5libs.logkdc = FILE:/var/log/krb5kdc.logadmin_server = FILE:/var/log/kadmind.log

因为Kerberos需要互相解析域名,设置DNS,能够互相解析地址。

登陆测试机B,

将测试机A上的/etc/krb5.conf拷贝到测试机B和测试机C上;

3.Kerberos 5的调试和部署

同时reboot掉两个系统,机器启动完成以后需要同步两台服务器的时间,时间对Kerberos 来说非常重要,Kerberos默认允许的时间偏移量很小,如果两台服务器的时间差超过了Kerberos 允许值,就无法从KDC服务器上取得票据。我写了脚本定时去时间服务器上来同步时间。时间完成以后开始在测试机A上操作;

Test1# kstashMaster key: hawkVerifying password - Master key: hawkTest1# kadmin -lkadmin> init THE9.COM //添加默认的域名应该和krb5.conf里保持一致Realm max ticket life [unlimited]:kadmin> add cnhawk/test1.the9.com //直接输入用户名/后面说明这个是哪个主机的用户,登陆时候使用cnhawk/test1.the9.com@THE9.CONMax ticket life [unlimited]:Max renewable life [unlimited]:Attributes []:Password: hawkVerifying password - Password: hawkkadmin> exithawk#

用户添加完成以后进行本地测试。

hawk# kinit cnhawk/test1.the9.com@THE9.COMcnhawk/test1.the9.com@THE9.COM's Password:hawk# klist -fCredentials cache: FILE:/tmp/krb5cc_0Principal: cnhawk/test1.the9.com@THE9.COMIssued Expires Flags PrincipalJun 7 17:12:21 Jun 8 03:12:21 I krbtgt/THE9.COM@THE9.COM

我们可以看到本地已经拿到票据了。

下面添加测试机B的域名地址信息,就是允许测试机B能登陆测试机A。 特别注意Kerberos必须使用域名来访问机器。如果使用IP添加主机会出现一些意外的问题。

test1# kadmin -lkadmin> add --random-key host/test1.the9.com //说明添加的是主机不是用户Max ticket life [1 day]:Max renewable life [1 week]:Principal expiration time [never]:Password expiration time [never]:Attributes []:kadmin> ext host/test1.the9.comkadmin> ext --keytab=/tmp/the9.keytab host/test1.the9.com

这样完成以后就好了,基本配置已经结束了,可以使用。

调试

我们开始使用Kerberos的认证部署网络服务,注意Kerberos通过修改用户主目录下的.klogin和.k5login文件,将你允许登陆的用户Principal添加在文件里就好了。

test1# cat .k5login# $FreeBSD: src/etc/root/dot.k5login,v 1.1 2003/04/30 20:58:49 markm Exp $## user1/root@YOUR.REALM.WHEREVER# user2/root@YOUR.REALM.WHEREVERcnhawk/test1.the9.com@THE9.COM

这样就可以了

使用Kerberos认证的telnet

修改/etc/inetd.conf 添加

telnet stream tcp nowait root /usr/libexec/telnetd telnetd -a user

然后开启

test2# inetd

然后从test1登陆test2

test1# kinit cnhawk/test1.the9.com //先取得票据cnhawk/test1.the9.com@THE9.COM's Password:test1# klist –f //看看是不是取得Credentials cache: FILE:/tmp/krb5cc_0Principal: cnhawk/test1.the9.com@THE9.COMIssued Expires Flags PrincipalJun 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)//登陆欢迎词%iduid=1001(the9) gid=0(wheel) groups=0(wheel)% //好了成功了

使用Kerberos认证的ssh

修改测试A,B,C的sshd 配置文件。

# Kerberos optionsKerberosAuthentication yesKerberosOrLocalPasswd yes

然后重启sshd

Test2#kill –HUP 80

开始从test1登陆到test2,因为只有ssh1支持Kerberos,所以使用ssh1连接同时开启debug信息。

test1# ssh -1v the9@test2.the9.comOpenSSH_3.6.1p1 FreeBSD-20030924, SSH protocols 1.5/2.0, OpenSSL 0x0090703fdebug1: Reading configuration data /etc/ssh/ssh_configdebug1: Rhosts Authentication disabled, originating port will not be trusted.debug1: Connecting to test2.the9.com [192.168.0.3] port 22.debug1: Connection established.debug1: identity file /root/.ssh/identity type -1debug1: Remote protocol version 1.99, remote software version OpenSSH_3.5p1 FreeBSD-20030924debug1: match: OpenSSH_3.5p1 FreeBSD-20030924 pat OpenSSH*debug1: Local version string SSH-1.5-OpenSSH_3.6.1p1 FreeBSD-20030924debug1: Waiting for server public key.debug1: Received server public key (768 bits) and host key (1024 bits).debug1: Host 'test2.the9.com' is known and matches the RSA1 host key.debug1: Found key in /root/.ssh/known_hosts:3debug1: Encryption type: 3desdebug1: Sent encrypted session key.debug1: Installing crc compensation attack detector.debug1: Received encrypted confirmation.debug1: Trying Kerberos v5 authentication.debug1: Kerberos v5 authentication accepted.debug1: Requesting pty.debug1: Requesting shell.debug1: Entering interactive session.Last login: Fri Jun 11 16:31:14 2004 from test1.the9.comCopyright (c) 1980, 1983, 1986, 1988, 1990, 1991, 1993, 1994The Regents of the University of California. All rights reserved.FreeBSD 4.9-RELEASE (GENERIC) #0: Mon Oct 27 17:51:09 GMT 2003FreeBSD/i386 (test2.the9.com) (ttyp1)//登陆欢迎词%iduid=1001(the9) gid=0(wheel) groups=0(wheel)% //好了成功了

测试已经完成了。可以使用Kerberos了。

ftp 服务

%kinit cnhawk/test1.the9.comCnhawk/test1.the9.com @THE9.COM's Password:%klist -fCredentials cache: FILE:/tmp/krb5cc_1001Principal: cnhawk/test1.the9.com@THE9.COMIssued Expires Flags PrincipalJun 11 18:49:56 Jun 12 04:49:56 I krbtgt/THE9.COM@THE9.COM%/usr/local/bin/ftp -v hawk.the9.comConnected to hawk.the9.com.220 hawk.the9.com FTP server (Version 5.60) ready.334 Using authentication type GSSAPI; ADAT must followGSSAPI accepted as authentication typeGSSAPI authentication succeededName (hawk.the9.com:cnhawk):232 GSSAPI user cnhawk@THE9.COM is authorized as cnhawkRemote system type is UNIX.Using binary mode to transfer files.ftp>

好了FTP也可以接受登陆 总结Kerberos使用中需要注意一些地方,例如,时间一定要保证同步,因为Kerberos靠时间戳来保持同步,时间允许的飘溢量非常小。所以必须保证时间的准确。 cnhawk# kinit cnhawk/test1.the9.com@THE9.COM cnhawk/test1.the9.com@THE9.COM's Password: kinit: krb5_get_init_creds: time skew (314) larger than max (300) cnhawk# ntpdate time.the9.com 7 Jun 16:59:49 ntpdate[623]: step time server 61.129.93.5 offset 211.348035 sec cnhawk# kinit cnhawk/test1.the9.com @THE9.COM cnhawk/test1.the9.com@THE9.COM's Password: 而且很多时候在登陆前要查看票据是不是过期了。 hawk# klist Credentials cache: FILE:/tmp/krb5cc_0 Principal: cnhawk/test1.the9.com@THE9.COMIssued Expires PrincipalJun 7 17:19:25 >>>Expired<<< krbtgt/THE9.COM@THE9.COMJun 7 17:20:23 >>>Expired<<< host/cnhawk.the9.com@THE9.COM

同时要注意认证时候不只是认证用户信息,还有主机信息,要保证这两个信息都在KDC中心数据库上存储。这样才能保证用户取得票据以后能顺利登陆服务器。

Kerberos系统认证过程示意图

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有