Cassandra 文档

版本

您正在查看预发布版本的文档。

审计日志记录

Cassandra 中的审计日志记录会记录每个传入的 CQL 命令请求,以及对 Cassandra 节点的身份验证(成功/不成功登录)。目前,提供了两种实现方式。可以实现自定义日志记录器,并在 cassandra.yaml 文件中使用类名作为参数进行注入。

  • BinAuditLogger:一种将事件以二进制格式记录到文件的有效方式(社区推荐的性能日志记录器)

  • FileAuditLogger:使用 slf4j 日志记录器将事件记录到 audit/audit.log 文件

审计日志记录捕获什么

审计日志记录捕获以下事件

  • 成功和不成功的登录尝试

  • 通过原生 CQL 协议执行的所有数据库命令(尝试或成功执行)

限制

执行准备好的语句将记录 prepare 调用中客户端提供的查询,以及执行时间戳和其他所有属性(见下文)。准备好的语句执行的实际绑定值不会显示在审计日志中。

审计日志记录记录什么

每个审计日志记录实现都可以访问以下属性,对于默认的基于文本的日志记录器,这些字段将使用管道连接起来,以生成最终消息。

  • user:用户名(如果可用)

  • host:执行命令的主机 IP

  • source ip address:请求发起的源 IP 地址

  • source port:请求发起的源端口号

  • timestamp:Unix 时间戳

  • type:请求类型(SELECT、INSERT 等)

  • category - 请求类别(DDL、DML 等)

  • keyspace - 请求目标执行的键空间(如果适用)

  • scope - 表/聚合名称/函数名称/触发器名称等,视情况而定

  • operation - 正在执行的 CQL 命令

如何配置

可以使用 cassandra.yaml 文件配置审计日志记录。要在单个节点上使用审计日志记录,请编辑该文件,或使用 nodetool 启用并配置。

cassandra.yaml 中的审计日志记录配置

支持以下选项

  • enabled:此选项启用/禁用审计日志记录

  • logger:日志记录器/自定义日志记录器的类名。

  • audit_logs_dir:审计日志目录位置,如果未设置,则默认为 cassandra.logdir.auditcassandra.logdir
    /audit/

  • included_keyspaces:要包含在审计日志记录中的键空间的逗号分隔列表,默认 - 包含所有键空间

  • excluded_keyspaces:要从审计日志记录中排除的键空间的逗号分隔列表,默认 - 排除除 systemsystem_schemasystem_virtual_schema 之外的所有键空间

  • included_categories:要包含在审计日志记录中的审计日志记录类别的逗号分隔列表,默认 - 包含所有类别

  • excluded_categories:要从审计日志记录中排除的审计日志记录类别的逗号分隔列表,默认 - 不排除任何类别

  • included_users:要包含在审计日志记录中的用户的逗号分隔列表,默认 - 包含所有用户

  • excluded_users:要从审计日志记录中排除的用户的逗号分隔列表,默认 - 不排除任何用户

可用的类别列表:QUERY、DML、DDL、DCL、OTHER、AUTH、ERROR、PREPARE

启用审计日志记录的 NodeTool 命令

nodetool enableauditlog 命令使用 cassandra.yaml 文件中的默认值启用审计日志记录。可以使用此 nodetool 命令中的选项覆盖这些默认值。

nodetool enableauditlog

选项

--excluded-categories

要从审计日志记录中排除的审计日志记录类别的逗号分隔列表。如果未设置,则使用 cassandra.yaml 中的值。

--excluded-keyspaces

要从审计日志记录中排除的键空间的逗号分隔列表。如果未设置,则使用 cassandra.yaml 中的值。请记住,默认情况下会排除 systemsystem_schemasystem_virtual_schema,如果您通过 nodetool 覆盖此选项,请记住在不希望它们出现在审计日志记录中时将这些键空间添加回来。

--excluded-users

要从审计日志记录中排除的用户的逗号分隔列表。如果未设置,则使用 cassandra.yaml 中的值。

--included-categories

要包含在审计日志记录中的审计日志记录类别的逗号分隔列表。如果未设置,则使用 cassandra.yaml 中的值。

--included-keyspaces

要包含在审计日志记录中的键空间的逗号分隔列表。如果未设置,则使用 cassandra.yaml 中的值。

--included-users

要包含在审计日志记录中的用户的逗号分隔列表。如果未设置,则使用 cassandra.yaml 中的值。

--logger

要用于审计日志记录的日志记录器名称。默认值为 BinAuditLogger。如果未设置,则使用 cassandra.yaml 中的值。

禁用审计日志记录的 NodeTool 命令

nodetool disableauditlog 命令禁用审计日志记录。

nodetool disableuditlog

重新加载审计日志记录过滤器的 NodeTool 命令

nodetool enableauditlog 命令可用于使用默认值或先前的 loggername 和更新的过滤器重新加载审计日志记录过滤器。

nodetool enableauditlog --loggername <Default/ existing loggerName> --included-keyspaces <New Filter values>

查看审计日志记录文件的内容

auditlogviewer 用于以人类可读的文本格式查看审计 binlog 文件的内容。

auditlogviewer <path1> [<path2>...<pathN>] [options]

选项

-f,--follow
到达日志末尾后无限期继续

等待更多记录

-r,--roll_cycle
日志文件滚动的频率。可能

Chronicle 正确解析文件名所需。(MINUTELY、HOURLY、DAILY)。默认值为 HOURLY。

-h,--help

显示此帮助消息

例如,要将审计日志记录文件的内容转储到控制台

auditlogviewer /logs/cassandra/audit

结果为

LogMessage: user:anonymous|host:localhost/X.X.X.X|source:/X.X.X.X|port:60878|timestamp:1521158923615|type:USE_KS|category:DDL|ks:dev1|operation:USE "dev1"

配置 BinAuditLogger

要在审计日志记录中使用 BinAuditLogger 作为日志记录器,请在 cassandra.yaml 文件的 audit_logging_options 部分中将日志记录器设置为 BinAuditLogger。可以使用 cassandra.yaml 中的其高级选项进一步配置 BinAuditLogger

BinAuditLogger 的高级选项

block

指示审计日志记录在落后时是否应阻塞,或是否应丢弃审计日志记录。默认设置为 true,以便不会丢失审计日志记录。

max_queue_weight

内存中队列的最大权重,用于记录等待写入审计日志记录文件之前阻塞或丢弃日志记录的记录。默认设置为 256 * 1024 * 1024

max_log_size

在删除最旧的文件之前,磁盘上保留的已滚动文件的最大大小。默认设置为 16L * 1024L * 1024L * 1024L

roll_cycle

审计日志段的滚动频率,以便它们可以被潜在回收。可用的选项包括:MINUTELY、HOURLY、DAILY、LARGE_DAILY、XLARGE_DAILY、HUGE_DAILY。有关更多选项,请参考:net.openhft.chronicle.queue.RollCycles。默认设置为"HOURLY"

配置 FileAuditLogger

要在 AuditLogging 中使用FileAuditLogger 作为日志记录器,请在cassandra.yaml 文件中设置类名,并将审计日志事件配置为流经单独的日志文件,而不是 system.log。

<!-- Audit Logging (FileAuditLogger) rolling file appender to audit.log -->
<appender name="AUDIT" class="ch.qos.logback.core.rolling.RollingFileAppender">
  <file>${cassandra.logdir}/audit/audit.log</file>
  <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
    <!-- rollover daily -->
    <fileNamePattern>${cassandra.logdir}/audit/audit.log.%d{yyyy-MM-dd}.%i.zip</fileNamePattern>
    <!-- each file should be at most 50MB, keep 30 days worth of history, but at most 5GB -->
    <maxFileSize>50MB</maxFileSize>
    <maxHistory>30</maxHistory>
    <totalSizeCap>5GB</totalSizeCap>
  </rollingPolicy>
  <encoder>
    <pattern>%-5level [%thread] %date{ISO8601} %F:%L - %msg%n</pattern>
  </encoder>
</appender>

<!-- Audit Logging additivity to redirect audt logging events to audit/audit.log -->
<logger name="org.apache.cassandra.audit" additivity="false" level="INFO">
    <appender-ref ref="AUDIT"/>
</logger>