Kerberos原理
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.
安装步骤:
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
[email protected]
(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
[email protected]
官方文档:
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