Apache > ZooKeeper
 

ZooKeeper 审计日志记录

ZooKeeper 审计日志

Apache ZooKeeper 支持 3.6.0 版本的审计日志。默认情况下,审计日志处于禁用状态。要启用审计日志,请在 conf/zoo.cfg 中配置 audit.enable=true。审计日志不会记录在所有 ZooKeeper 服务器上,但仅记录在客户端连接到的服务器上,如下图所示。

Audit Logs

审计日志会捕获选定要审计的操作的详细信息。审计信息以一组键值对的形式写入,用于以下键

会话 客户端会话 ID
用户 与客户端会话关联的用户逗号分隔列表。有关更多信息,请参见 谁在审计日志中被视为用户
IP 客户端 IP 地址
操作 选定的任何审计操作。可能的值为 (serverStart、serverStop、create、delete、setData、setAcl、multiOperation、reconfig、ephemeralZNodeDeleteOnSessionClose)
Z 节点 Z 节点的路径
Z 节点类型 创建操作中的 Z 节点类型
ACL Z 节点 ACL 的字符串表示形式,如 cdrwa(创建、删除、读取、写入、管理)。这仅记录在 setAcl 操作中
结果 操作的结果。可能的值为 (成功/失败/调用)。结果“调用”用于 serverStop 操作,因为在确保服务器实际停止之前会记录停止。

以下是所有操作的示例审计日志,其中客户端从 192.168.1.2 连接,客户端主体为 [email protected],服务器主体为 zookeeper/[email protected]

user=zookeeper/192.168.1.3 operation=serverStart   result=success
session=0x19344730000   user=192.168.1.2,[email protected]  ip=192.168.1.2    operation=create    znode=/a    znode_type=persistent  result=success
session=0x19344730000   user=192.168.1.2,[email protected]  ip=192.168.1.2    operation=create    znode=/a    znode_type=persistent  result=failure
session=0x19344730000   user=192.168.1.2,[email protected]  ip=192.168.1.2    operation=setData   znode=/a    result=failure
session=0x19344730000   user=192.168.1.2,[email protected]  ip=192.168.1.2    operation=setData   znode=/a    result=success
session=0x19344730000   user=192.168.1.2,[email protected]  ip=192.168.1.2    operation=setAcl    znode=/a    acl=world:anyone:cdrwa  result=failure
session=0x19344730000   user=192.168.1.2,[email protected]  ip=192.168.1.2    operation=setAcl    znode=/a    acl=world:anyone:cdrwa  result=success
session=0x19344730000   user=192.168.1.2,[email protected]  ip=192.168.1.2    operation=create    znode=/b    znode_type=persistent  result=success
session=0x19344730000   user=192.168.1.2,[email protected]  ip=192.168.1.2    operation=setData   znode=/b    result=success
session=0x19344730000   user=192.168.1.2,[email protected]  ip=192.168.1.2    operation=delete    znode=/b    result=success
session=0x19344730000   user=192.168.1.2,[email protected]  ip=192.168.1.2    operation=multiOperation    result=failure
session=0x19344730000   user=192.168.1.2,[email protected]  ip=192.168.1.2    operation=delete    znode=/a    result=failure
session=0x19344730000   user=192.168.1.2,[email protected]  ip=192.168.1.2    operation=delete    znode=/a    result=success
session=0x19344730001   user=192.168.1.2,[email protected]  ip=192.168.1.2    operation=create   znode=/ephemral znode_type=ephemral result=success
session=0x19344730001   user=zookeeper/192.168.1.3   operation=ephemeralZNodeDeletionOnSessionCloseOrExpire  znode=/ephemral result=success
session=0x19344730000   user=192.168.1.2,[email protected]  ip=192.168.1.2    operation=reconfig  znode=/zookeeper/config result=success
user=zookeeper/192.168.1.3 operation=serverStop    result=invoked

ZooKeeper 审计日志配置

默认情况下,审计日志被禁用。要启用审计日志,请在 conf/zoo.cfg 中配置 audit.enable=true。审计日志记录使用 logback 完成。以下是 conf/logback.xml 中审计日志的默认 logback 配置

<!--
  zk audit logging
-->
<!--property name="zookeeper.auditlog.file" value="zookeeper_audit.log" />
<property name="zookeeper.auditlog.threshold" value="INFO" />
<property name="audit.logger" value="INFO, RFAAUDIT" />

<appender name="RFAAUDIT" class="ch.qos.logback.core.rolling.RollingFileAppender">
  <File>${zookeeper.log.dir}/${zookeeper.auditlog.file}</File>
  <encoder>
    <pattern>%d{ISO8601} %p %c{2}: %m%n</pattern>
  </encoder>
  <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
    <level>${zookeeper.auditlog.threshold}</level>
  </filter>
  <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
    <maxIndex>10</maxIndex>
    <FileNamePattern>${zookeeper.log.dir}/${zookeeper.auditlog.file}.%i</FileNamePattern>
  </rollingPolicy>
  <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
    <MaxFileSize>10MB</MaxFileSize>
  </triggeringPolicy>
</appender>

<logger name="org.apache.zookeeper.audit.Slf4jAuditLogger" additivity="false" level="${audit.logger}">
  <appender-ref ref="RFAAUDIT" />
</logger-->

更改上述配置以自定义审计日志文件、备份数量、最大文件大小、自定义审计记录器等。

谁在审计日志中被视为用户?

默认情况下,只有四种身份验证提供程序

用户根据配置的身份验证提供程序决定

自定义身份验证提供程序可以覆盖 org.apache.zookeeper.server.auth.AuthenticationProvider.getUserName(String id) 以提供用户名。如果身份验证提供程序没有覆盖此方法,则存储在 org.apache.zookeeper.data.Id.id 中的任何内容都被视为用户。通常只有用户名存储在此字段中,但自定义身份验证提供程序存储在其中的内容由其决定。对于审计日志记录,org.apache.zookeeper.data.Id.id 的值将被视为用户。

在 ZooKeeper 服务器中,并非所有操作都是由客户端完成的,而是有些操作是由服务器本身完成的。例如,当客户端关闭会话时,短暂的 znode 会被服务器删除。这些删除不是由客户端直接完成的,而是由服务器本身完成的,这些被称为系统操作。对于这些系统操作,与 ZooKeeper 服务器关联的用户在审计日志记录这些操作时被视为用户。例如,如果在 ZooKeeper 服务器中主体是 zookeeper/[email protected],那么它将成为系统用户,并且所有系统操作都将使用此用户名进行记录。

user=zookeeper/[email protected] operation=serverStart result=success

如果没有用户与 ZooKeeper 服务器关联,那么启动 ZooKeeper 服务器的用户将被视为用户。例如,如果服务器由 root 启动,那么 root 将被视为系统用户

user=root operation=serverStart result=success

单个客户端可以将多个身份验证方案附加到一个会话,在这种情况下,所有经过身份验证的方案都将被视为用户,并将以逗号分隔列表的形式呈现。例如,如果客户端使用主体 [email protected] 和 IP 127.0.0.1 进行身份验证,那么创建 znode 审计日志将如下所示

session=0x10c0bcb0000 [email protected],127.0.0.1 ip=127.0.0.1 operation=create znode=/a result=success