尽管前面尝试了hadoop的simple认证方式,这种方法不是特别安全,在介绍一下hadoop的kerberos方式之前,下面我们尝试一下kerberos。
首先介绍一下Kerboros安装
OS 版本: Centos6.4
Kerberos版本: krb5-1.10.3
环境配置
机器名 |
Ip地址 |
功能 |
安装模块 |
custom.lllcloud.com |
192.168.124.133 |
Kerberos server |
krb5-libs krb5-server krb5-workstation krb5-devel |
client.lllcloud.com |
192.168.124.141 |
client |
krb5-libs krb5-workstation krb5-appl-clients |
server.lllcloud.com |
192.168.124.142 |
server |
Krb5-libs Krb5-workstation krb5-appl-servers |
在custom.lllcloud.com上安装kerberos server
yum install krb5-libs
yum install krb5-server
yum install krb5-workstation
yum install krb5-devel
在client.lllcloud.com上安装client
yum install krb5-libs
yum install krb5-workstation
yum install krb5-appl-clients
在server.lllcloud.com上安装server
yum install krb5-libs
yum install krb5-workstation
yum install krb5-appl-servers
关闭防火墙
chkconfig iptables off
service iptables stop
在所有的机器上配置/etc/hosts文件,相当于DNS解析
Vi /etc/hosts
192.168.124.133 custom.lllcloud.com custom
192.168.124.142 server.lllcloud.com server
192.168.124.141 client.lllcloud.com client
配置kerberos server
vi /etc/krb5.conf 主要修改realm
[logging]
default = FILE:/var/log/krb5libs.log
kdc = FILE:/var/log/krb5kdc.log
admin_server = FILE:/var/log/kadmind.log
[libdefaults]
default_realm = LLLCLOUD.COM
dns_lookup_realm = false
dns_lookup_kdc = false
ticket_lifetime = 24h
renew_lifetime = 7d
forwardable = true
[realms]
LLLCLOUD.COM = {
kdc = custom.lllcloud.com
admin_server = custom.lllcloud.com
default_domain = lllcloud.com
}
[domain_realm]
.lllcloud.com = LLLCLOUD.COM
lllcloud.com = LLLCLOUD.COM
vi /var/kerberos/krb5kdc/kdc.conf
[kdcdefaults]
kdc_ports = 88
kdc_tcp_ports = 88
[realms]
LLLCLOUD.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
}
vi /var/kerberos/krb5kdc/kadm5.acl
在配置完kerberos的配置文件后,创建kerberos数据库
kdb5_util create -r LLLCLOUD.COM –s
kerberos提供了两个管理工具:kadmin.local, kadmin
kadmin.local 必须运行在kerberos server上
kadmin可以运行在任何机器上,但是必须在kerberos server上启动kadmin服务
这两个管理工具可以创建principal, policy, keytab
对象 |
创建 |
删除 |
修改 |
查找 |
列举 |
principal |
addprinc |
delprinc |
modprinc |
getprinc |
listprincs |
policy |
addpol |
delpol |
modpol |
getpol |
listpols |
keytab |
ktadd |
ktremove |
|
|
|
创建管理员
kadmin.local
addprinc admin/[email protected]
getprinc admin/[email protected]
配置kerberos服务随着系统的启动而启动
chkconfig krb5kdc on
chkconfig kadmin on
service krb5kdc start
service kadmin start
kerberos认证通常需要两步
第一步获取tgt票据,通常需要用户提供principle和密码
第二步通过该tgt票据来获取某一服务的票据,这个票据用来与服务交互。
在这里,principal都拥有名字和密码,需要通过KDC来认证身份,它和KDC之间共享密钥稍微讲解一下最长使用到的两种principle,一类是普通用户,需要通过KDC认证身份并获取tgt票据,另一类是服务提供者,它需要通过对KDC提供给用户的票据进行确认以信任用户并为用户提供服务。第一类principal在登录系统手动输入密码。第二类principal解密KDC发的票据时需要用到自己的密钥,这个密钥存放在某个.keytab文件里。Keytab文件是通过KDC上的一个工具ktadd来生成的。
Kerberos提供了两个工具来查看票据信息。Kinit和 klist
Kinit 向kdc获取tgt票据
Klist 列出当前获取的所有票据
举一个例子:获取票据 kinit admin/admin
我们将在后面的例子中,看到这两个工具的用法
测试kerberos功能
1. 使用kadmin.local创建三个principle
Kadmin.local
Addprinc sample/[email protected]
Addprinc test1/[email protected]
Addprinc test2/[email protected]
ktadd -k /etc/krb5.keytab sample/[email protected]
2. 测试ssserver和sclient
启动ssserver: sserver -p 8899 -s sample -S /etc/krb5.keytab
kinit test1/[email protected]
klist
运行sclient : sclient custom.lllcloud.com 8899 sample
再运行klist
我们将发现多了一条记录,显然它是sample/[email protected]的票据
3. 测试sim_client和sim_server程序
可以使用前面2中的票据来访问sim_server服务
启动sim_server程序:sim_server -p 8899 -s sample -S /etc/krb5.keytab
启动sim_client程序:sim_client -p 8899 -h custome.lllcloud.com -m hello
而server 端也得到了响应
4. 测试uuserver和uuclient程序
启动uuserver: uuserver 8899
启动uuclient: uuclient custom "good" 8899
server同样也作出响应
5. 测试krsh和krlogin
使用admin.local创建一个新的principle
addprinc host/[email protected]
生成krb5.keytab文件 ktadd /root/krb5.keytab host/[email protected]
scp /root/ krb5.keytab root@server:/etc/ krb5.keytab
再生成一个winston的principle
addprinc krb5/[email protected]
在server上新建一个用户
groupadd krb5
useradd –g krb5 krb5
passwd krb5
Vi /home/krb5/.k5login 增加登录principle
krb5/[email protected]
启动klogin, kshell,krb5-telnet服务
chkconfig klogin on
chkconfig kshell on
chkconfig krb5-telnet
service xinetd restart
在客户端上先运行 kinit krb5/[email protected]
klist查看一下票据
运行 krsh 命令: krsh -l krb5 server.lllcloud.com ls –al
结果如下
运行krlogin: krlogin -l krb5 server.lllcloud.com
结果如下:成功登录到server上
最后我们来看一下klist结果
如果一步步的做到这一步,应该对kerberos系统大致有一个了解,在文档的最后,我们来介绍一下Kerberos工作原理
erberos协议主要用于计算机网络的身份鉴别,其特点是用户只需输入一次身份验证信息就可以凭借此验证获得的票据访问多个服务
Kerberos系统存在三种角色:
KDC:密钥分配中心(起到分发密钥的作用)
Client:客户端(被服务的对象)
Service:服务端(提供服务的主机)
验证步骤
步骤一:获取原始票据
客户端向密钥分配中心发送自己的身份信息,密钥分配中心从授予票据服务(Ticket Granting Service)得到可用的票据(ticket-granting ticket),并用协议开始前客户端与密钥分配中心之间的密钥将票据加密回复给客户端,客户端收到密钥分配中心回复的加密票据后利用与密钥分配中心先前协议的密钥将票据解密,从而获得票据,此步骤主要是允许客户端进行Kerberos的验证,是进行访问服务的先决条件
步骤二:获取服务票据以及访问服务
客户端利用之前获得的票据向密钥分配中心请求其他服务的票据,从而通过其他服务的身份验证
获取其他服务票据以及访问服务总共有如下四步:
1. 客户端将之前获得的票据和请求的服务信息发送给KDC,KDC中的授予票据服务将客户端和服务端之间生成一个会话密钥(Session Key)用于服务器与客户端的身份验证。然后KDC将这个会话密钥和用户名,用户地址(IP),服务名,有效期,时间戳一起包装成一个票据(这张票据用于服务端对客户端的身份验证)发送给服务端,Kerberos协议并没有直接将票据发送给服务端,而是通过客户端转发给服务端
2. KDC将刚才的票据转发给客户端。由于这个票据是要给服务端的,不能让客户端看到,所以KDC用服务端的密钥将票据加密后再发给客户端,同时为了让客户端与服务端之间共享那个会话密钥,KDC用客户端的密钥将会话密钥加密返回给客户端
3. 为了完成票据的传递,客户端将刚才收到的票据转发到服务端,由于客户端不知道密钥分配中心与服务端的密钥,所以它无法修改票据的信息,同时客户端将收到的会话密钥解压出来,然后将自己的用户名,用户地址(IP)打包成验证包用会话密钥加密也发给服务端
4. 服务端收到票据后利用的密钥将票据中的信息解密出来,从而获得会话密钥和用户名,用户地址(IP),服务名,有效期。然后再用会话密钥将验证包解密从而获得用户名,用户地址(IP)将其与之前票据中解密出来的用户名,用户地址(IP)做比较从而验证客户端的身份,如果服务端有返回结果,将其返回给客户端
举一个例子来说明一下上述的流程