@xtccc
2015-09-27T09:59:23.000000Z
字数 5015
阅读 7524
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的过程牵涉到两方面:
Configure HBase Authentication
令HBase的server/client与HDFS/ZooKeeper之间能够确认身份。
Congigure HBase Authorization
确立哪些资源可以被clieng使用。
这是前置要求。
为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了,所以这一步可以省略。
创建Keytab 文件
kadmin.local: xst -k zookeeper.keytab zookeeper/hadoop1.com@GUIZHOU.COM
现在,在hadoop1.com节点上产生了一个文件/root/zookeeper.keytab
。
配置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
编辑ZooKeeper的配置文件
把下列配置加入到ZooKeeper的配置文件/etc/zookeeper/conf/zoo.cfg
中
authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider
jaasLoginRenew=3600000
配置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";
};
配置java.env
文件
在ZooKeeper的配置目录中(/etc/zookeeper/conf
)创建一个名为java.env
的文件,其内容如下:
export JVMFLAGS="-Djava.security.auth.login.config=/etc/zookeeper/conf/jaas.conf"
完成其他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。
重启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.cfg11: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.COMValid 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
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本身是不需要选中该项的。(正确与否还需要来验证)
[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。