[关闭]
@xtccc 2015-09-27T09:59:23.000000Z 字数 5015 阅读 7578

HBase Authentication

给我写信
GitHub

此处输入图片的描述

Kerberos


参考
+ HBase Authentication
+ ZooKeeper Authentication
+ How-to: Enable User Authentication and Authorization in Apache HBase
+ What are HBase znodes?
+ Up and Running with Secure Zookeeper



在中,我们已经为CDH集群安装好了Kerberos服务,但是现在只能正常启动和运行HDFS、YARN与ZooKeeper,还无法启动HBase。所以,针对HBase,我们还需要配置HBase Authentication。

配置HBase Authentication的过程牵涉到两方面:

  1. Configure HBase Authentication
    令HBase的server/client与HDFS/ZooKeeper之间能够确认身份。

  2. Congigure HBase Authorization
    确立哪些资源可以被clieng使用。


ZooKeeper Authentication

这是前置要求。

  1. 为ZooKeeper Server创建一个principal(用kadmin.local工具)

    我们的集群有三个节点上运行着ZooKeeper Server(hadoop1.com, hadoop4.com和hadoop5.com),下面以hadoop1.com这个Server为例。

    [root@hadoop1 ~]# kadmin.local
    Authenticating as principal hbase/admin@GUIZHOU.COM with password.
    kadmin.local: addprinc -randkey zookeeper/hadoop1.com@GUIZHOU.COM

    实际上,我们在为CDH集群安装好Kerberos后,这三个ZooKeeper Server就已经存在相应的principals了,所以这一步可以省略。

  2. 创建Keytab 文件

    kadmin.local: xst -k zookeeper.keytab zookeeper/hadoop1.com@GUIZHOU.COM

    现在,在hadoop1.com节点上产生了一个文件/root/zookeeper.keytab

  3. 配置keytab文件
    将刚才生成的keytab文件放到ZooKeeper Server的配置目录下。如果CDH集群是通过Package形式安装的话,这个配置目录位于/etc/zookeeper/conf。该文件的owner设置为zookeeper,且只有owner有read权限。

    [root@hadoop1 ~]# ll /etc/zookeeper/conf/zookeeper.keytab
    -r-------- 1 zookeeper root 442 Sep 22 10:55 /etc/zookeeper/conf/zookeeper.keytab


  4. 编辑ZooKeeper的配置文件
    把下列配置加入到ZooKeeper的配置文件/etc/zookeeper/conf/zoo.cfg

    authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider
    jaasLoginRenew=3600000


  5. 配置Java Authentication and Authorization Service (JAAS)
    在ZooKeeper Server的配置目录中(/etc/zookeeper/conf)创建一个名为jass.conf的文件,其内容为:

    Server {
       com.sun.security.auth.module.Krb5LoginModule required
       useKeyTab=true
       keyTab="/etc/zookeeper/conf/zookeeper.keytab"
       storeKey=true
       useTicketCache=false
       principal="zookeeper/hadoop1.com@GUIZHOU.COM";
    };


  6. 配置java.env文件
    在ZooKeeper的配置目录中(/etc/zookeeper/conf)创建一个名为java.env的文件,其内容如下:

    export JVMFLAGS="-Djava.security.auth.login.config=/etc/zookeeper/conf/jaas.conf"


  7. 完成其他ZooKeeper Servers配置
    以上1~6的步骤,在其他的两个ZooKeeper Server上进行。其中,对于第2步,可以仍然在hadoop1.com节点上为创建keytab文件(hadoop1.com节点是我们的KDC和Kerberos Admin节点),新的keytab将覆盖已有的keytab(/root/zookeeper.keytab),然后将新生成的keytab放到相应的ZooKeeper Server的配置目录下。实际上,这些keytab文件的不同之处在于它们包含不同的ZK Server的hostname。


  8. 重启ZK,令以上配置生效
    重启后,发现所有的ZK server都启动失败。查看hadoop1.com这个节点的ZK日志,找到异常信息:

    11:39:19.251 AM INFO org.apache.zookeeper.server.quorum.QuorumPeerConfig
    Reading configuration from: /var/run/cloudera-scm-agent/process/1160-zookeeper-server/zoo.cfg

    11:39:19.286 AM INFO org.apache.zookeeper.server.DatadirCleanupManager
    Purge task completed.

    11:39:19.516 AM ERROR org.apache.zookeeper.server.quorum.QuorumPeerMain
    Unexpected exception, exiting abnormally
    java.io.IOException: Could not configure server because SASL configuration did not allow the ZooKeeper server to authenticate itself properly: javax.security.auth.login.LoginException: Checksum failed
    at org.apache.zookeeper.server.ServerCnxnFactory.configureSaslLogin(ServerCnxnFactory.java:207)
    at org.apache.zookeeper.server.NIOServerCnxnFactory.configure(NIOServerCnxnFactory.java:87)
    at org.apache.zookeeper.server.quorum.QuorumPeerMain.runFromConfig(QuorumPeerMain.java:135)
    at org.apache.zookeeper.server.quorum.QuorumPeerMain.initializeAndRun(QuorumPeerMain.java:116)
    at org.apache.zookeeper.server.quorum.QuorumPeerMain.main(QuorumPeerMain.java:79)

    可以看出,启动是hadoop1.com节点上的ZK server读取的配置文件是/var/run/cloudera-scm-agent/process/1160-zookeeper-server/zoo.cfg(这是Cloudera SCM Agent对集群进行管理的结果),其内容是:

    tickTime=2000
    initLimit=10
    syncLimit=5
    dataDir=/data/var/lib/zookeeper
    dataLogDir=/data/var/lib/zookeeper
    clientPort=2181
    maxClientCnxns=60
    minSessionTimeout=4000
    maxSessionTimeout=60000
    autopurge.purgeInterval=24
    autopurge.snapRetainCount=5
    server.1=hadoop4.com:3181:4181
    server.2=hadoop1.com:3181:4181
    server.3=hadoop5.com:3181:4181
    leaderServes=yes
    authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider
    kerberos.removeHostFromPrincipal=true
    kerberos.removeRealmFromPrincipal=true

    即使我在每一个ZooKeeper Server上能够成功获取到zookeeper的ticket,还是会报上述的错误。例如,

    [root@hadoop5 ~]# kinit -k -t /etc/zookeeper/conf/zookeeper.keytab zookeeper/hadoop5.com@GUIZHOU.COM

    [root@hadoop5 ~]# klist
    Ticket cache: FILE:/tmp/krb5cc_0
    Default principal: zookeeper/hadoop5.com@GUIZHOU.COM

    Valid starting               Expires                        Service principal
    09/22/15 14:54:48      09/23/15 14:54:48      krbtgt/GUIZHOU.COM@GUIZHOU.COM
                       renew until 09/29/15 14:54:48

  9. Cloudera Manager要不要配置?
    官方文档 中,只提到了上面几个配置步骤,那么在Cloudera Manager中需不需要 配置『enableSecurity』这一项呢?

    可能不需要!我们看看这一项勾选与否会影响什么配置?
    假设我之前已经勾选了这一项,现在去掉这一项,在Cloudera Manager中去除这一项后,点击『Save changes』。然后,回到Cloudera Manager主界面,这时可以看到,在左侧的Cluster中,ZooKeeper没有提示需要『Redeploy client configuration』,反而是HBase在提示『Redeploy client configuration』,如图所示

    点击之后,看看会改变哪些配置文件。从截图可以看出,改变的是HBase的配置文件,与ZooKeeper本身是无关的。

    所以,可以猜想,选项『enableSecurity』的作用是让其他组件(如HBase)可以使用Secure ZooKeeper,而配置Secure ZooKeeper本身是不需要选中该项的。(正确与否还需要来验证)


令ZK Client Shell 支持Kerberos Security

[root@hadoop1 conf]# locate zookeeper-client
/etc/alternatives/zookeeper-client
/opt/cloudera/parcels/CDH-5.3.2-1.cdh5.3.2.p0.10/bin/zookeeper-client
/usr/bin/zookeeper-client
/var/lib/alternatives/zookeeper-client

如果想让zookeeper-client支持Kerberos Authentication,那就为zkcli创建一个principal,之后就可以通过该principal实现zkcli向ZooKeeper Service发起的authentication。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注