ZooKeeper开源增强特性
日志增强
安全模式下,Ephemeral node(临时节点)在session过期之后就会被系统删除,在审计日志中添加Ephemeral node被删除的审计日志,以便了解当时Ephemeral node的状态信息。
所有ZooKeeper客户端的操作都要在审计日志中添加Username。
从ZooKeeper客户端创建znode,其kerberos principal是“zkcli/hadoop.<系统域名>@<系统域名>”。
例如打开日志<ZOO_LOG_DIR>/zookeeper_audit.log,内容如下:
2016-12-28 14:17:10,505 | INFO | CommitProcWorkThread-4 | session=0x12000007553b4903?user=10.177.223.78,zkcli/hadoop.hadoop.com@HADOOP.COM?ip=10.177.223.78?operation=create znode?target=ZooKeeperServer?znode=/test1?result=success 2016-12-28 14:17:10,530 | INFO | CommitProcWorkThread-4 | session=0x12000007553b4903?user=10.177.223.78,zkcli/hadoop.hadoop.com@HADOOP.COM?ip=10.177.223.78?operation=create znode?target=ZooKeeperServer?znode=/test2?result=success 2016-12-28 14:17:10,550 | INFO | CommitProcWorkThread-4 | session=0x12000007553b4903?user=10.177.223.78,zkcli/hadoop.hadoop.com@HADOOP.COM?ip=10.177.223.78?operation=create znode?target=ZooKeeperServer?znode=/test3?result=success 2016-12-28 14:17:10,570 | INFO | CommitProcWorkThread-4 | session=0x12000007553b4903?user=10.177.223.78,zkcli/hadoop.hadoop.com@HADOOP.COM?ip=10.177.223.78?operation=create znode?target=ZooKeeperServer?znode=/test4?result=success 2016-12-28 14:17:10,592 | INFO | CommitProcWorkThread-4 | session=0x12000007553b4903?user=10.177.223.78,zkcli/hadoop.hadoop.com@HADOOP.COM?ip=10.177.223.78?operation=create znode?target=ZooKeeperServer?znode=/test5?result=success 2016-12-28 14:17:10,613 | INFO | CommitProcWorkThread-4 | session=0x12000007553b4903?user=10.177.223.78,zkcli/hadoop.hadoop.com@HADOOP.COM?ip=10.177.223.78?operation=create znode?target=ZooKeeperServer?znode=/test6?result=success 2016-12-28 14:17:10,633 | INFO | CommitProcWorkThread-4 | session=0x12000007553b4903?user=10.177.223.78,zkcli/hadoop.hadoop.com@HADOOP.COM?ip=10.177.223.78?operation=create znode?target=ZooKeeperServer?znode=/test7?result=success
输出显示了在审计日志中添加了ZooKeeper客户端用户“zkcli/hadoop.hadoop.com@HADOOP.COM”的日志。
ZooKeeper中的用户详情:
在ZooKeeper中,不同的认证方案使用不同的凭证作为用户。 基于认证供应商的要求,任何参数都可以被认为是用户。
示例:
- SAMLAuthenticationProvider使用客户端主体作为用户。
- X509AuthenticationProvider使用户客户端证书作为用户。
- IAuthenticationProvider使用客户端IP作为用户。
- 自定义认证提供程序实现org.apache.zookeeper.server.auth.ExtAuthenticationProvider.getUserName(String)方法以获取用户名。 如果没有实现,从认证提供程序实例获取用户名将被跳过。
ZooKeeper开源增强特性:ZooKeeper SSL通信(Netty连接)
ZooKeeper设计最初含有Nio包,且不能较好的支持3.5版本后的SSL。为了解决这个问题,Netty被加入到ZooKeeper中。所以如果用户需要使用SSL,启用Netty并设置Server端和Client端的以下参数。
开源的服务端只支持简单的文本密码,这可能导致相关安全问题。为此我们在服务端将不再使用此类文本密码。
- Client端
- 将“zkCli.sh/zkEnv.sh”文件中的参数“-Dzookeeper.client.secure”设置为“true”以在Client端使用安全通信。之后客户端可以连接服务端的secureClientPort。
- 通过设置“zkCli.sh/zkEnv.sh”文件中的以下参数配置客户端环境。
参数
描述
-Dzookeeper.clientCnxnSocket
用于客户端的Netty通信。
默认值:"org.apache.zookeeper.ClientCnxnSocketNetty"
-Dzookeeper.ssl.keyStore.location
keystore文件路径。
-Dzookeeper.ssl.keyStore.password
加密密码。
-Dzookeeper.ssl.trustStore.location
truststore文件路径。
-Dzookeeper.ssl.trustStore.password
加密密码。
-Dzookeeper.config.crypt.class
用于加密密码的解密。
-Dzookeeper.ssl.password.encrypted
默认值:false
当keystore和truststore的密码为加密密码时设置为true。
-Dzookeeper.ssl.enabled.protocols
通过配置此参数定义SSL协议以适用于SSL上下文。
-Dzookeeper.ssl.exclude.cipher.ext
通过配置此参数定义SSL上下文中应排除的密码列表,之间以逗号间隔。
以上参数须在“zkCli.sh/zk.Env.sh”文件内设置。
- Server端
- 在文件“zoo.cfg”中将监听SSL端口参数“secureClientPort”设置为“3381”。
- 在server端将文件“zoo.cfg”中的参数“zookeeper.serverCnxnFactory”设置为“org.apache.zookeeper.server.NettyServerCnxnFactory”。
- 设置文件zoo.cfg(路径:“zookeeper/conf/zoo.cfg”)中的以下参数来配置服务端环境。
参数
描述
ssl.keyStore.location
keystore.jks文件路径。
ssl.keyStore.password
加密密码。
ssl.trustStore.location
truststore文件路径。
ssl.trustStore.password
加密密码。
config.crypt.class
用于加密密码的解密。
ssl.keyStore.password.encrypted
默认值:false
设置为true时可使用加密密码。
ssl.trustStore.password.encrypted
默认值:false
设置为true时可使用加密密码。
ssl.enabled.protocols
通过配置此参数定义SSL协议以适用于SSL上下文。
ssl.exclude.cipher.ext
通过配置此参数定义SSL上下文中应排除的密码列表,之间以逗号间隔。
- 启动ZKserver,然后将安全客户端连接到安全端口。
- 凭证
ZooKeeper上Client和Server之间的凭证由X509AuthenticationProvider执行。根据以下参数指定服务端证书及信任客户端证书,并通过这些证书初始化X509AuthenticationProvider。
- zookeeper.ssl.keyStore.location
- zookeeper.ssl.keyStore.password
- zookeeper.ssl.trustStore.location
- zookeeper.ssl.trustStore.password
若用户不想使用ZooKeeper的默认机制,可根据所需配置不同的ZooKeeper信任机制。