集群启用Kerberos后对Zookeeper的Znode操作异常分析

温馨提示:要看高清无码套图,请使用手机打开并单击图片放大查看。

Fayson的github:https://github.com/fayson/cdhproject

提示:代码块部分可以左右滑动查看噢

1.问题描述


在CDH集群中Zookeeper已启用Kerberos服务,在命令行为使用Kerberos账号进行Kinit操作,使用zookeeper-client登录后仍然可以进行创建znode和删除znode,并且可以删除其它有服务的Znode,具体操作如下:

[root@ip-172-31-30-69 ~]# klist
klist: No credentials cache found (filename: /tmp/krb5cc_0)
[root@ip-172-31-30-69 ~]# echo $CLIENT_JVMFLAGS
[root@ip-172-31-30-69 ~]# zookeeper-client -server ip-172-31-16-68.ap-southeast-1.compute.internal

(可左右滑动)

Zookeeper-client连接成功

在Zookeeper-client命令行执行命令创建、浏览、查看及删除znode操作

create /zk-test-anyone data
ls /zk-test-anyone
getAcl /zk-test-anyone
rmr /zk-test-anyone
ls /

(可左右滑动)

2.Zookeeper的ACL权限说明


ZooKeeper使用ACL来控制对znodes(ZooKeeper数据树的数据节点)的访问。ACL权限如下:

CREATE:可以创建子节点(c)。

READ:可以获取该节点的数据,也可以读取该节点所有的子节点数据(r)。

WRITE:可以写数据到该节点(w)。

DELETE:可以删除子节点(d)。

ADMIN:可以在该节点中设置权限(a)。

Zookeeper的內建ACL Schema有如下:

world:只有一个id即anyone,ACL权限设置方式即为(world:anyone)代表任何人,在ZK中把任何人都有权限访问的节点归属为world:anyone。

auth:不需要任何ID,只要是通过auth的用户都有权限。

digest:使用用户和密码的方式验证,采用username:BASE64(SHA1(password))的字符串作为节点ACL的ID(如:digest:hdfs-fcs:+yC2mfwpV9AJntm8TYfc7+e4EUg=)。

ip:使用客户端的IP地址作为ACL的ID,可以设置为一个IP段(如:ip:192.168.0.1/8)

sasl:设置为用户的uid,通过sasl Authentication用户的ID,在zk3.4.4版本后sasl是通过Kerberos实现(即只有通过Kerberos认证的用户才可以访问权限的znode),使用sasl:uid:cdwra字符串作为节点ACL的ID(如:sasl:fayson:cdwra)。

3.ACL权限控制测试


这里以world和sasl两种方式来实现znode的ACL权限控制来说明前面的问题。

1. 在不使用Kerberos账号Kinit的前提下,直接使用Zookeeper-client访问Zookeeper

[root@ip-172-31-30-69 ~]# klist
klist: No credentials cache found (filename: /tmp/krb5cc_0)
[root@ip-172-31-30-69 ~]# echo $CLIENT_JVMFLAGS
[root@ip-172-31-30-69 ~]# zookeeper-client -server ip-172-31-16-68.ap-southeast-1.compute.internal

(可左右滑动)

创建一个/zktest-world的zonde,并设置ACL权限为world:anyone:cdrwa,操作如下:

create /zktest-world data world:anyone:cdwra
ls /
ls /zktest-world
getAcl /zktest-world
rmr /zktest-world
ls /

(可左右滑动)

2.不使用Kerberos账号Kinit的前提下,使用zookeeper-client登录Zookeeper服务

[root@ip-172-31-30-69 ~]# klist
klist: No credentials cache found (filename: /tmp/krb5cc_0)
[root@ip-172-31-30-69 ~]# echo $CLIENT_JVMFLAGS
[root@ip-172-31-30-69 ~]# zookeeper-client -server ip-172-31-16-68.ap-southeast-1.compute.internal

(可左右滑动)

创建一个/zktest-sasl的zonde,并设置ACL权限为sasl:fayson:cdrwa,操作如下:

create /zktest-sasl data sasl:fayson:cdrwa
ls /zktest-sasl
rmr /zktest-sasl
getAcl /zktest-sasl

(可左右滑动)

可以看到设置ACL为fayson用户后无法正常访问与删除/zktest-sasl,接下来使用jaas.conf文件进行认证登录Zookeeper

zk-cli-jaas.conf文件的内容如下,由于我们创建的/zktest-sasl指定的用户为fayson,所以这里我们使用fayson的keytab用户加载:

[root@ip-172-31-30-69 ~]# vim zk-cli-jaas.conf 
Client {
   com.sun.security.auth.module.Krb5LoginModule required
   useKeyTab=true
   keyTab="/root/fayson.keytab"
   storeKey=true
   useTicketCache=false
   principal="fayson@FAYSON.COM";
};

(可左右滑动)

加载zk-cli-jaas.conf文件到CLIENT_JVMFLAGS环境变量,然后再使用zookeeper-client访问ZK服务:

[root@ip-172-31-30-69 ~]# export CLIENT_JVMFLAGS="-Djava.security.auth.login.config=/root/zk-cli-jaas.conf"
[root@ip-172-31-30-69 ~]# zookeeper-client -server ip-172-31-16-68.ap-southeast-1.compute.internal

(可左右滑动)

查看和删除/zktest-sasl

ls /zktest-sasl
rmr /zktest-sasl
ls /

(可左右滑动)

4.CDH中依赖ZK服务的Znode ACL权限问题


在启用Kerberos前,各服务已向Zookeeper服务注册,所以这些Znode默认是没有使用ACL权限控制的,在集群启用Kerberos后,由于Znode节点已在Zookeeper服务中存在,所以依赖ZK服务的各个组件并未重新向ZK服务注册,导致已存在ZK服务的Znode无ACL权限控制,导致前面提到的问题。

解决方法:登录Zookeeper服务将无ACL的Znode删除并重启相应服务即可,部分服务如HBase、Solr需要做一些操作才可以是起Znode启用ACL权限控制。

配置Solr和HBase服务重新创建带有ACL权限的Znode

  • 通过zookeeper-client登录ZK删除/solr和/hbase的Znode
  • 登录CM进入HBase服务修改HBase配置,启用Kerberos认证
  • 进入Solr服务,停止Solr服务并初始化ZK

完成如上操作后,重启HBase和Solr服务即可,查看Zookeeper的中/solr和/hbase的ACL权限

5.问题总结


  • Zookeeper服务针对所有用户均可以访问,但对应的Znode需要有相应权限的用户才可访问或操作。
  • 如果需要自己的Znode带有ACL权限则在创建Znode时需要指定对应的访问权限,在CDH中各个服务如果启用了Kerberos则需要服务支持向ZK创建带有ACL权限的Znode。
  • 在启用Kerberos环境下的ZooKeeper,如果需要删除服务(如:hive、hbase、hdfs等)注册信息时,需要先获取到该目录的ACL权限,根据ACL权限使用不同服务的keytab文件kinit后进行删除,否则会报“Authentication is not valid”问题。

提示:代码块部分可以左右滑动查看噢

为天地立心,为生民立命,为往圣继绝学,为万世开太平。 温馨提示:要看高清无码套图,请使用手机打开并单击图片放大查看。

推荐关注Hadoop实操,第一时间,分享更多Hadoop干货,欢迎转发和分享。

原文发布于微信公众号 - Hadoop实操(gh_c4c535955d0f)

原文发表时间:2018-04-16

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java帮帮-微信公众号-技术文章全总结

Quartz数据库表分析【面试+工作】

共11张表,前6张都是关于各种triggers的信息,后面包括job,悲观锁,调度状态等信息;相关表操作在类StdJDBCDelegate中,相关sql语句在S...

23040
来自专栏Laoqi's Linux运维专列

配置zabbix架构

43470
来自专栏pangguoming

mysql双机热备的实现

转:http://blog.csdn.net/qq394829044/article/details/53203645

30510
来自专栏文渊之博

SQLServer中的死锁的介绍

简介 什么是死锁?      我认为,死锁是由于两个对象在拥有一份资源的情况下申请另一份资源,而另一份资源恰好又是这两对象正持有的,导致两对象无法完成操作,且...

25850
来自专栏数据和云

impdp create index parallel-数据泵并行创建索引

题记:在数据泵导入时默认情况下创建索引是不使用并行的,所以这一步会消耗较长的时间,除了人工写脚本并行创建索引外,数据泵在导入时也可以并行创建索引,本文详细介绍了...

55640
来自专栏Linux运维学习之路

MySQL日志管理

MySQL日志管理 错误日志 配置方法: vim /etc/my.cnf [mysqld] log-error=/tmp/mysql.log 查看配置方式: s...

490120
来自专栏散尽浮华

Oracle日常运维操作总结-数据库的启动和关闭

下面是工作中对Oracle日常管理操作的一些总结,都是一些基本的oracle操作和SQL语句写法,在此梳理成手册,希望能帮助到初学者(如有梳理不准确之处,希望指...

39150
来自专栏公众号_薛勤的博客

CentOS 6.5下RPM方式(重新)安装MySQL 5.7.21从头到尾篇

ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables ...

11120
来自专栏散尽浮华

Mysql主从同步(1)-主从/主主环境部署梳理

Mysql复制概念说明 Mysql内建的复制功能是构建大型,高性能应用程序的基础。将Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一...

39250
来自专栏醉梦轩

Ubuntu 16.04 部署MySQL服务

MySQL是一款开源的关系型数据库管理系统,大量公司都在使用它,或是在它的基础上做二次开发。有时,我们会需要在Linux系统上部署MySQL服务用于测试。

19720

扫码关注云+社区

领取腾讯云代金券