审计日志记录
Cassandra 中的审计日志记录会记录每个传入的 CQL 命令请求,以及对 Cassandra 节点的身份验证(成功/不成功登录)。目前,提供了两种实现方式。可以实现自定义日志记录器,并在 cassandra.yaml
文件中使用类名作为参数进行注入。
-
BinAuditLogger
:一种将事件以二进制格式记录到文件的有效方式(社区推荐的性能日志记录器) -
FileAuditLogger
:使用 slf4j 日志记录器将事件记录到audit/audit.log
文件
审计日志记录记录什么
每个审计日志记录实现都可以访问以下属性,对于默认的基于文本的日志记录器,这些字段将使用管道连接起来,以生成最终消息。
-
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.audit 或 cassandra.logdir
/audit/ -
included_keyspaces
:要包含在审计日志记录中的键空间的逗号分隔列表,默认 - 包含所有键空间 -
excluded_keyspaces
:要从审计日志记录中排除的键空间的逗号分隔列表,默认 - 排除除 system、system_schema 和 system_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 中的值。请记住,默认情况下会排除 system、system_schema 和 system_virtual_schema,如果您通过 nodetool 覆盖此选项,请记住在不希望它们出现在审计日志记录中时将这些键空间添加回来。
--excluded-users
-
要从审计日志记录中排除的用户的逗号分隔列表。如果未设置,则使用 cassandra.yaml 中的值。
--included-categories
-
要包含在审计日志记录中的审计日志记录类别的逗号分隔列表。如果未设置,则使用 cassandra.yaml 中的值。
--included-keyspaces
-
要包含在审计日志记录中的键空间的逗号分隔列表。如果未设置,则使用 cassandra.yaml 中的值。
--included-users
-
要包含在审计日志记录中的用户的逗号分隔列表。如果未设置,则使用 cassandra.yaml 中的值。
--logger
-
要用于审计日志记录的日志记录器名称。默认值为 BinAuditLogger。如果未设置,则使用 cassandra.yaml 中的值。
查看审计日志记录文件的内容
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>