一、文章来由
为了 computer security 课的展示准备素材。
二、什么是 Kerberos
Kerberos这一名词来源于希腊神话“三个头的狗——地狱之门守护者
摘自百度百科
Kerberos 是一种网络认证协议,其设计目标是通过密钥系统为客户机 / 服务器应用程序提供强大的认证服务。该认证过程的实现不依赖于主机操作系统的认证,无需基于主机地址的信任,不要求网络上所有主机的物理安全,并假定网络上传送的数据包可以被任意地读取、修改和插入数据。在以上情况下, Kerberos 作为一种可信任的第三方认证服务,是通过传统的密码技术(如:共享密钥)执行认证服务的。
三、认证过程
1.
认证过程具体如下:客户机向认证服务器(AS)发送请求,要求得到某服务器的证书,然后 AS 的响应包含这些用客户端密钥加密的证书。证书的构成为: 1) 服务器 “ticket” ; 2) 一个临时加密密钥(又称为会话密钥 “session key”) 。客户机将 ticket (包括用服务器密钥加密的客户机身份和一份会话密钥的拷贝)传送到服务器上。会话密钥可以(现已经由客户机和服务器共享)用来认证客户机或认证服务器,也可用来为通信双方以后的通讯提供加密服务,或通过交换独立子会话密钥为通信双方提供进一步的通信加密服务。
2.
3.
4.
Kerberos 服务是单点登录系统,这意味着您对于每个会话只需向服务进行一次自我验证,即可自动保护该会话过程中所有后续事务的安全。服务对您进行验证后,即无需在每次使用基于 Kerberos 的服务时进行验证。因此,无需在每次使用这些服务时都在网络上发送口令(增强了安全性)。MIT写了一段故事型的对话,比较生动得表述了Kerberos协议的工作原理:
Athena和欧里庇得斯关于地狱之门守护者的对话。简而言之,kerbores V5的工作原理如下。
Kerbores中有三种角色:
KDC:负责分发密钥的密钥分配中心
Client:需要使用kerbores服务的客户端
Service:提供具体服务的服务端
其中,Client需要和KDC和Service都进行通信。协议授权流程分两个部分:
(1) 获取原始票据
首先,Client向KDC发送自己的身份信息,KDC从授予票据服务(Ticket Granting Service)得到可用的票据(ticket-granting ticket),并用协议开始前KDC与Client之间的密钥将票据加密回复给client,client收到KDC回复的加密票据后利用与client先前协议的密钥将票据解密,从而获得票据,此步骤主要是允许client进行Kerberos的验证,是进行访问服务的先决条件。
(2) 获取服务票据以及访问服务
client利用之前获得的票据向KDC请求服务票据,从而通过服务的身份验证。获取服务票据以及访问服务总共有如下四步:
①. client将之前获得的票据和要请求的服务信息发送给KDC,KDC中的授予票据服务将client和service之间生成一个会话密钥(Session Key)用于服务器与client的身份验证。然后KDC将这个会话密钥和用户名,用户地址(IP),服务名,有效期,时间戳一起包装成一个票据(这张票据用于service对client的身份验证)通过client转发给service。
②. 为了让票据对client保密,所以KDC用协议开始之前KDC与服务端之间的密钥将票据加密后再发给client,同时为了让client与service之间共享那个会话密钥,KDC用client与它之间的密钥将会话密钥加密返回给client
③. 为了完成票据的传递,client将刚才收到的票据转发到service,由于client不知道KDC与service的密钥,所以它无法修改票据的信息,同时client将收到的会话密钥解压出来,然后将自己的用户名,用户地址(IP)打包成验证包用会话密钥加密也发给service
④. Service收到票据后利用它与KDC之间的密钥将票据中的信息解密出来,从而获得会话密钥和用户名,用户地址(IP),服务名,有效期。然后再用会话密钥将验证包解密从而获得用户名,用户地址(IP)将其与之前票据中解密出来的用户名,用户地址(IP)做比较从而验证client的身份,如果service有返回结果,将其返回给client.
5.
Kerberos协议:
Kerberos协议主要用于计算机网络的身份鉴别(Authentication), 其特点是用户只需输入一次身份验证信息就可以凭借此验证获得的票据(ticket-granting ticket)访问多个服务,即SSO(Single Sign On)。由于在每个Client和Service之间建立了共享密钥,使得该协议具有相当的安全性。
条件
先来看看Kerberos协议的前提条件:
如下图所示,Client与KDC, KDC与Service 在协议工作前已经有了各自的共享密钥,并且由于协议中的消息无法穿透防火墙,这些条件就限制了Kerberos协议往往用于一个组织的内部, 使其应用场景不同于X.509 PKI。
过程
Kerberos协议分为两个部分:
1 . Client向KDC发送自己的身份信息,KDC从Ticket Granting Service得到TGT(ticket-granting ticket), 并用协议开始前Client与KDC之间的密钥将TGT加密回复给Client。
此时只有真正的Client才能利用它与KDC之间的密钥将加密后的TGT解密,从而获得TGT。
(此过程避免了Client直接向KDC发送密码,以求通过验证的不安全方式)
Client利用之前获得的TGT向KDC请求其他Service的Ticket,从而通过其他Service的身份鉴别。
Kerberos协议的重点在于第二部分,简介如下:
1. Client将之前获得TGT和要请求的服务信息(服务名等)发送给KDC,KDC中的Ticket Granting Service将为Client和Service之间生成一个Session Key用于Service对Client的身份鉴别。然后KDC将这个Session Key和用户名,用户地址(IP),服务名,有效期, 时间戳一起包装成一个Ticket(这些信息最终用于Service对Client的身份鉴别)发送给Service, 不过Kerberos协议并没有直接将Ticket发送给Service,而是通过Client转发给Service.所以有了第二步。
2. 此时KDC将刚才的Ticket转发给Client。由于这个Ticket是要给Service的,不能让Client看到,所以KDC用协议开始前KDC与Service之间的密钥将Ticket加密后再发送给Client。同时为了让Client和Service之间共享那个秘密(KDC在第一步为它们创建的Session Key), KDC用Client与它之间的密钥将Session Key加密随加密的Ticket一起返回给Client。
3. 为了完成Ticket的传递,Client将刚才收到的Ticket转发到Service. 由于Client不知道KDC与Service之间的密钥,所以它无法算改Ticket中的信息。同时Client将收到的Session Key解密出来,然后将自己的用户名,用户地址(IP)打包成Authenticator用Session Key加密也发送给Service。
4. Service 收到Ticket后利用它与KDC之间的密钥将Ticket中的信息解密出来,从而获得Session Key和用户名,用户地址(IP),服务名,有效期。然后再用Session Key将Authenticator解密从而获得用户名,用户地址(IP)将其与之前Ticket中解密出来的用户名,用户地址(IP)做比较从而验证Client的身份。
5. 如果Service有返回结果,将其返回给Client。
总结
概括起来说Kerberos协议主要做了两件事
1. Ticket的安全传递。
2. Session Key的安全发布。
再加上时间戳的使用就很大程度上的保证了用户鉴别的安全性。并且利用Session Key,在通过鉴别之后Client和Service之间传递的消息也可以获得Confidentiality(机密性), Integrity(完整性)的保证。不过由于没有使用非对称密钥自然也就无法具有抗否认性,这也限制了它的应用。不过相对而言它比X.509 PKI的身份鉴别方式实施起来要简单多了。
四、缺点
五、应用
安装步骤:
1.下载krb5-1.9.5
http://web.mit.edu/kerberos/dist/krb5/1.9/krb5-1.9.5-signed.tar
2.解压
tar -xvf krb5-1.9.5-signed.tar
生成krb5-1.9.5.tar.gz 和 krb5-1.9.5.tar.gz.asc
继续解压tar zxvf krb5-1.9.5.tar.gz
3.编译
cd krb5-1.9.5/src
./configure
make && make install
也可以直接用yum 安装,redhat默认自带的 yum 源需要注册,也可以使用centos的yum源.
wget http://mirrors.163.com/.help/CentOS6-Base-163.repo
KDC server 安装 yum -y krb5-server
客户端安装: yum -y krb5-workstation
4.配置/etc/krb5.conf
这个是Kerberos最主要的配置文件,而且一定要放在/etc下
[logging]
default = FILE:/var/log/krb5libs.log
kdc = FILE:/var/log/krb5kdc.log
admin_server = FILE:/var/log/kadmind.log
[libdefaults]
default_realm = KRBTEST.COM
dns_lookup_realm = false
dns_lookup_kdc = false
ticket_lifetime = 24h
forwardable = yes
[realms]
KRBTEST.COM = {
kdc = srv4.localdomain.com:88
admin_server = srv4.localdomain.com:749
default_domain = KRBTEST.COM
}
[domain_realm]
.localdomain.com = KRBTEST.COM
localdomain.com = KRBTEST.COM
5.配置/usr/local/var/krb5kdc/kdc.conf
由于上面安装时没有选择安装目录,所以默认的安装位置在/usr/local/var/krb5kdc
如果是yum安装,位置在/var/kerberos/krb5kdc
[kdcdefaults]
kdc_ports = 88
kdc_tcp_ports = 88
[realms]
KRBTEST.COM = {
max_renewable_life = 7d
master_key_type = aes256-cts
acl_file = /var/kerberos/krb5kdc/kadm5.acl
dict_file = /usr/share/dict/words
admin_keytab = /var/kerberos/krb5kdc/kadm5.keytab
supported_enctypes = aes256-cts:normal aes128-cts:normal des3-hmac-sha1:normal arcfour-hmac:normal des-hmac-sha1:normal des-cbc-md5:normal des-cbc-crc:normal
}
配置acl文件
6.创建一个kerberos数据库
kdb5_util create -r KRBTEST.COM -s
会要求创建数据库的密码。(kerberos),创建principal保存数据库文件
7.登录kerberos
kadmin.local
1)查看用户
listprincs
2)添加用户
addprinc appadmin@KRBTEST.COM
(password:kerberos)
8启动服务
service krb5kdc start
Starting Kerberos 5 KDC: [ OK ]
service kadmin start
Starting Kerberos 5 Admin Server: [ OK ]
9 验证principle
在其他主机上需要有相同的krb5.conf配置。
kinit appadmin@KRBTEST.COM
官方文档:
http://web.mit.edu/kerberos/krb5-current/doc/admin/install_kdc.html#install-and-configure-the-master-kdc
以下面的3台机器做ssh+kerberos测试:从srv5登陆srv6
KDC服务器: srv4.localdomain.com
srv5.localdomain.com
srv6.localdomain.com
KDC服务器的kdc.conf文件如下:
kdc_ports = 88
kdc_tcp_ports = 88
[realms]
KRBTEST.COM = {
#master_key_type = aes256-cts
acl_file = /var/kerberos/krb5kdc/kadm5.acl
dict_file = /usr/share/dict/words
admin_keytab = /var/kerberos/krb5kdc/kadm5.keytab
supported_enctypes = aes256-cts:normal aes128-cts:normal des3-hmac-sha1:normal arcfour-hmac:normal des-hmac-sha1:normal des-cbc-md5:normal des-cbc-crc:normal
}
3台机器的hosts文件改为如下
192.168.8.4 srv4.localdomain.com
192.168.8.5 srv5.localdomain.com
192.168.8.6 srv6.localdomain.com
3台机器的/etc/krb5.conf文件如下:
[logging]
default = FILE:/var/log/krb5libs.log
kdc = FILE:/var/log/krb5kdc.log
admin_server = FILE:/var/log/kadmind.log
[libdefaults]
default_realm = KRBTEST.COM
dns_lookup_realm = false
dns_lookup_kdc = false
ticket_lifetime = 24h
forwardable = yes
[realms]
KRBTEST.COM = {
kdc = srv4.localdomain.com:88
admin_server = srv4.localdomain.com:749
default_domain = KRBTEST.COM
}
[domain_realm]
.localdomain.com = KRBTEST.COM
localdomain.com = KRBTEST.COM
[appdefaults]
pam = {
debug = false
ticket_lifetime = 36000
renew_lifetime = 36000
forwardable = true
krb4_convert = false
}
在srv4.localdomain.com执行下面的命令
addprinc yorker/admin
(password:kerberos)
在srv5.localdomain.com执行下面的命令
kinit yorker/admin
kadmin yorker/admin
addprinc -randkey host/srv5.localdomain.com
ktadd -k /etc/krb5.keytab host/srv5.localdomain.com
Update the following values in /etc/ssh/sshd_config
GSSAPIAuthentication yes
GSSAPICleanupCredentials yes
在srv6.localdomain.com执行下面的命令
kinit yorker/admin
kadmin yorker/admin
addprinc -randkey host/srv6.localdomain.com
ktadd -k /etc/krb5.keytab host/srv6.localdomain.com
Update the following values in /etc/ssh/sshd_config
GSSAPIAuthentication yes
GSSAPICleanupCredentials yes
在srv5.localdomain.com和srv6.localdomain.com上重启sshd
service sshd restart
在srv5.localdomain.com上 su - yorker
kinit yorker
再执行下面的命令不用输入密码就可以登录到srv6.localdomain.com
ssh srv6.localdomain.com
其它一些命令
klist
kdestroy
klist -k -t /etc/krb5.keytab
ssh -v
http://www.linuxproblems.org/wiki/Ssh_with_kerberos
参考资料
[1] 百度百科
[2] 维基百科
[3] http://blog.csdn.net/kkdelta/article/details/46633557
[4] https://zhidao.baidu.com/question/26033896.html