在实际开始安装配置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分发到其余的几台服务器上,但其他不需要启动任何服务进程。
写累了,今天不写了。