ZooKeeper 审计日志
ZooKeeper审计日志
Apache ZooKeeper从3.6.0版本开始支持审计日志功能。默认情况下审计日志是禁用的。要启用审计日志,需要在conf/zoo.cfg配置文件中设置audit.enable=true。审计日志并非记录在所有ZooKeeper服务器上,而是仅记录在客户端连接的服务器上,如下图所示。

审计日志会捕获选定进行审计的操作的详细信息。审计信息以一组键值对的形式记录,包含以下键
| 键 | 值 |
|---|---|
| session | 客户端会话ID |
| user | 与客户端会话关联的用户列表,以逗号分隔。更多信息请参阅Who is taken as user in audit logs。 |
| ip | 客户端IP地址 |
| operation | 审计选定的任意操作。可能的值为(serverStart, serverStop, create, delete, setData, setAcl, multiOperation, reconfig, ephemeralZNodeDeleteOnSessionClose) |
| znode | znode的路径 |
| znode类型 | 创建操作时的znode类型 |
| acl | znode ACL的字符串表示形式,如cdrwa(创建、删除、读取、写入、管理员权限)。仅针对setAcl操作记录 |
| result | 操作结果。可能的值为(success/failure/invoked)。结果"invoked"用于serverStop操作,因为在确保服务器实际停止之前会先记录停止操作。 |
以下是所有操作的示例审计日志,其中客户端来自192.168.1.2,客户端主体为zkcli@HADOOP.COM,服务器主体为zookeeper/192.168.1.3@HADOOP.COM
user=zookeeper/192.168.1.3 operation=serverStart result=success
session=0x19344730000 user=192.168.1.2,zkcli@HADOOP.COM ip=192.168.1.2 operation=create znode=/a znode_type=persistent result=success
session=0x19344730000 user=192.168.1.2,zkcli@HADOOP.COM ip=192.168.1.2 operation=create znode=/a znode_type=persistent result=failure
session=0x19344730000 user=192.168.1.2,zkcli@HADOOP.COM ip=192.168.1.2 operation=setData znode=/a result=failure
session=0x19344730000 user=192.168.1.2,zkcli@HADOOP.COM ip=192.168.1.2 operation=setData znode=/a result=success
session=0x19344730000 user=192.168.1.2,zkcli@HADOOP.COM ip=192.168.1.2 operation=setAcl znode=/a acl=world:anyone:cdrwa result=failure
session=0x19344730000 user=192.168.1.2,zkcli@HADOOP.COM ip=192.168.1.2 operation=setAcl znode=/a acl=world:anyone:cdrwa result=success
session=0x19344730000 user=192.168.1.2,zkcli@HADOOP.COM ip=192.168.1.2 operation=create znode=/b znode_type=persistent result=success
session=0x19344730000 user=192.168.1.2,zkcli@HADOOP.COM ip=192.168.1.2 operation=setData znode=/b result=success
session=0x19344730000 user=192.168.1.2,zkcli@HADOOP.COM ip=192.168.1.2 operation=delete znode=/b result=success
session=0x19344730000 user=192.168.1.2,zkcli@HADOOP.COM ip=192.168.1.2 operation=multiOperation result=failure
session=0x19344730000 user=192.168.1.2,zkcli@HADOOP.COM ip=192.168.1.2 operation=delete znode=/a result=failure
session=0x19344730000 user=192.168.1.2,zkcli@HADOOP.COM ip=192.168.1.2 operation=delete znode=/a result=success
session=0x19344730001 user=192.168.1.2,zkcli@HADOOP.COM 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,zkcli@HADOOP.COM 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时,认证用户为user
自定义认证提供者可以重写org.apache.zookeeper.server.auth.AuthenticationProvider.getUserName(String id)方法来提供用户名。如果认证提供者没有重写此方法,则将org.apache.zookeeper.data.Id.id中存储的内容作为用户。通常此字段仅存储用户名,但具体存储内容由自定义认证提供者决定。对于审计日志记录,将使用org.apache.zookeeper.data.Id.id的值作为用户标识。
在ZooKeeper服务器中,并非所有操作都由客户端执行,部分操作由服务器自身完成。例如当客户端关闭会话时,临时节点(ephemeral znodes)的删除由服务器处理。这些删除操作并非由客户端直接执行,而是由服务器自身完成,这类操作被称为系统操作。在进行这些系统操作的审计日志记录时,会采用与ZooKeeper服务器关联的用户身份。举例来说,如果ZooKeeper服务器的主体是zookeeper/hadoop.hadoop.com@HADOOP.COM,则该主体将成为系统用户,所有系统操作都将以该用户名记录日志。
user=zookeeper/hadoop.hadoop.com@HADOOP.COM operation=serverStart result=success
如果没有用户与ZooKeeper服务器关联,则启动ZooKeeper服务器的用户将被视为系统用户。例如,如果服务器由root用户启动,则root将被视为系统用户
user=root operation=serverStart result=success
单个客户端可以为会话附加多个认证方案,在这种情况下,所有已认证的方案都将被视为用户,并以逗号分隔的列表形式呈现。例如,如果客户端使用主体zkcli@HADOOP.COM和IP地址127.0.0.1进行认证,那么创建znode的审计日志将如下所示:
session=0x10c0bcb0000 user=zkcli@HADOOP.COM,127.0.0.1 ip=127.0.0.1 operation=create znode=/a result=success
