前面的文章介绍了《Kerberos原理--经典对话》、《Kerberos基本概念及原理汇总》、《基于ambari的Kerberos安装配置》、《Windows本地安装配置Kerberos客户端》,《Kerberos实战》,接下来再来聊聊基于Ambari
如何禁用Kerberos
,可不是在页面上点击禁用Kerberos
那么顺利噢,有的时候服务会启动失败啊~
一、思考
使用Ambari
启用Kerberos
过程中,都做了哪些操作?
- 生成
Principal
和Keytab
- 修改集群内各服务的配置
- 将
Zookeeper
上的某些服务的znode
进行sasl
权限控制。sasl
是Kerberos
特有的设置znode
的一种权限
但是在Ambari
页面上禁用Kerberos
的过程中,有的Zookeeper
的znode
节点的权限依旧被sasl
控制,所以禁用Kerberos
后,有的服务起不来,或者有告警出现。
二、禁用Kerberos
在Ambari
页面切换到Kerberos
管理界面,点击禁用Kerberos
按钮,如下图所示:
会弹出一个窗口,如下图所示:
我们点击”坚持继续“,Ambari
就会自动解除Kerberos
的控制,如下图所示:
过程中可能会出现“管理会话过期的提示”,如下图所示:
- 管理主体:填写你自定义创建的
Principal
。例如:admin/admin@EXAMPLE.COM
,也可以省略@EXAMPLE.COM
,可直接填写admin/admin
。 - 管理密码:填写自定义创建
Principal
时的密码。
这样禁用Kerberos
就已经算是成功了,不过返回服务面板,可能会出现告警。是的,因为Zookeeper
中有的znode
节点可能还在受sasl
的权限控制,所以有的服务中的组件就会启动失败。
比如hiveserver2
,就会报端口号10000
监听不到的告警异常。
所以我们需要修改znode
权限,将znode
的权限全部修改为world:anyone:cdrwa
模式。
三、修改znode权限
使用普通用户无法删除带有sasl
的znode
节点。我们可以启用Zookeeper
超级管理员模式来删除znode
节点。
1. md5加密超级管理员密码
设置Zookeeper
超级管理员权限,首先需要对超级管理员的密码进行md5
加密,现在设置超级管理员的密码是admin
,那么密码需要怎么加密呢?
export ZK_CLASSPATH=/etc/zookeeper/conf/:/usr/hdp/current/zookeeper-server/lib/*:/usr/hdp/current/zookeeper-server/*
java -cp $ZK_CLASSPATH org.apache.zookeeper.server.auth.DigestAuthenticationProvider super:admin
super:admin->super:xQJmxLMiHGwaqBvst5y6rkB6HQs=
由输出结果可见,admin
经过md5
加密,变成了xQJmxLMiHGwaqBvst5y6rkB6HQs=
2. 编辑zkServer.sh
代码语言:javascript复制vim /usr/hdp/2.6.4.0-91/zookeeper/bin/zkServer.sh
定位到文件的第135
行,将
"-Dzookeeper.DigestAuthenticationProvider.superDigest=super:xQJmxLMiHGwaqBvst5y6rkB6HQs="
粘贴到指定位置,如下图所示:
进入到Ambari Web UI
,重启该节点上的Zookeeper
服务。
注:如果需要取消Zookeeper
超级管理员,可将zkServer.sh
文件中新添的内容删除,并重启该节点上的Zookeeper
服务即可。
3. 删除znode节点或修改znode权限
首先确保该节点用户下无Principal
缓存认证,可以执行kdestroy
命令进行销毁,klist
命令进行查看。
/usr/hdp/2.6.4.0-91/zookeeper/bin/zkCli.sh
[zk: localhost:2181(CONNECTED) 17] addauth digest super:admin
我们可以使用getAcl
命令来查看每个znode
节点的权限。
由于随着服务个数的增多,znode
的个数也会增多,所以还是建议根据服务的异常(启动失败或异常告警)来查看对应服务的znode
节点的权限,如果是sasl
权限的话,我们可以使用Zookeeper
超级管理员的身份对znode
做点事情了,好让服务变得正常。
这里我们有两种方式,这两种方式各有利弊:
方式一
可以使用setAcl /xxx world:anyone:cdrwa
命令来重新设置znode
权限,去除sasl
模式。例如:修改hiveserver2的权限为cdrwa
setAcl /hiveserver2 world:anyone:cdrwa
弊端:设置znode
权限并不影响该节点的子znode
的权限。换句话说,设置一个节点的权限,并不影响该节点的子节点的权限。所以我们需要一个一个的去setAcl
,会比较麻烦,但是这样不会丢失znode
注册的信息数据。
方式二
简单粗暴的,将有sasl
的znode
节点全部删除,然后重启对应的服务,它会自动的在Zookeeper
集群上注册znode
信息。执行rmr <path>
命令,例如:删除hiveserver2
rmr /hiveserver2
有时候会提示由于子znode
存在,该znode
无法被删除。我们可以先删除子znode
后,再删除父znode
。
弊端:这样会导致一些信息的丢失。
很抱歉,目前还没有找到更好的处理方式。
值得一提的是,Zookeeper
中的znode
节点如果在启用Kerberos
之前就已经被注册,那么在启用Kerberos
之后就不会被重新注册,所以权限也不会被改变,依旧使用的是启用Kerberos
之前的权限(cdrwa
)。如果需要更改为sasl权限,可以将自己使用setAcl
命令设置,或删除znode
节点后,重启对应服务。
四、总结
使用Ambari
禁用Kerberos
,不像CDH产品
一样,可以进行服务的Zookeeper初始化
。在禁用Kerberos
后,我们需要手动修改部分znode
的权限,这样某些服务在禁用Kereros
服务之后才可以正常使用。
当然我们也可以先停止所有服务,然后删除所有znode
,然后再启动禁用kerberos
流程。只不过这样有些信息会被丢失。比如ResourceManager
的Applications
历史数据会被清空;由于Solr
的配置文件会在Zookeeper
上储存,所以也会丢失。个中利弊,自个儿权衡吧