ZooKeeper 审计日志记录
ZooKeeper 审计日志
Apache ZooKeeper 支持 3.6.0 版本的审计日志。默认情况下,审计日志处于禁用状态。要启用审计日志,请在 conf/zoo.cfg 中配置 audit.enable=true。审计日志不会记录在所有 ZooKeeper 服务器上,但仅记录在客户端连接到的服务器上,如下图所示。
审计日志会捕获选定要审计的操作的详细信息。审计信息以一组键值对的形式写入,用于以下键
键 | 值 |
---|---|
会话 | 客户端会话 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-->
更改上述配置以自定义审计日志文件、备份数量、最大文件大小、自定义审计记录器等。
谁在审计日志中被视为用户?
默认情况下,只有四种身份验证提供程序
- IPAuthenticationProvider
- SASLAuthenticationProvider
- X509AuthenticationProvider
- DigestAuthenticationProvider
用户根据配置的身份验证提供程序决定
- 当配置 IPAuthenticationProvider 时,经过身份验证的 IP 被视为用户
- 当配置 SASLAuthenticationProvider 时,客户端主体被视为用户
- 当配置 X509AuthenticationProvider 时,客户端证书被视为用户
- 当配置 DigestAuthenticationProvider 时,经过身份验证的用户是用户
自定义身份验证提供程序可以覆盖 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