Apache Cassandra 审计日志功能详解与配置指南
审计日志概述
Apache Cassandra 的审计日志功能是一项重要的安全特性,它能够记录所有进入节点的 CQL 命令请求以及认证事件(包括成功和失败的登录尝试)。这项功能对于数据库安全监控、合规性审计以及故障排查都具有重要意义。
审计日志实现方式
Cassandra 提供了两种开箱即用的审计日志实现:
-
BinAuditLogger(二进制日志记录器)
- 采用高效的二进制格式记录日志
- 社区推荐的生产环境首选方案,性能优异
- 适合高吞吐量场景
-
FileAuditLogger(文件日志记录器)
- 使用 slf4j 日志框架
- 将审计事件记录到 audit/audit.log 文件
- 采用文本格式,便于直接阅读
此外,系统支持自定义日志记录器实现,只需在配置文件中指定自定义类的全限定名即可。
审计日志记录内容
审计日志会捕获以下关键信息:
-
认证事件
- 所有登录尝试(成功和失败)
-
数据库操作
- 通过原生 CQL 协议执行的所有命令
- 包括尝试执行和成功执行的命令
记录字段详解
每个审计日志条目包含以下详细信息(字段间默认用竖线分隔):
| 字段名 | 描述 | |--------|------| | user | 执行操作的用户名(如可用) | | host | 执行命令的主机IP | | source ip address | 请求来源IP地址 | | source port | 请求来源端口号 | | timestamp | Unix时间戳 | | type | 请求类型(SELECT、INSERT等) | | category | 请求类别(DDL、DML等) | | keyspace | 目标键空间(如适用) | | scope | 表/聚合/函数/触发器名称等 | | operation | 执行的CQL命令 |
使用限制
需要注意的是,对于预编译语句(prepared statements),审计日志只会记录客户端在准备调用时提供的查询语句,而不会记录执行时绑定的实际参数值。这是当前实现的一个已知限制。
配置审计日志
通过配置文件配置
在 cassandra.yaml
中可配置以下审计日志选项:
audit_logging_options:
enabled: true/false # 启用/禁用审计日志
logger: BinAuditLogger # 日志记录器类名
audit_logs_dir: /path/to/logs # 日志目录
included_keyspaces: ks1,ks2 # 包含的键空间列表
excluded_keyspaces: ks3,ks4 # 排除的键空间列表
included_categories: DDL,DML # 包含的类别列表
excluded_categories: QUERY # 排除的类别列表
included_users: user1,user2 # 包含的用户列表
excluded_users: user3 # 排除的用户列表
可用类别包括:QUERY、DML、DDL、DCL、OTHER、AUTH、ERROR、PREPARE。
通过命令行工具配置
Cassandra 提供了 nodetool
命令来动态管理审计日志:
-
启用审计日志
nodetool enableauditlog [--logger BinAuditLogger] [--included-keyspaces ks1,ks2] ...
-
禁用审计日志
nodetool disableauditlog
-
重新加载过滤器
nodetool enableauditlog --loggername BinAuditLogger --included-keyspaces new_ks
查看审计日志
对于二进制格式的日志,需要使用专门的查看工具:
auditlogviewer /path/to/audit/logs [--follow] [--roll_cycle HOURLY]
常用选项:
--follow
:实时跟踪日志变化--roll_cycle
:指定日志滚动周期(MINUTELY, HOURLY, DAILY)
高级配置
BinAuditLogger 高级选项
block: true # 当队列满时是否阻塞(默认为true,不丢失记录)
max_queue_weight: 268435456 # 内存队列最大权重(字节)
max_log_size: 17179869184 # 日志文件最大保留大小(字节)
roll_cycle: "HOURLY" # 日志滚动周期
FileAuditLogger 配置
需要在 logback 配置文件中添加专门的 appender:
<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">
<fileNamePattern>${cassandra.logdir}/audit/audit.log.%d{yyyy-MM-dd}.%i.zip</fileNamePattern>
<maxFileSize>50MB</maxFileSize>
<maxHistory>30</maxHistory>
<totalSizeCap>5GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%-5level [%thread] %date{"yyyy-MM-dd'T'HH:mm:ss,SSS", UTC} %F:%L - %msg%n</pattern>
</encoder>
</appender>
<logger name="org.apache.cassandra.audit" additivity="false" level="INFO">
<appender-ref ref="AUDIT"/>
</logger>
最佳实践建议
- 生产环境推荐:使用 BinAuditLogger 以获得最佳性能
- 安全考虑:定期归档和备份审计日志
- 性能调优:根据负载情况调整队列大小和滚动策略
- 合规要求:确保审计日志包含所有必要的操作和用户
- 存储规划:为审计日志预留足够的磁盘空间
通过合理配置和使用 Cassandra 的审计日志功能,可以有效监控数据库活动,满足合规要求,并为安全事件调查提供可靠依据。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考