本文主要关于Kerberos的简单应用。因为工作测试需要,自己装了一套集群进行了Kerberos的部署,并且与HDFS、ZK进行整合,然后将操作过程进行了整理,以便后续再查看。本文主要涉及到其与ZK的整合操做,此文为2018-06-28文章Kerberos具体实践2的后续。
Zookeeper整合Kerberos
关于zookeeper上配置Kerberos,参考zookeeper配置Kerberos认证。
Zookeeper Server配置
若hdfs配置过程中需要配置zookeeper与Kerberos结合,则目前先需要配置server即可。
创建认证规则并生成keytab(zookeeper-server)
zk整合Kerberos需要先创建启动zk用户的认证规则以及keytab,由于本次操作中,zk和hadoop均使用hadoop用户启动,则在本次操作中,不必再需要去创建新的认证规则和keytab,直接使用原来的hdfs.keytab即可。
补充:
若有创建需要(如需要使用zookeeper用户启动zk服务),可再继续再次参考下述操作(其实同hdfs的操作)。
在node1节点,即KDC server节点上执行下面命令,在KCD server上(这里是 node1)创建zookeeper principal:
kadmin.local -q "addprinc -randkey zookeeper/node1@HADOOP.COM"
kadmin.local -q "addprinc -randkey zookeeper/node2@HADOOP.COM"
kadmin.local -q "addprinc -randkey zookeeper/node3@HADOOP.COM"
执行如下命令,在当前目录中创建keytab,名为zookeeper.keytab:
kadmin.local -q "xst -k zookeeper.keytab zookeeper/node1@HADOOP.COM "
kadmin.local -q "xst -k zookeeper.keytab zookeeper/node2@HADOOP.COM "
kadmin.local -q "xst -k zookeeper.keytab zookeeper/node3@HADOOP.COM "
部署Keytab(zookeeper-server)
拷贝node1上生成的keytab(新创建的就是zookeeper.keytab)文件到其他节点的某一目录上(如/opt/zookeeper/conf,为了在zk配置文件种找到keytab),并为其设置属主和权限400(如chown zookeeper:hadoop zookeeper.keytab ;chmod 400 *.keytab),同HDFS配置过程中的操作。
此次测试中,启动zk和启动hdfs的用户都是hadoop,并且在进行hdfs配置kerberos的过程中,已经将hdfs.keytab复制到其他节点的/opt/hadoop_krb5/conf/hdfs.keytab目录下了,并且也设置了权限所以此次我不再进行操作。
修改zookeeper配置文件(zookeeper-server)
在node1节点上修改/opt/zookeeper-3.4.8/conf/(zookeeper安装目录下的conf)zoo.cfg文件,添加下面内容:
authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider
jaasLoginRenew=3600000
将修改的上面文件同步到其他节点:node2、node3:
$ scp /opt/zookeeper-3.4.8/conf/zoo.cfg node2:/opt/zookeeper-3.4.8/conf/zoo.cfg
$ scp /opt/zookeeper-3.4.8/conf/zoo.cfg node3:/opt/zookeeper-3.4.8/conf/zoo.cfg
创建jaas文件(zookeeper-server)
在node1的配置文件目录/opt/zookeeper-3.4.8/conf/(zookeeper安装目录下的conf)创建 jaas.conf文件,内容如下:
Server {
com.sun.security.auth.module.Krb5LoginModule required
useKeyTab=true
keyTab="/opt/hadoop_krb5/conf/hdfs.keytab"【上述操作创建出的keytab,因为本次操作中zk用hadoop用户启动的,和hdfs一样,则没用重新生产keytab,和hdfs的用一个】
storeKey=true
useTicketCache=false【这里有踩过的一个小坑:如果krb5.conf 去掉了default_ccache_name = KEYRING:persistent:%{uid},则一定用false,要不然zk起不来】
principal="hadoop/node1@HADOOP.COM";
};
其中,keytab填写真实的keytab的绝对路径,principal填写对应的认证的用户和机器名称。需要在 node2和node3节点也创建该文件,注意每个节点的principal有所不同。
创建java.env文件(zookeeper-server)
在node1的配置文件目录/opt/zookeeper-3.4.8/conf/(zookeeper安装目录下的conf)创建 java.env文件,内容如下:
export JVMFLAGS="-Djava.security.auth.login.config=/opt/zookeeper-3.4.8/conf/jaas.conf"
并将该文件同步到其他节点:
$ scp /opt/zookeeper-3.4.8/conf/java.env node2:/opt/zookeeper-3.4.8/conf/java.env
$ scp /opt/zookeeper-3.4.8/conf/java.env node3:/opt/zookeeper-3.4.8/conf/java.env
以上Zookeeper-server配置完毕。
重新启动zookeeper
启动方式和平常无异,如成功使用安全方式启动,日志中看到如下日志:
2017-09-18 10:23:30,067 … - successfully logged in.
Zookeeper Client配置(未测试)
创建认证规则生成keytab
在node1节点,即KDC server节点上执行下面命令:
$ cd /var/kerberos/krb5kdc/
kadmin.local -q "addprinc -randkey zkcli/node1@HADOOP.COM "
kadmin.local -q "addprinc -randkey zkcli/node2@HADOOP.COM"
kadmin.local -q "addprinc -randkey zkcli/node3@HADOOP.COM"
kadmin.local -q "xst -k zkcli.keytab zkcli/node1@HADOOP.COM"
kadmin.local -q "xst -k zkcli.keytab zkcli/node2@HADOOP.COM "
kadmin.local -q "xst -k zkcli.keytab zkcli/node3@HADOOP.COM "
拷贝 zkcli.keytab文件到其他节点的zk配置目录:
$ scp zkcli.keytab node1:/etc/zookeeper/conf
$ scp zkcli.keytab node2:/etc/zookeeper/conf
$ scp zkcli.keytab node3:/etc/zookeeper/conf
并设置属主和权限,分别在node1、node2、node3 上执行:
$ ssh node1 "cd /etc/zookeeper/conf/;chown zookeeper:hadoop zkcli.keytab ;chmod 400 *.keytab"
$ ssh node2 "cd /etc/zookeeper/conf/;chown zookeeper:hadoop zkcli.keytab ;chmod 400 *.keytab"
$ ssh node3 "cd /etc/zookeeper/conf/;chown zookeeper:hadoop zkcli.keytab ;chmod 400 *.keytab"
创建jaas配置文件
在node1的zk配置文件目录创建 client-jaas.conf 文件,内容如下:
Client {
com.sun.security.auth.module.Krb5LoginModule required
useKeyTab=true
keyTab="/etc/zookeeper/conf/zkcli.keytab"
storeKey=true
useTicketCache=false
principal="zkcli@HADOOP.COM";
};
同步到其他client节点:
$ scp client-jaas.conf node2:/etc/zookeeper/conf
$ scp client-jaas.conf node3:/etc/zookeeper/conf
创建java.env文件
然后,在zk安装目录conf目录创建或者修改java.env,内容如下:
export CLIENT_JVMFLAGS="-Djava.security.auth.login.config=/etc/zookeeper/conf/client-jaas.conf"
如果,zookeeper-client 和 zookeeper-server 安装在同一个节点上,则 java.env 中的 java.security.auth.login.config 参数会被覆盖,这一点从 zookeeper-client 命令启动日志可以看出来。
并将该文件同步到其他节点:
$ scp /etc/zookeeper/conf/java.env node2:/etc/zookeeper/conf/java.env
$ scp /etc/zookeeper/conf/java.env node3:/etc/zookeeper/conf/java.env
启动并验证
启动客户端:
$ zookeeper-client -server node1:2181
创建一个znode 节点:
k: node1:2181(CONNECTED) 0] create /znode1 sasl:zkcli@HADOOP.COM:cdwra
Created /znode1
验证该节点是否创建以及其 ACL:
[zk: node1:2181(CONNECTED) 1] getAcl /znode1
'world,'anyone
: cdrwa
以上为ZK整合Kerberos操作部分。
至此,本篇内容完成。
以上,此文章是关于ZK结合Kerberos的部署等内容,下篇将补充说明主从KDC的搭建。