简要说明Zookeeper对接Kerberos的过程,以及在Zookeeper中使用ACL功能的方案。
Kerberos认证
Zookeeper 支持SASL框架,能够支持Kerberos、DIGEST-MD5等认证机制。
下面简要说明,Cloudera给出Zoookeeper集成Kerberos的配置方法:
修改zoo.cfg
安装完成KDC后,修改 zoo.cfg 配置文件,修改添加以下内容:
1 2 3 4 5 6 7 8 9 10 11 12
| kerberos.removeHostFromPrincipal=true kerberos.removeRealmFromPrincipal=true
authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider
quorum.auth.kerberos.servicePrincipal=zookeeper/_HOST
quorum.auth.learnerRequireSasl=true quorum.auth.serverRequireSasl=true
|
创建Kerberos账号
为每个zookeeper节点创建对应的krb账号,账号名为zookeeper/_HOST。 导出keytab文件到各个节点目录。
创建jaas.conf文件
在ZK的配置文件目录创建,jaas.conf文件。在启动Zookeeper进程时指定环境变量,JVMFLAGS=”-Djava.security.auth.login.config=/etc/zookeeper/conf/jaas.conf”。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| Server { com.sun.security.auth.module.Krb5LoginModule required useKeyTab=true keyTab="zookeeper.keytab" #按照实际情况修改 storeKey=true useTicketCache=false principal="zookeeper/bdnode1@IDATA.RUIJIE.COM"; #按照实际情况修改 }; QuorumServer { com.sun.security.auth.module.Krb5LoginModule required useKeyTab=true keyTab="zookeeper.keytab" storeKey=true useTicketCache=false principal="zookeeper/bdnode1@IDATA.RUIJIE.COM"; }; QuorumLearner { com.sun.security.auth.module.Krb5LoginModule required useKeyTab=true keyTab="zookeeper.keytab" storeKey=true useTicketCache=false principal="zookeeper/bdnode1@IDATA.RUIJIE.COM"; };
|
Client连接ZK
客户端连接Zookeeper时,需要在/etc/zookeeper/conf目录下创建以下两个文件:
1 2 3 4 5 6 7 8 9 10 11
| # 创建jaas.conf
Client { com.sun.security.auth.module.Krb5LoginModule required ticketCache="/tmp/krb5cc_0" useTicketCache=true; };
# 创建java.env
export JVMFLAGS="-Djava.security.auth.login.config=/etc/zookeeper/conf/jaas.conf"
|
ZooKeeper Access Control
Zookeeper官方文档有针对ACLs章节的相关讨论,下面简单终结。
Zookeeper 的权限包括:CREATE、READ、WRITE、DELETE、ADMIN。
Zookeeper 的身份的认证方式:
认证方式 |
说明 |
world |
表示所有客户端都能够通过认证 |
auth |
表示任何经过身份验证的用户,当使用Kerberos时表示对应的principal账户通过认证 |
digest |
用户名/密码方式通过认证 |
host |
客户端主机名通过认证 |
ip |
客户端IP通过认证 |
常用的ACLs命令
1 2 3 4 5 6 7 8
| # 获取当前Node的权限信息 getAcl path
# 指定当前Node的权限,使用Kerberos时,参考下面的命令,表示给当前用户所有权限 setAcl /test auth::cdrwa
# 给任意用户只读权限 setAcl /test world:anyone:r
|
参考
Hardening Apache ZooKeeper Security: SASL Quorum Peer Mutual Authentication and Authorization
ZooKeeper and SASL
ZooKeeper Authentication
jaas.conf参数说明
ZooKeeperAccessControl