很多企业CDH是没有集成kerberos,原因是kerberos部署后,服务使用起来变复杂,大部分只配置了sentry做权限管理;但真正的CDH多租户应该是 身份验证 + 权限管理。也就是(kerberos + sentry)
接下来,我会图文介绍怎么安装这两个服务;
在实施方案前,假设
CDH已经运行正常;
-
之前安装了sentry服务先停掉
正确的顺序应该是先kerberos然后sentry; 避免发生一些奇怪的错误
服务器root用户
注意点
- 首先centos5.6以上的系统,必须要替换几个文件 (每个节点都要)
1.下载 Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy File
2.下载文件是个zip包,解开后,将里面的两个文件放到下面的目录中:$JAVA_HOME/jre/lib/security
安装KDC和配置服务
- KDC服务端
##执行命令
yum -y install krb5-server krb5-libs krb5-auth-dialog1 krb5-workstation
- 修改/etc/krb5.conf配置
vi /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 = W.COM
dns_lookup_realm = false
dns_lookup_kdc = false
ticket_lifetime = 24h
renew_lifetime = 7d
forwardable = true
#注意的是node1是你kdc服务的主机host
#作用域一般一个集群配一个足矣
[realms]
W.COM = {
kdc = node1
admin_server = node1
}
[domain_realm]
.node1 = W.COM
node1 = W.COM
- 修改/var/kerberos/krb5kdc/kadm5.acl配置
vi /var/kerberos/krb5kdc/kadm5.acl
#/admin结尾的都是带有管理权限的principal
*/[email protected] *
- 修改/var/kerberos/krb5kdc/kdc.conf配置
#修改kdc.conf
vi /var/kerberos/krb5kdc/kdc.conf
[kdcdefaults]
kdc_ports = 88
kdc_tcp_ports = 88
[realms]
W.COM = {
#master_key_type = aes256-cts
max_renewable_life= 7d 0h 0m 0s
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
}
- 创建Kerberos数据库
kdb5_util create –r W.COM -s
# 密码默认为KERBEROS
- 创建Kerberos的管理账号
kadmin.local
#然后输入
addprinc admin/[email protected]
#管理员密码为:kerberos
#提示 created关键字之后,输入 exit退出
exit
- 将Kerberos服务添加到自启动服务,并启动krb5kdc和kadmin服务
chkconfig krb5kdc on
chkconfig kadmin on
service krb5kdc start
service kadmin start
- 参加一句,假如上述步骤做错了,配置文件配错了,不要犹豫;重新从头开始操作一次 (重头操作之前先把数据库删了 /var/kerberos/krb5kdc/下面的pricinpal文件和keytab文件)
- 测试kerberos管理员账号
kinit admin/[email protected]
#然后输入上两步设置的密码
klist
#显示类似下面东西表示正常
[root@node1 krb5kdc]# klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: admin/[email protected]
Valid starting Expires Service principal
05/31/18 17:14:34 06/01/18 17:14:34 krbtgt/[email protected]
renew until 06/07/18 17:14:34
- 其他子节点安装Kerberos客户端( 每个子节点都要 )
yum -y install krb5-libs krb5-workstation
- 在Cloudera Manager Server服务器上安装额外的包
#在kdc服务所在的机器
yum -y install openldap-clients
- 将KDC Server上的krb5.conf文件拷贝到所有Kerberos客户端
scp -r /etc/krb5.conf root@slave1:/etc/
scp -r /etc/krb5.conf root@slave2:/etc/
scp -r /etc/krb5.conf root@slave3:/etc/
- 以上就是配置KDC服务端和客户端步奏,下一步是CDH集成KDC
CDH启用Kerberos
#在KDC中给Cloudera Manager添加管理员账号
#在KDC服务所在的机器操作
kadmin.local
addprinc cloudera-scm/[email protected]
#密码:kerberos
创建完成后输入 exit 退出
exit
-
进入Cloudera Manager的“管理”-> “安全”界面
-
继续
-
继续
-
继续,node1为安装KDC服务所在的机器host
-
继续
-
必须是刚才创建的Kerbers管理员账号,必须和之前创建的账号一致,继续
-
继续
-
继续,每台机器每个服务都会生成唯一一个principal
-
继续
-
等待集群重启成功,点击“继续”
- 至此已成功启用Kerberos。
- 启动过程后,impala daemon或者kudu报以下错
(SASL(-4): no mechanism available: No worthy mechs found)
在报错节点执行以下命令
yum install cyrus-sasl-plain cyrus-sasl-devel cyrus-sasl-gssapi
- 一定要保证服务所在节点安装kerberos客户端,服务启动需要用到kinit
验证
- 登录KDC服务所在的机器
#执行
kadmin.local
#输入后回车
listprincs
#这时候会看到
kadmin.local: listprincs
HTTP/[email protected]
HTTP/[email protected]
HTTP/[email protected]
HTTP/[email protected]
K/[email protected]
admin/[email protected]
cloudera-scm/[email protected]
[email protected]
hbase/[email protected]
hbase/[email protected]
hbase/[email protected]
hbase/[email protected]
hdfs/[email protected]
hdfs/[email protected]
hdfs/[email protected]
hdfs/[email protected]
hive/[email protected]
hue/[email protected]
impala/[email protected]
impala/[email protected]
impala/[email protected]
impala/[email protected]
kadmin/[email protected]
kadmin/[email protected]
kadmin/[email protected]
kafka/[email protected]
kafka/[email protected]
kafka/[email protected]
kafka_mirror_maker/[email protected]
krbtgt/[email protected]
kudu/[email protected]
kudu/[email protected]
kudu/[email protected]
kudu/[email protected]
[email protected]
mapred/[email protected]
oozie/[email protected]
sentry/bi-mast
#上述principal是CDH集成kerberos生成的
- 访问服务(任意一个安装了kerberos客户端的节点)
之前我们没集成kerberos时候,访问hdfs操作如下
#通过切换hdfs用户达到具备访问hdfs目录权限
[root@bi-bdap-ue-001 ~]# su hdfs
[hdfs@bi-bdap-ue-001 root]$ hadoop fs -ls /user/hive/warehouse
Found 3 items
drwxrwx--x+ - hive hive 0 2018-04-20 14:09 /user/hive/warehouse/dm_wms.db
drwxrwx--x+ - hive hive 0 2018-03-15 17:13 /user/hive/warehouse/dw
drwxrwx--x+ - hive hive 0 2018-03-14 15:42 /user/hive/warehouse/wms.db
[hdfs@bi-bdap-ue-001 root]$ hadoop fs -ls /user/hive/warehouse/dw
Found 2 items
drwxrwx--x+ - hive hive 0 2018-05-25 17:37 /user/hive/warehouse/dw/dw_wms.db
drwxrwx--x+ - hive hive 0 2018-04-09 13:57 /user/hive/warehouse/dw/dw_wms_tmp.db
现在集成kerberos后,通过切换用户访问服务方式走不通
#就算切换成hdfs用户后依然没有权限访问hdfs
[root@node1 ~]# su hdfs
bash-4.1$ klist
klist: No credentials cache found (ticket cache FILE:/tmp/krb5cc_496)
bash-4.1$ hadoop fs -ls /user
18/06/07 00:55:31 WARN security.UserGroupInformation: PriviledgedActionException as:hdfs (auth:KERBEROS) cause:javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: No valid credentials provided (Mechanism level: Failed to find any Kerberos tgt)]
18/06/07 00:55:31 WARN ipc.Client: Exception encountered while connecting to the server : javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: No valid credentials provided (Mechanism level: Failed to find any Kerberos tgt)]
18/06/07 00:55:31 WARN security.UserGroupInformation: PriviledgedActionException as:hdfs (auth:KERBEROS) cause:java.io.IOException: javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: No valid credentials provided (Mechanism level: Failed to find any Kerberos tgt)]
ls: Failed on local exception: java.io.IOException: javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: No valid credentials provided (Mechanism level: Failed to find any Kerberos tgt)]; Host Details : local host is: "node1/172.17.194.20"; destination host is: "node1":8020;
正确的方式是kinit 命令获得或更新 Kerberos 票据授权票据后访问服务
#现在服务只认票据
#而且相应的服务有相应的票据
[root@node1 1003-hdfs-NAMENODE]# kinit -kt hdfs.keytab hdfs/[email protected]
[root@node1 1003-hdfs-NAMENODE]# klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: hdfs/[email protected]
Valid starting Expires Service principal
06/07/18 01:00:55 06/08/18 01:00:55 krbtgt/[email protected]
renew until 06/12/18 01:00:55
[root@node1 1003-hdfs-NAMENODE]# hadoop fs -ls /user/hive/warehouse
Found 12 items
drwxrwx--x+ - hive hive 0 2018-05-24 19:01 /user/hive/warehouse/apache_sqoop_test
drwxrwx--x+ - hive hive 0 2018-06-06 15:13 /user/hive/warehouse/bi.db
drwxrwx--x+ - hive hive 0 2018-05-17 16:41 /user/hive/warehouse/gms.db
drwxrwx--x+ - hive hive 0 2018-06-04 14:08 /user/hive/warehouse/gtp.db
drwxrwx--x+ - hive hive 0 2018-05-25 20:43 /user/hive/warehouse/gtp_data.db
drwxrwx--x+ - hive hive 0 2018-06-01 17:15 /user/hive/warehouse/gtp_dc.db
drwxrwx--x+ - hive hive 0 2018-06-04 08:32 /user/hive/warehouse/gtp_test.db
drwxrwx--x+ - hive hive 0 2018-05-31 15:33 /user/hive/warehouse/gtp_txt.db
drwxrwx--x+ - hive hive 0 2018-04-23 17:46 /user/hive/warehouse/kudu_raw.db
drwxrwx--x+ - hive hive 0 2018-04-23 17:58 /user/hive/warehouse/kudu_test.db
drwxrwx--x+ - hive hive 0 2018-04-26 17:37 /user/hive/warehouse/kudu_vip.db
drwxrwx--x+ - hive hive 0 2018-04-20 10:51 /user/hive/warehouse/user_info
- 出现以上结果说明CDH服务集成Kerberos成功
- 下面是介绍基于集成kerberos的CDH怎么安装Sentry
https://www.jianshu.com/writer#/notebooks/23568743/notes/29144492/preview
接下来,我会图文介绍怎么安装配置Kerberos高可用
首先明确一点,kerberos没有自带选举算法,账号数据需要自己手动写脚本定时从主节点dump到从节点
方案实施前,假设集群kerberos满足以下条件
1). 主kdc服务正常,kadmin正常
2). root操作用户
2). crontab调度工具可用正常备节点安装Kerberos服务
yum -y install krb5-server krb5-libs krb5-auth-dialog krb5-workstation
注意:此处只安装服务,暂不做相应配置及启动服务。
-
主节点操作
- 修改/etc/krb5.conf配置文件,在realms下增加从Kerberos的配置
vi /etc/krb5.conf
- .将修改后的/etc/krb5.conf文件同步到集群的所有Kerberos客户端节点
scp /etc/krb5.conf root@slave1:/etc/
scp /etc/krb5.conf root@slave2:/etc/
scp /etc/krb5.conf root@slave3:/etc/
- 重启主节点的kdc服务
service krb5kdc restart
service kadmin restart
- 创建主从同步账号,并为账号生成keytab文件
kadmin.local
kadmin.local: addprinc -randkey host/node1
kadmin.local: addprinc -randkey host/slave1
kadmin.local:
kadmin.local: ktadd host/node1
kadmin.local: ktadd host/slave1
随机生成秘钥创建同步账号,并使用ktadd命令生成账号的keytab文件,文件默认生成在/etc/krb5.keytab下,多个账号则在krb5.keytab基础上追加
- 复制以下文件到从Kerberos服务器相应目录
scp /etc/krb5.conf root@slave1:/etc/
scp /etc/krb5.keytab root@slave1:/etc/
scp /var/kerberos/krb5kdc/.k5.W.COM root@slave1:/var/kerberos/krb5kdc/
scp /var/kerberos/krb5kdc/kadm5.acl root@slave1:/var/kerberos/krb5kdc/
scp /var/kerberos/krb5kdc/kdc.conf root@slave1: /var/kerberos/krb5kdc/
-
从节点操作
- 在/var/kerberos/krb5kdc/kpropd.acl配置文件中添加对应账户
[root@slave1 krb5kdc]# vi /var/kerberos/krb5kdc/kpropd.acl
host/[email protected]
host/[email protected]
:wq
- 从节点启动kpropd
kpropd –S
备节点上已经准备好数据传输
-
主节点操作
kdb5_util dump /var/kerberos/krb5kdc/master.dump
导出成功后生成master.dump和master.dump.dump_ok两个文件。
- 使用kprop命令将master.dump文件同步至从节点
kprop -f /var/kerberos/krb5kdc/master.dump -d -P 754 slave1
32768 bytes sent.
44358 bytes sent.
Database propagation to slave1: SUCCEEDED
-
从节点操作
- 查看dump过来的账号数据
[root@slave1 krb5kdc]# cd /var/kerberos/krb5kdc/
[root@slave1 krb5kdc]# ll
total 104
-rw------- 1 root root 44358 Jun 15 16:19 from_master
-rw------- 1 root root 22 Jun 14 12:10 kadm5.acl
-rw------- 1 root root 439 Jun 14 12:11 kdc.conf
-rw-r--r-- 1 root root 54 Jun 14 12:15 kpropd.acl
-rw------- 1 root root 40960 Jun 15 16:19 principal
-rw------- 1 root root 8192 Jun 15 16:19 principal.kadm5
-rw------- 1 root root 0 Jun 15 09:36 principal.kadm5.lock
-rw------- 1 root root 0 Jun 15 16:19 principal.ok
- 启动从节点
service krb5kdc start
#不用启动kadmin
- 这时候要是从节点KDC能正常启动,就没问题
-
KDC服务高可用验证
-
停掉主KDC,停掉从KDC
service krb5kdc stop
#可用不停kadmin,不影响验证
-
验证服务
hdfs挂掉
-
重启从节点KDC服务后, 验证 (service krb5kdc start)
-
注意服务使用前, 账号要重新kinit一次
hdfs服务正常
impala-shell服务正常
impala-jdbc正常,注意krb5.conf文件要及时更新
-
账号数据同步脚本
- 考虑到主节点新增的principal需要同步到从节点上,需要一个脚本定时同步数据过去
vi /var/kerberos/krb5kdc/kprop_sync.sh
#!/bin/bash
source /etc/profile
echo "开始dump数据库文件"
DUMP=/var/kerberos/krb5kdc/master.dump
PORT=754
SLAVE="slave1"
TIMESTAMP=`date`
echo "Start at $TIMESTAMP"
kdb5_util dump $DUMP
kprop -f $DUMP -d -P $PORT $SLAVE
:wq
- 定时任务
crontab -e
#每分钟同步一次
* * * * * sh /var/kerberos/krb5kdc/kprop_sync.sh > /var/kerberos/krb5kdc/lastupdate
:wq
-
完成后,会发现日志每分钟都在更新
到此,KDC主从配置完成!