如何基于Ambari禁用Kerberos

2019-01-23 10:31:01 浏览数 (1)

前面的文章介绍了《Kerberos原理--经典对话》、《Kerberos基本概念及原理汇总》、《基于ambari的Kerberos安装配置》、《Windows本地安装配置Kerberos客户端》,《Kerberos实战》,接下来再来聊聊基于Ambari如何禁用Kerberos,可不是在页面上点击禁用Kerberos那么顺利噢,有的时候服务会启动失败啊~

一、思考

使用Ambari启用Kerberos过程中,都做了哪些操作?

  • 生成PrincipalKeytab
  • 修改集群内各服务的配置
  • Zookeeper上的某些服务的znode进行sasl权限控制。saslKerberos特有的设置znode的一种权限

但是在Ambari页面上禁用Kerberos的过程中,有的Zookeeperznode节点的权限依旧被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权限

使用普通用户无法删除带有saslznode节点。我们可以启用Zookeeper超级管理员模式来删除znode节点。

1. md5加密超级管理员密码

设置Zookeeper超级管理员权限,首先需要对超级管理员的密码进行md5加密,现在设置超级管理员的密码是admin,那么密码需要怎么加密呢?

代码语言:javascript复制
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行,将

代码语言:javascript复制
"-Dzookeeper.DigestAuthenticationProvider.superDigest=super:xQJmxLMiHGwaqBvst5y6rkB6HQs="

粘贴到指定位置,如下图所示:

进入到Ambari Web UI,重启该节点上的Zookeeper服务。

注:如果需要取消Zookeeper超级管理员,可将zkServer.sh文件中新添的内容删除,并重启该节点上的Zookeeper服务即可。

3. 删除znode节点或修改znode权限

首先确保该节点用户下无Principal缓存认证,可以执行kdestroy命令进行销毁,klist命令进行查看。

代码语言:javascript复制
/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

代码语言:javascript复制
setAcl /hiveserver2 world:anyone:cdrwa

弊端:设置znode权限并不影响该节点的子znode的权限。换句话说,设置一个节点的权限,并不影响该节点的子节点的权限。所以我们需要一个一个的去setAcl,会比较麻烦,但是这样不会丢失znode注册的信息数据。

方式二

简单粗暴的,将有saslznode节点全部删除,然后重启对应的服务,它会自动的在Zookeeper集群上注册znode信息。执行rmr <path>命令,例如:删除hiveserver2

代码语言:javascript复制
rmr /hiveserver2

有时候会提示由于子znode存在,该znode无法被删除。我们可以先删除子znode后,再删除父znode

弊端:这样会导致一些信息的丢失。

很抱歉,目前还没有找到更好的处理方式。

值得一提的是,Zookeeper中的znode节点如果在启用Kerberos之前就已经被注册,那么在启用Kerberos之后就不会被重新注册,所以权限也不会被改变,依旧使用的是启用Kerberos之前的权限(cdrwa)。如果需要更改为sasl权限,可以将自己使用setAcl命令设置,或删除znode节点后,重启对应服务。

四、总结

使用Ambari禁用Kerberos,不像CDH产品一样,可以进行服务的Zookeeper初始化。在禁用Kerberos后,我们需要手动修改部分znode的权限,这样某些服务在禁用Kereros服务之后才可以正常使用。

当然我们也可以先停止所有服务,然后删除所有znode,然后再启动禁用kerberos流程。只不过这样有些信息会被丢失。比如ResourceManagerApplications历史数据会被清空;由于Solr的配置文件会在Zookeeper上储存,所以也会丢失。个中利弊,自个儿权衡吧

0 人点赞