这是信息系统安全实验系列的第七篇~
Kerberos又指麻省理工学院为这个协议开发的一套计算机网络安全系统。系统设计上采用客户端/服务器结构与DES加密技术,并且能够进行相互认证,即客户端和服务端均可对对方进行身份认证。
Kerberos使用了一个由两个独立的逻辑部分:认证服务器(同身份认证服务器)和票据授权服务器(同服务审批服务器)组成的“可信赖的第三方”,称为密钥分发中心(KDC)。Kerberos工作在用于证明用户身份的“票据”的基础上。
Kerberos域(realm)是一组受管节点,它们共享同一 Kerberos 数据库。Kerberos数据库驻留在Kerberos主控计算机系统上,对数据库的所有更改都必须在主控计算机系统进行。更改或访问 Kerberos 数据库要求有 Kerberos 主控密码。
Kerberos 主体(principal)是 Kerberos 系统知道的服务或用户。每个 Kerberos 主体通过主体名称进行标识。主体名称由三部分组成:服务或用户名称、实例名称以及域名,其中实例部分是可选的。
例如,主体名称可以描述用户主体在特殊域中的用户所拥有的授权角色,例如,joe.user@realm1。主体名称还可以描述服务主体的计算机系统上的服务的位置,例如,ftp.host1@realm2。Kerberos将不同计算机系统上的同一服务视为不同的服务主体。
每个主体有主体密码,Kerberos在其认证过程中使用该密码对服务和用户进行相互鉴别。使用 Kerberos,网络中一台计算机系统上的主体可以很有把握地与网络中另一台计算机系统上的主体进行对话,了解服务或用户是什么或谁在说话。
当用户作为 Kerberos 主体登录时,Kerberos 给用户分配一张票券。每张票券都有生命期,它决定票券有效的时间长度。当票券过期时,该主体不再是可信的,无法执行额外工作,直到获得一张新的票券。
学习Kerberos的安装和配置方法,掌握和了解Kerberos的工作原理和实现原理,使用Kerberos实现网络身份认证。
两台安装了Ubuntu 12.04的主机,Kerberos等软件。
图1(身份认证流程图)
Network Time Protocol(NTP)是用来使计算机时间同步化的一种协议,它可以使计算机对其服务器或时钟源(如石英钟,GPS等等)做同步化,它可以提供高精准度的时间校正(LAN上与标准间差小于1毫秒,WAN上几十毫秒),且可介由加密确认的方式来防止恶毒的协议攻击。
图2(安装ntp)
# /etc/ntp.conf, configuration for ntpd; see ntp.conf(5) for help
driftfile /var/lib/ntp/ntp.drift
statistics loopstats peerstats clockstats
filegen loopstats file loopstats type day enable
filegen peerstats file peerstats type day enable
filegen clockstats file clockstats type day enable
# You do need to talk to an NTP server or two (or three).
server 127.127.1.0
fudge 127.127.1.0 stratum 8
server ntp.time.ac.cn prefer
server cn.pool.ntp.org prefer
server hk.pool.ntp.org prefer
server 0.asia.pool.ntp.org
server 1.asia.pool.ntp.org
restrict -4 default kod notrap nomodify nopeer noquery
restrict 192.168.80.0 mask 255.255.255.0 nomodify notrap
restrict 127.0.0.1
如图3所示:
图3(修改配置文件)
图4(重启ntp服务)
图5(查看主机名称)
输入ifconfig -a查看ip,如图6所示:
图6(查看ip地址)
输入域名,如图7所示:
图7(输入域名)
输入服务器名称,如图8所示:
图8(输入服务器名称)
输入管理服务器名称,如图9所示:
图9(输入管理服务器名称)
图10(创建新的域)
[logging]
kdc = FILE:/var/log/krb5kdc.log
如图11所示:
图11(添加日志功能)
输入sudo kadmin.local,再依次输入如下命令:
kadmin.local: addprinc admin/admin,设置密码为123456(客户端登录密码),如图12-1所示:
图12-1(添加主体-1)
kadmin.local: ktadd -k /etc/kadm5.keytab kadmin/admin kadmin/changepw,如图12-2所示:
图12-2(添加主体-2)
kadmin.local: addprinc -randkey ftp/服务器域名,如图12-3所示:
图12-3(添加主体-3)
kadmin.local: ktadd -k /etc/ftp.keytab ftp/服务器域名,如图12-4所示:
图12-4(添加主体-4)
kadmin.local: quit
*/admin@服务器域名 *,如图13所示:
图13(管理员用户配置ACL权限)
图14(重启 krb5-admin-server 使ACL配置生效)
图15(验证新添加的管理员用户)
图16(安装ntp)
# /etc/ntp.conf, configuration for ntpd; see ntp.conf(5) for help
driftfile /var/lib/ntp/ntp.drift
statistics loopstats peerstats clockstats
filegen loopstats file loopstats type day enable
filegen peerstats file peerstats type day enable
filegen clockstats file clockstats type day enable
# You do need to talk to an NTP server or two (or three).
server 127.127.1.0
fudge 127.127.1.0 stratum 8
server ntp.time.ac.cn prefer
server cn.pool.ntp.org prefer
server hk.pool.ntp.org prefer
server 0.asia.pool.ntp.org
server 1.asia.pool.ntp.org
restrict -4 default kod notrap nomodify nopeer noquery
restrict 192.168.80.0 mask 255.255.255.0 nomodify notrap
restrict 127.0.0.1
如图17所示:
图17(修改配置文件)
图18(重启ntp服务)
图19(同步服务器时间)
输入服务器域名,如图20所示:
图20(输入服务器域名)
输入服务器名称,如图21所示:
图21(输入服务器名称)
输入管理服务器名称,如图22所示:
图22(输入管理服务器名称)
图23(检查域名)
域名与服务器域名相同。
图24(绑定主机)
图25(验证客户端配置是否正确)
有 ticket 信息,说明配置成功。
*流程说明
ⅰ)用户将用户名和口令输入客户机,请求登录;
ⅱ)客户机将用户输入的用户名及其他信息打包为身份认证请求,发给身份认证服务器;
ⅲ)身份认证服务器在确认用户名合法后,生成用于和服务审批服务器对话的会话密钥Ksess-1和用服务审批服务器的密钥Kgrant加密过的通行证Tgrant(Tgrant中含有Ksess-1的内容),将它们打包,并用身份认证信息库中对应用户的口令加密这个包,把加密后的包传给客户机;
ⅳ)客户机用用户输入的口令解密身份认证服务器传来的包,如果解密成功(比如时间戳等信息不是乱码)则该用户通过了身份认证,得到了Ksess-1和用Kgrant加密过的Tgrant。客户机向服务审批服务器发送用Ksess-1加密过的服务认证请求Qgrant和用Kgrant加密过的Tgrant;
ⅴ)服务审批服务器用自己的密钥解密得到Tgrant,用Tgrant中的Ksess-1解密得到Qgrant,根据Tgrant和Qgrant的信息判断该用户是否可以使用请求的服务,若可以,则通过了服务认证。服务审批服务器生成服务卡Tserv(Tserv中含有Ksess-2)和用于和应用服务器对话的会话密钥Ksess-2,把Ksess-2和用应用服务器密钥Kserv加密过的Tserv打成一个包,用Ksess-1加密后,传给客户机;
ⅵ)客户机用Ksess-1解密服务审批服务器传来的包,如果解密成功(比如时间戳等信息不是乱码)则该用户通过了身份认证,得到Ksess-2和加密过的Tserv。客户机向应用服务器发送用Ksess-2加密过的服务请求Qserv和用Kserv加密过的Tserv;
ⅶ)应用服务器用自己的密钥Kserv解密Tserv,并从Tserv中得到Ksess-2,用Ksess-2解密服务请求,最后启动应用服务。
*各自的任务
客户机:第ⅱ步中将用户输入的用户名及其他信息打包为身份认证请求,发给身份认证服务器;第ⅳ步中用用户输入的口令解密身份认证服务器传来的包,并向服务审批服务器发送用Ksess-1加密过的服务认证请求Qgrant和用Kgrant加密过的Tgrant;第ⅵ步中用Ksess-1解密服务审批服务器传来的包,并向应用服务器发送用Ksess-2加密过的服务请求Qserv和用Kserv加密过的Tserv;最后,提供用户接受服务的接口。
身份认证服务器(存储用户名及其口令):第ⅲ步中在确认用户名合法后,生成用于和服务审批服务器对话的会话密钥Ksess-1和用服务审批服务器的密钥Kgrant加密过的通行证Tgrant(Tgrant中含有Ksess-1的内容),将它们打包,并用身份认证信息库中对应用户的口令加密这个包,把加密后的包传给客户机。
服务审批服务器(存储不同类型的用户分别可以使用什么服务):第ⅴ步中用自己的密钥解密得到Tgrant,用Tgrant中的Ksess-1解密得到Qgrant,根据Tgrant和Qgrant的信息判断该用户是否可以使用请求的服务,若可以,则通过了服务认证。服务审批服务器生成服务卡Tserv(Tserv中含有Ksess-2)和用于和应用服务器对话的会话密钥Ksess-2,把Ksess-2和用应用服务器密钥Kserv加密过的Tserv打成一个包,用Ksess-1加密后,传给客户机;
应用服务器:第ⅶ步中用自己的密钥Kserv解密Tserv,并从Tserv中得到Ksess-2,用Ksess-2解密服务请求,最后启动应用服务。
*优缺点
优点:可以实现面向服务的再度认证,即让不同类型的用户拥有对不同服务的使用权限;在用户通过身份认证后,需要使用不同服务时,无需再进行身份认证,只需进行服务认证即可;用户在使用过程中,仅在登录时要求输入口令,与平常的操作完全一样,Kerberos的存在对于合法用户来说是透明的;可扩展性好:Kerberos为每一个服务提供认证,确保应用的安全;实现了双向认证:Client在访问Server的资源之前,可以要求对Server的身份执行认证;对于不同的平台可以进行广泛的互操作。
缺点:用户名及其口令都存储在身份认证服务器的信息库中,增大了安全风险;采用的是对称加密机制,加密和解密使用的是相同的密钥,交换密钥时的安全性比较难以保障;随用户数增加密钥管理较复杂;AS和TGS是集中式管理,容易形成瓶颈,系统的性能和安全也严重依赖于AS和TGS的性能和安全;服务器在回应时不验证用户的真实性,而是假设只有合法用户拥有口令字,存在一定的安全风险。
在服务端输入sudo gedit /etc/krb5kdc/kdc.conf,查看文件,如图26所示:
图26(查询KDC的配置文件)
由文件内容可知,KDC支持的加密方式包括:
aes256-cts:normal
arcfour-hmac:normal
des3-hmac-sha1:normal
des-cbc-crc:normal
des:normal
des:v4
des:norealm
des:onlyrealm
des:afs3
语句 |
含义 |
kadmin.local |
以超级管理员身份进入kadmin |
addprinc admin/admin |
生成指定口令的用户主体admin(需两次输入口令) |
ktadd -k /etc/kadm5.keytab kadmin/admin kadmin/changepw |
将kadmin/admin主体和kadmin/changepw主体添加至密钥表文件/etc/kadm5.keytab |
addprinc -randkey ftp/服务器域名 |
生成服务主体ftp/服务器域名并配以一个随机口令 |
ktadd -k /etc/ftp.keytab ftp/服务器域名 |
将ftp/服务器域名主体添加至密钥表文件/etc/ftp.keytab |
quit |
退出kadmin |
服务端:输入klist命令后如图27所示:
图27(服务端输入klist)
客户端:输入klist命令后如图28所示:
图28(客户端输入klist)
在不输入任何参数时,klist命令将列出在缺省凭证高速缓存中的所有条目,上图中包括用户主体名称及ticket的基本信息等,如ticket的生效时间、失效时间、服务器主体名称,缓存的更新时间等等。
*参考资料
http://web.mit.edu/kerberos/krb5-devel/doc/admin/admin_commands/kadmin_local.html