Kerberos主从配置文档
1. Kerberos主从同步机制
在Master上通过以下命令同步数据:
kdb5_util dump /var/kerberos/krb5kdc/slave_db
kprop -f /var/kerberos/krb5kdc/slave_db kerberos2.hadoop.com
2. 搭建 Kerberos
3.1 环境
我们在两个备用NameNode节点上实现Kerberos主从,并在其它需要接入认证的主机上安装Kerberos客户端。
- 操作系统:CentOS 6.7/RedHart 6.7
- 运行用户:root
3.2 安装包
我们是基于RedHart 6.7/CentOS 6.7操作系统,相关Kerberos安装包可在系统包中获取,相关rpm包列表如下:
krb5-app1-clients*.rpm
krb5-libs*.rpm
krb5-app1-servers*.rpm
krb5-pkinit-openssl*.rpm
krb5-auth-dialog*.rpm
krb5-server*.rpm
krb5-dev1*.rpm
krb5-server-ldap*.rpm
krb5-workstation*.rpm
3.2 安装过程
3.2.1 准备工作
确认添加主机名解析到 /etc/hosts 文件中。
$ cat /etc/hosts
127.0.0.1 localhost
111.111.241.210 kerberos.hadoop.com - master KDC
111.111.241.211 kerberos2.hadoop.com - slave KDC
注意:hostname 请使用小写,要不然在集成 kerberos 时会出现一些错误。
3.2.2 安装 kdc server
在 KDC (这里是master 和 slave) 上安装包 krb5、krb5-server 和 krb5-client。
rpm -ivh krb5-server*.rpm
rpm – ivh krb5-libs*.rpm
rpm -ivh krb5-auth-dialog*.rpm
rpm -ivh krb5-workstation*.rpm
在其他节点(kerberos 所有认证客户端)安装 krb5-libs、krb5-workstation
rpm – ivh krb5-libs*.rpm
rpm -ivh krb5-workstation*.rpm
3.2.3 修改配置文件
kdc 服务器涉及到三个配置文件:
/etc/krb5.conf
/var/kerberos/krb5kdc/kdc.conf
/var/kerberos/krb5kdc/kadm5.acl
配置 Kerberos 的一种方法是编辑配置文件 /etc/krb5.conf。默认安装的文件中包含多个示例项。
$ cat /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 = HADOOP.COM
dns_lookup_realm = false
dns_lookup_kdc = false
clockskew = 120
ticket_lifetime = 24h
renew_lifetime = 7d
forwardable = true
renewable = true
udp_preference_limit = 1
default_tgs_enctypes = arcfour-hmac
default_tkt_enctypes = arcfour-hmac
[realms]
HADOOP.COM = {
kdc = kerberos.hadoop.com:88
kdc = kerberos2.hadoop.com:88
admin_server = kerberos.hadoop.com:749
}
[domain_realm]
.hadoop.com = HADOOP.COM
www.hadoop.com = HADOOP.COM
[kdc]
profile=/var/kerberos/krb5kdc/kdc.conf
说明:
- [logging]:表示 server 端的日志的打印位置
- [libdefaults]:每种连接的默认配置,需要注意以下几个关键的小配置
- default_realm = HADOOP.COM:设置 Kerberos 应用程序的默认领域。如果您有多个领域,只需向 [realms] 节添加其他的语句。
- udp_preference_limit= 1:禁止使用 udp 可以防止一个Hadoop中的错误
- clockskew:时钟偏差是不完全符合主机系统时钟的票据时戳的容差,超过此容差将不接受此票据。通常,将时钟扭斜设置为 300 秒(5 分钟)。这意味着从服务器的角度看,票证的时间戳与它的偏差可以是在前后 5 分钟内。
- ticket_lifetime: 表明凭证生效的时限,一般为24小时。
- renew_lifetime: 表明凭证最长可以被延期的时限,一般为一个礼拜。当凭证过期之后,对安全认证的服务的后续访问则会失败。
- [realms]:列举使用的 realm。
- kdc:代表要 kdc 的位置。格式是 机器:端口
- admin_server:代表 admin 的位置。格式是 机器:端口
- default_domain:代表默认的域名
- [appdefaults]:可以设定一些针对特定应用的配置,覆盖默认配置。
修改 /var/kerberos/krb5kdc/kdc.conf ,该文件包含 Kerberos 的配置信息。例如,KDC 的位置,Kerbero 的 admin 的realms 等。需要所有使用的 Kerberos 的机器上的配置文件都同步。这里仅列举需要的基本配置。详细参考:http://web.mit.edu/~kerberos/krb5-devel/doc/admin/conf_files/krb5_conf.html
$ cat /var/kerberos/krb5kdc/kdc.conf
[kdcdefaults]
v4_mode = nopreauth
kdc_ports = 88
kdc_tcp_ports = 88
[realms]
HADOOP.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 = des3-hmac-sha1:normal arcfour-hmac:normal des-hmac-sha1:normal des-cbc-md5:normal des-cbc-crc:normal des-cbc-crc:v4 des-cbc-crc:afs3
max_life = 24h
max_renewable_life = 10d
default_principal_flags = +renewable, +forwardable
}
说明:
- HADOOP.COM: 是设定的 realms。名字随意。Kerberos 可以支持多个 realms,会增加复杂度。大小写敏感,一般为了识别使用全部大写。这个 realms 跟机器的 host 没有大关系。
- master_key_type:和 supported_enctypes 默认使用 aes256-cts。由于,JAVA 使用 aes256-cts 验证方式需要安装额外的 jar 包(后面再做说明)。推荐不使用,并且删除 aes256-cts。
- acl_file:标注了 admin 的用户权限,需要用户自己创建。文件格式是:Kerberos_principal permissions [target_principal] [restrictions]
- supported_enctypes:支持的校验方式。
- admin_keytab:KDC 进行校验的 keytab。
关于AES-256加密:
对于使用 centos5. 6及以上的系统,默认使用 AES-256 来加密的。这就需要集群中的所有节点上安装 Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy File。
下载的文件是一个 zip 包,解开后,将里面的两个文件放到下面的目录中:$JAVA_HOME/jre/lib/security
为了能够不直接访问 KDC 控制台而从 Kerberos 数据库添加和删除主体,请对 Kerberos 管理服务器指示允许哪些主体执行哪些操作。通过编辑文件 /var/lib/kerberos/krb5kdc/kadm5.acl 完成此操作。ACL(访问控制列表)允许您精确指定特权。
$ cat /var/kerberos/krb5kdc/kadm5.acl
*/[email protected] *
3.2.4 同步配置文件
将 kdc 中的 /etc/krb5.conf 拷贝到集群中其他服务器即可。
$ scp /etc/krb5.conf hods-d01:/etc/krb5.conf
$ scp /etc/krb5.conf hods-d02/etc/krb5.conf
$ scp /etc/krb5.conf hods-d03:/etc/krb5.conf
请确认集群如果关闭了 selinux。
3.2.5 创建数据库
在 cdh1 上运行初始化数据库命令。其中 -r 指定对应 realm。
$ kdb5_util create -r HADOOP.COM -s
出现 Loading random data 的时候另开个终端执行点消耗CPU的命令如 cat /dev/sda > /dev/urandom 可以加快随机数采集。
该命令会在 /var/kerberos/krb5kdc/ 目录下创建 principal 数据库。
如果遇到数据库已经存在的提示,可以把 /var/kerberos/krb5kdc/ 目录下的 principal 的相关文件都删除掉。默认的数据库名字都是 principal。可以使用 -d 指定数据库名字。
3.2.6 启动服务
在 master 节点上运行:
$ chkconfig --level 35 krb5kdc on
$ chkconfig --level 35 kadmin on
$ service krb5kdc start
$ service kadmin start
3.2.7 创建 kerberos 管理员
关于 kerberos 的管理,可以使用 kadmin.local 或 kadmin,至于使用哪个,取决于账户和访问权限:
- 如果有访问 kdc 服务器的 root 权限,但是没有 kerberos admin 账户,使用 kadmin.local
- 如果没有访问 kdc 服务器的 root 权限,但是用 kerberos admin 账户,使用 kadmin
在 master 上创建远程管理的管理员:
#手动输入两次密码,这里密码为root
$ kadmin.local -q "addprinc root/admin"
# 也可以不用手动输入密码
$ echo -e "root\nroot" | kadmin.local -q "addprinc root/admin"
系统会提示输入密码,密码不能为空,且需妥善保存
3.2.8 Slave KDC配置
1 创建host keytab 文件
在master服务器上
[[email protected] ~]# kadmin
kadmin: addprinc -randkey host/kerberos.hadoop.com #添加principal
kadmin:ktadd host/kerberos.hadoop.com #生成keytab文件
在slave服务器上
[[email protected] ~]# kadmin
kadmin: addprinc -randkey host/kerberos2.hadoop.com #添加principal
kadmin: ktadd host/kerberos2.hadoop.com #生成keytab文件
2 将master上的几个文件拷贝到从服务器
文件: krb5.conf、kdc.conf、kadmin5.acl、master key stash file
[[email protected] ~]# scp /etc/krb5.conf kerberos2:/etc/.
[[email protected] ~]# cd /var/kerberos/krb5kdc
[[email protected] ~]# scp kdc.conf kadmin5.acl .k5.HADOOP.COM
Kerberos2:/var/kerberos/krb5kdc/.
3 在slave服务器上创建kpropd.acl文件
[[email protected] ~]# touch /var/kerberos/krb5kdc/kpropd.acl
添加如下内容:
host/[email protected] .COM
host/[email protected] .COM
4 在slave上启动kpropd服务
[[email protected] ~]# kpropd –S
至此,slave上的kdc服务还不能启动,因为无kdc的database数据
5 在master上将相关数据同步到slave上
[[email protected] ~]#kdb5_util dump /var/kerberos/krb5kdc/slave_datatrans
[[email protected] ~]#kprop -f /var/kerberos/krb5kdc/slave_db kerberos2.hadoop.com
成功后,会出现以下信息:
Database propagation to kerberos2.hadoop.com: SUCCEEDED
以上命令,可以封装成一个bash,定时运行,即定时更新slave上的database。
6 slave上/var/kerberos/krb5kdc/会多出一些文件,如:
from_master、principal、pricipal.kadm5、principal.kadmin5.lock、 principal.ok
至此,可以启动slave上的kdc服务
7 测试主从是否生效
1)从第三台服务器,使用kinit 获取ticket,正常情况下会从master上获取
2)关闭master上的kdc服务
3)再次从第三台服务器上,使用kinit 获取ticket,如果成功,说明生效。
也可以观察kdc的日志,在 /var/log/krb5kdc.log
3.2.9 测试 kerberos
查看当前的认证用户:
# 查看principals
$ kadmin: list_principals
# 添加一个新的principal
kadmin: addprinc test
WARNING: no policy specified for [email protected]; defaulting to no policy
Enter password for principal "[email protected]":
Re-enter password for principal "[email protected]":
Principal "[email protected]" created.
# 删除principal
kadmin: delprinc test
Are you sure you want to delete the principal "[email protected]"? (yes/no): yes
Principal "[email protected]" deleted.
Make sure that you have removed this principal from all ACLs before reusing.
kadmin: exit
也可以直接通过下面的命令来执行:
# 提示需要输入密码
$ kadmin -p root/admin -q "list_principals"
$ kadmin -p root/admin -q "addprinc test"
$ kadmin -p root/admin -q "delprinc test"
# 不用输入密码
$ kadmin.local -q "list_principals"
$ kadmin.local -q "addprinc test"
$ kadmin.local -q "delprinc test"
创建一个测试用户 test,密码设置为 test:
$ echo -e "test\ntest" | kadmin.local -q "addprinc test"
获取 test 用户的 ticket:
# 通过用户名和密码进行登录
$ kinit test
Password for [email protected]:
a$ klist -e
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: [email protected]
Valid starting Expires Service principal
11/07/14 15:29:02 11/08/14 15:29:02 krbtgt/[email protected]
renew until 11/17/14 15:29:02, Etype (skey, tkt): AES-128 CTS mode with 96-bit SHA-1 HMAC, AES-128 CTS mode with 96-bit SHA-1 HMAC
Kerberos 4 ticket cache: /tmp/tkt0
klist: You have no tickets cached
销毁该 test 用户的 ticket:
$ kdestroy
$ klist
klist: No credentials cache found (ticket cache FILE:/tmp/krb5cc_0)
Kerberos 4 ticket cache: /tmp/tkt0
klist: You have no tickets cached
更新 ticket:
$ kinit root/admin
Password for root/[email protected]:
$ klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: root/[email protected]
Valid starting Expires Service principal
11/07/14 15:33:57 11/08/14 15:33:57 krbtgt/[email protected]
renew until 11/17/14 15:33:57
Kerberos 4 ticket cache: /tmp/tkt0
klist: You have no tickets cached
$ kinit -R
$ klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: root/[email protected]
Valid starting Expires Service principal
11/07/14 15:34:05 11/08/14 15:34:05 krbtgt/[email protected]
renew until 11/17/14 15:33:57
Kerberos 4 ticket cache: /tmp/tkt0
klist: You have no tickets cached
抽取密钥并将其储存在本地 keytab 文件 /etc/krb5.keytab 中。这个文件由超级用户拥有,所以您必须是 root 用户才能在 kadmin shell 中执行以下命令:
$ kadmin.local -q "ktadd kadmin/admin"
$ klist -k /etc/krb5.keytab
Keytab name: FILE:/etc/krb5.keytab
KVNO Principal
---- --------------------------------------------------------------------------
3 kadmin/[email protected]
3 kadmin/[email protected] .COM
3 kadmin/[email protected] .COM
3 kadmin/[email protected] .COM
3 kadmin/[email protected] .COM