Apache > ZooKeeper
 

ZooKeeper 审计日志

ZooKeeper审计日志

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

Audit Logs

审计日志会捕获选定进行审计的操作的详细信息。审计信息以一组键值对的形式记录,包含以下键

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-->

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

审计日志中的用户是谁?

默认情况下只有四种认证提供者:

用户身份由配置的身份验证提供者决定:

自定义认证提供者可以重写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