在实际开始安装配置Kerberos以前,我打算先说一下keytab。

keytab,key table。上一篇的Principal里面,我们了解到了,Principal是kerberos的认证主体,相当于是你的账号。而keytab,可以粗浅的理解为SSH里面对应账号的私钥,而不同的是,SSH的私钥每个账号会有一个,而keytab是可以多个principal合并为一个的。原因是,keytab并不是作为验证用户来使用的,而是与密码的作用一样,用来替代密码做 tgt 数据加密来使用的。因此,在后面的安装配置介绍里面,生成keytab会让principal使用随机密码,而无论是你或者principal的服务使用者,都是不会知道随机密码内容的。但是由于keytab里面存储了加密的密码,所以,它可以代替每次认证手工输入密码的过程,这对于受保护的服务很重要,我们不能让一个后台常驻的服务程序不停的输入密码去跟KDC交互。所以,如果一时理解不了,你暂时可以把keytab做为ssh免密码登录的私钥来看待。


然后说一下Kerberos的安装配置过程,这个部分极其简单。

首先需要一台服务器做KDC,对于centos来说,只需要

yum -y install krb5-server

KDC的远程管理在rpm里面是放在客户端进行的,在安装workstation的同时就会安装kadmin,而本地管理的kadmin.local是放在server里面的,如果是本地管理kerberos的KDC,就不需要安装workstation。

以Hadoop集群为例,我在某个master节点安装了krb5-server,然后这些机器的所有节点既是受保护的服务,同时也是客户端,那么所有节点,包括安装kdc的master节点,都需要安装 krb5-workstation 包。

假设如下

192.168.1.2 master.hadoop [krb5-server], [namenode, resourcemanager, historyserver]

192.168.1.3 slave01.hadoop [krb5-workstation], [datanode, nodemanager]

192.168.1.4 slave02.hadoop [krb5-workstation], [datanode, nodemanager]

192.168.1.254 client01 [krb5-workstation], [hadoop-client]

作为client,主机名我并没有使用带有域名的主机名。事实上,我也没有配置这台机器的域名信息,那么它的FQDN实际上就是client01。

然后,先到master上配置krb5.conf,目标在/etc/krb5.conf,这个配置文件是kdc和workstation共用的,而kdc单独的配置文件并不在这里。

这个部分是配置KDC Server

;/etc/krb5.conf
[libdefaults]
    default_realm = HADOOP.COM
    dns_lookup_kdc = false
    dns_lookup_realm = false
    ticket_lifetime = 7d
    ;票据的缓存间隔,超期需要重新认证
    renew_lifetime =  14d
    ;票据的自动更新间隔
    forwardable = true
    default_tgs_enctypes = rc4-hmac
    default_tkt_enctypes = rc4-hmac
    permitted_enctypes = rc4-hmac
    udp_preference_limit = 1
    kdc_timeout = 3000
[realms]
HADOOP.COM =
    {
        kdc = master.hadoop
        admin_server = master.hadoop
    }
[logging]
    default = FILE:/var/log/krb5kdc.log
    admin_server = FILE:/var/log/kadmind.log
    kdc = FILE:/var/log/krb5kdc.log

接下来需要配置kdc专有的配置文件,目标在/var/kerberos/krb5kdc/kdc.conf

;/var/kerberos/krb5kdc/kdc.conf
[kdcdefaults]
    kdc_ports = 88
    ;udp端口
    kdc_tcp_ports = 88
    ;tcp端口
[realms]
    HADOOP.COM = 
    {
        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
        max_renewable_life = 30d
    }

然后初始化KDC的数据库,如同mysql安装完以后需要运行mysql_install_db,或者postgresql运行pgsql initdb一样,kdc也内建了嵌入式数据库,首次安装需要进行初始化。

kdb5_util create -s

接下来编辑kadm5.acl

默认情况下,特定principal的管理员主体的权力是很大的,但是这样不好,我们还是希望不同的人具有不同的权限,所以最好是修改kadm5.acl,让不同principal的管理员可以管理不同的东西。

下面是默认状态下 /var/kerberos/krb5kdc/kadm5.acl

*/[email protected]  *

对这个文件的解析会分为两列进行,第一列的具有管理员资格的principal,第二列是权限。

默认kadm5.acl的含义如下

*/[email protected]: 在HADOOP.COM域内任意以admin主机名认证的主体

*:所有权限

权限可选择的配置列表如下:

a: 允许增加principal或访问策略
A: 不允许增加principal或访问策略
c: 允许变更principals的密码
C: 不允许变更princials的密码
d: 允许删除principals或策略
D: 不允许删除principals或策略
i: 允许查看数据库
I: 不允许查看数据库
l: 允许列出principals或策略列表
L: 不允许列出principals或策略
m: 允许修改principals或策略
M: 不允许修改principals或策略
p: 允许传播(propagation)principal数据库
P: 不允许传播principal数据库
u: 允许创建使用PAM进行密码验证的单一组件用户principal
U: 否决u的权限
x: a,d,m,c,i,l权限的快捷方式
*: 跟x一样

所以,我们的kadm5.acl可以改的更安全一些,比如

root/[email protected] * 
;root/admin 可以在 kadmin 里做任何事
xianglei/[email protected] aml
;master.hadoop主机上的xianglei账号,可以在 kadmin 里增加,修改,查看principals列表,但不能删除,传播,查看数据库内容,变更密码等操作
list/*@HADOOP.COM l
;任意主机上的 list 用户只能看,别的啥也不能干

当然,除了管理员账号,这里不应该出现任何其他普通principal的账号。


关于kadm5.acl文件,其实对于安全性来说还是挺重要的,这是对管理员的管理,但是网上没看见任何一篇中文文章详细讲解了这个文件的配置,所以,还是我开一个先河吧,其他人复制粘贴我的好了。对于熟悉kerberos的人来说,默认不修改的kerberos的配置还是有机可乘的,但是我不打算把方法公布出来。怎么把kerberos本身的管理做的更好,都在这个文件里了。我们需要知道的是,kadmin.local进入kerberos管理是不需要密码的,所以,如何使用这个acl是你的问题了。


然后我们在kerberos数据库里来添加上面这三个账号

kadmin.local
Authenticating as principal root/[email protected] with password.
kadmin.local:
kadmin.local:  addprinc xianglei/[email protected]
WARNING: no policy specified for xianglei/[email protected]; defaulting to no policy
Enter password for principal "xianglei/[email protected]": 
Re-enter password for principal "xianglei/[email protected]": 
add_principal: Principal or policy already exists while creating "xianglei/[email protected]".
#我们没有使用随机密码,这意味着你必须输入两次密码来做验证,如果不生成keytab文件,那么xianglei在master.hadoop上每次认证KDC都需要输入该密码。

kadmin.local:  addprinc -randkey list/[email protected]
WARNING: no policy specified for list/[email protected]; defaulting to no policy
Principal "list/[email protected]" created.
#在这里,我们使用了随机密码,这意味着你不必每次登录都输入密码,但一定要制作keytab文件了,关于如何制作keytab文件,我想放到后面再说。

然后就可以启动kdc和kadmin了

service krb5kdc start
service kadmind start


最后一步是将/etc/krb5.conf分发到其余的几台服务器上,但其他不需要启动任何服务进程。

写累了,今天不写了。