更新时间:2022-02-24 GMT+08:00

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端
    1. “zkCli.sh/zkEnv.sh”文件中的参数“-Dzookeeper.client.secure”设置为“true”以在Client端使用安全通信。之后客户端可以连接服务端的secureClientPort。
    2. 通过设置“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端
    1. 在文件“zoo.cfg”中将监听SSL端口参数“secureClientPort”设置为“3381”
    2. 在server端将文件“zoo.cfg”中的参数“zookeeper.serverCnxnFactory”设置为“org.apache.zookeeper.server.NettyServerCnxnFactory”
    3. 设置文件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上下文中应排除的密码列表,之间以逗号间隔。

    4. 启动ZKserver,然后将安全客户端连接到安全端口。
  • 凭证

    ZooKeeper上Client和Server之间的凭证由X509AuthenticationProvider执行。根据以下参数指定服务端证书及信任客户端证书,并通过这些证书初始化X509AuthenticationProvider。

    • zookeeper.ssl.keyStore.location
    • zookeeper.ssl.keyStore.password
    • zookeeper.ssl.trustStore.location
    • zookeeper.ssl.trustStore.password

    若用户不想使用ZooKeeper的默认机制,可根据所需配置不同的ZooKeeper信任机制。