外观
MariaDB 审计日志配置与分析
审计日志概述
什么是审计日志
审计日志是 MariaDB 记录数据库活动的日志文件,包含了用户登录、查询执行、权限变更等重要操作信息,是实现安全审计和合规要求的重要工具。
审计日志的作用
- 安全审计:记录所有数据库活动,便于追踪和分析安全事件
- 合规要求:满足 PCI DSS、HIPAA、GDPR 等合规标准
- 故障排查:帮助定位和分析数据库故障
- 性能分析:识别异常查询和性能瓶颈
- 责任追溯:确定特定操作的执行人和时间
审计日志与其他日志的区别
| 日志类型 | 主要用途 | 记录内容 | 特点 |
|---|---|---|---|
| 错误日志 | 故障排查 | 系统错误、警告信息 | 记录系统级事件 |
| 慢查询日志 | 性能优化 | 执行时间超过阈值的查询 | 记录慢查询语句 |
| Binlog | 数据恢复、主从复制 | 所有数据修改操作 | 记录数据变更 |
| 审计日志 | 安全审计、合规 | 所有数据库活动,包括查询和管理操作 | 记录详细的用户活动 |
审计日志解决方案
MariaDB 审计插件
MariaDB 提供了多种审计插件,常用的有:
Server Audit Plugin(推荐)
- MariaDB 官方支持的审计插件
- 功能全面,配置灵活
- 支持多种审计格式
Audit Plugin for MariaDB(Percona)
- Percona 提供的审计插件
- 与 Server Audit Plugin 兼容
- 增加了一些额外功能
MariaDB Enterprise Audit
- 商业版 MariaDB 提供的审计解决方案
- 更高级的功能和支持
Server Audit Plugin 配置
安装审计插件
- 检查插件是否已安装
sql
SHOW PLUGINS LIKE 'server_audit';- 安装审计插件
sql
-- 安装 Server Audit Plugin
INSTALL PLUGIN server_audit SONAME 'server_audit.so';
-- 验证插件安装
SHOW PLUGINS LIKE 'server_audit';- 卸载审计插件
sql
UNINSTALL PLUGIN server_audit;配置参数
| 参数名称 | 默认值 | 描述 |
|---|---|---|
| server_audit_logging | OFF | 是否启用审计日志 |
| server_audit_events | CONNECT,QUERY,TABLE | 审计事件类型 |
| server_audit_excl_users | (空) | 排除的审计用户 |
| server_audit_incl_users | (空) | 包含的审计用户 |
| server_audit_file_path | server_audit.log | 审计日志文件路径 |
| server_audit_file_rotate_size | 1000000 | 审计日志文件轮换大小 |
| server_audit_file_rotations | 9 | 审计日志文件轮换次数 |
| server_audit_file_rotate_now | OFF | 立即轮换审计日志文件 |
| server_audit_file_permissions | 0640 | 审计日志文件权限 |
| server_audit_logging | OFF | 是否启用审计日志 |
| server_audit_mode | 0 | 审计模式 |
| server_audit_output_type | FILE | 审计日志输出类型(FILE/SYSLOG) |
| server_audit_syslog_facility | LOG_USER | syslog 设施 |
| server_audit_syslog_ident | mysql-server_auditing | syslog 标识符 |
| server_audit_syslog_info | (空) | syslog 附加信息 |
| server_audit_syslog_priority | LOG_INFO | syslog 优先级 |
| server_audit_query_log_limit | 1024 | 审计查询日志长度限制 |
配置示例
ini
# my.cnf
[mysqld]
# 启用审计日志
server_audit_logging = ON
# 审计事件类型
server_audit_events = CONNECT,QUERY,TABLE,QUERY_DDL,QUERY_DML,QUERY_DCL
# 包含的审计用户(空表示审计所有用户)
server_audit_incl_users = 'root','admin'
# 排除的审计用户
server_audit_excl_users = 'mysql.session','mysql.sys'
# 审计日志文件路径
server_audit_file_path = /var/log/mariadb/server_audit.log
# 审计日志文件轮换大小(100MB)
server_audit_file_rotate_size = 104857600
# 审计日志文件轮换次数
server_audit_file_rotations = 10
# 审计日志文件权限
server_audit_file_permissions = 0640
# 审计日志输出类型
server_audit_output_type = FILE
# 审计查询日志长度限制
server_audit_query_log_limit = 2048动态调整配置
sql
-- 启用审计日志
SET GLOBAL server_audit_logging = ON;
-- 添加审计事件类型
SET GLOBAL server_audit_events = 'CONNECT,QUERY,TABLE,QUERY_DDL,QUERY_DML,QUERY_DCL';
-- 查看当前审计日志配置
SHOW VARIABLES LIKE 'server_audit%';审计事件类型
常用审计事件
| 事件类型 | 描述 |
|---|---|
| CONNECT | 连接和断开连接事件 |
| QUERY | 执行的查询语句 |
| TABLE | 表级操作 |
| QUERY_DDL | DDL 语句(CREATE, ALTER, DROP 等) |
| QUERY_DML | DML 语句(INSERT, UPDATE, DELETE 等) |
| QUERY_DCL | DCL 语句(GRANT, REVOKE 等) |
| QUERY_DML_NO_SELECT | 除 SELECT 外的 DML 语句 |
| SERVER_START | 服务器启动事件 |
| SERVER_SHUTDOWN | 服务器关闭事件 |
| QUERY_CACHE | 查询缓存操作 |
| AUDIT | 审计插件自身事件 |
事件组合建议
| 使用场景 | 推荐事件类型 |
|---|---|
| 全面审计 | CONNECT,QUERY,TABLE,QUERY_DDL,QUERY_DML,QUERY_DCL |
| 安全审计 | CONNECT,QUERY_DDL,QUERY_DCL |
| 性能审计 | QUERY,TABLE |
| 最小审计 | CONNECT,QUERY_DDL |
审计日志格式
FILE 输出格式
20251227 10:15:30,server1,root,localhost,12345,CONNECT,,,0
20251227 10:15:35,server1,root,localhost,12345,QUERY,test,'SHOW TABLES',0
20251227 10:15:40,server1,root,localhost,12345,QUERY,test,'SELECT * FROM mytable WHERE id = 1',0
20251227 10:15:45,server1,root,localhost,12345,QUERY_DML,test,'UPDATE mytable SET name = ''test'' WHERE id = 1',1
20251227 10:15:50,server1,root,localhost,12345,DISCONNECT,,,0日志字段说明
| 字段位置 | 字段名称 | 描述 |
|---|---|---|
| 1 | 时间戳 | 事件发生时间 |
| 2 | 服务器名称 | 数据库服务器名称 |
| 3 | 用户名 | 执行操作的用户名 |
| 4 | 主机名 | 执行操作的主机名 |
| 5 | 连接 ID | 连接标识符 |
| 6 | 事件类型 | 审计事件类型 |
| 7 | 数据库名称 | 操作的数据库名称 |
| 8 | 查询语句 | 执行的 SQL 语句 |
| 9 | 影响行数 | 操作影响的行数 |
审计日志管理
日志文件位置
| 操作系统 | 默认审计日志路径 |
|---|---|
| Linux | /var/lib/mysql/server_audit.log |
| Windows | 数据目录下的 server_audit.log |
| macOS | /usr/local/var/lib/mysql/server_audit.log |
日志轮换
自动轮换
- 当审计日志文件达到
server_audit_file_rotate_size时,自动轮换 - 保留
server_audit_file_rotations个旧日志文件
- 当审计日志文件达到
手动轮换
sql
-- 立即轮换审计日志文件
SET GLOBAL server_audit_file_rotate_now = ON;- 使用 logrotate
ini
# /etc/logrotate.d/mariadb-audit
/var/log/mariadb/server_audit.log {
daily
rotate 14
missingok
compress
delaycompress
notifempty
create 640 mysql mysql
sharedscripts
postrotate
# 立即轮换审计日志文件
mysql -e "SET GLOBAL server_audit_file_rotate_now = ON;"
endscript
}日志清理策略
| 日志类型 | 保留时间 | 清理方式 |
|---|---|---|
| 生产环境审计日志 | 90-365天 | logrotate 自动清理 |
| 测试环境审计日志 | 7-30天 | logrotate 自动清理 |
| 归档审计日志 | 1-7年 | 压缩存储到归档目录 |
审计日志分析
常用分析命令
查看审计日志
bash
# 查看审计日志内容
tail -n 100 /var/log/mariadb/server_audit.log
# 实时监控审计日志
tail -f /var/log/mariadb/server_audit.log过滤特定事件
bash
# 过滤连接事件
grep "CONNECT" /var/log/mariadb/server_audit.log
# 过滤 DDL 事件
grep "QUERY_DDL" /var/log/mariadb/server_audit.log
# 过滤特定用户的操作
grep "root" /var/log/mariadb/server_audit.log
# 过滤特定 IP 地址的操作
grep "192.168.1.100" /var/log/mariadb/server_audit.log
# 过滤失败的操作
grep ",1$" /var/log/mariadb/server_audit.log统计审计事件
bash
# 统计不同事件类型的数量
grep -o -E "CONNECT|QUERY|TABLE|QUERY_DDL|QUERY_DML|QUERY_DCL" /var/log/mariadb/server_audit.log | sort | uniq -c
# 统计特定时间段的事件数量
grep "2025-12-27 10:" /var/log/mariadb/server_audit.log | wc -l
# 统计每个用户的操作数量
grep -o -E "[a-zA-Z0-9_]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+," /var/log/mariadb/server_audit.log | cut -d',' -f3 | sort | uniq -c审计日志分析工具
MariaDB Audit Log Analyzer
可以使用第三方工具分析 MariaDB 审计日志:
- mysql-audit-log-parser
bash
# 安装 mysql-audit-log-parser
git clone https://github.com/mysql/mysql-audit-log-parser.git
cd mysql-audit-log-parser
cmake .
make
# 使用工具分析审计日志
./mysql-audit-log-parser /var/log/mariadb/server_audit.log- pt-query-digest
bash
# 使用 pt-query-digest 分析审计日志
pt-query-digest --type audit /var/log/mariadb/server_audit.log- ELK Stack
- 使用 Logstash 收集和解析审计日志
- 存储到 Elasticsearch
- 使用 Kibana 进行可视化分析和告警
常见安全事件分析
- 多次失败登录尝试
bash
# 查找失败的连接尝试
grep "CONNECT.*,1$" /var/log/mariadb/server_audit.log
# 统计每个 IP 地址的失败登录次数
grep "CONNECT.*,1$" /var/log/mariadb/server_audit.log | cut -d',' -f4 | sort | uniq -c | sort -nr- 权限变更操作
bash
# 查找 GRANT 和 REVOKE 操作
grep -i "grant\|revoke" /var/log/mariadb/server_audit.log- 表结构变更
bash
# 查找 CREATE, ALTER, DROP 操作
grep -i "create\|alter\|drop" /var/log/mariadb/server_audit.log- 数据删除操作
bash
# 查找 DELETE 操作
grep -i "delete" /var/log/mariadb/server_audit.log- 敏感数据访问
bash
# 查找访问敏感表的操作
grep "sensitive_table" /var/log/mariadb/server_audit.log审计日志与合规
合规要求
PCI DSS
- 要求记录所有访问卡holder数据的操作
- 审计日志至少保留 1 年,可查询 3 个月
- 定期审查审计日志
HIPAA
- 要求记录所有电子保护健康信息(ePHI)的访问
- 审计日志至少保留 6 年
- 定期审查和分析审计日志
GDPR
- 要求记录个人数据的处理活动
- 审计日志保留时间根据数据类型和用途而定
- 确保审计日志的完整性和可靠性
合规最佳实践
全面审计
- 审计所有用户的所有操作
- 记录足够详细的信息,便于追溯
- 确保审计日志的完整性和不可篡改性
定期审查
- 每周或每月审查审计日志
- 自动化审计日志分析,及时发现异常
- 记录审查结果和发现的问题
安全存储
- 将审计日志存储在安全的位置
- 限制审计日志的访问权限
- 考虑加密审计日志
及时响应
- 建立审计日志告警机制
- 对异常事件及时响应和处理
- 记录事件响应过程和结果
审计日志性能优化
优化配置
只审计必要的事件
- 根据业务需求选择合适的审计事件类型
- 避免审计不必要的事件,减少日志量
限制审计用户
- 使用
server_audit_incl_users和server_audit_excl_users限制审计用户 - 只审计关键用户和操作
- 使用
优化日志存储
- 将审计日志存储在高性能磁盘上
- 考虑将审计日志与数据文件分开存储
- 调整日志轮换参数,避免频繁轮换
合理设置日志长度限制
- 根据需要调整
server_audit_query_log_limit参数 - 避免记录过长的查询语句
- 根据需要调整
性能监控
监控审计日志对性能的影响
- 比较启用和禁用审计日志时的系统性能
- 监控审计日志写入的 I/O 开销
- 定期评估审计日志的性能影响
调整审计策略
- 根据性能监控结果调整审计策略
- 在性能和审计完整性之间取得平衡
- 考虑使用采样审计,减少性能影响
常见问题(FAQ)
Q: 如何启用 MariaDB 审计日志?
A: 启用步骤:
- 安装 Server Audit Plugin
- 配置审计参数
- 启用审计日志
- 验证审计日志是否正常记录
Q: 审计日志对性能有影响吗?
A: 审计日志会对性能产生一定影响,主要取决于:
- 审计事件类型的数量
- 审计用户的数量
- 系统负载
- 存储性能 建议根据业务需求和性能要求调整审计策略,只审计必要的事件和用户。
Q: 如何确保审计日志的安全性?
A: 确保审计日志安全性的方法:
- 设置正确的文件权限,限制访问
- 将审计日志存储在安全的位置
- 考虑加密审计日志
- 定期备份审计日志
- 确保审计日志的完整性和不可篡改性
Q: 如何处理大量的审计日志?
A: 处理大量审计日志的方法:
- 优化审计策略,减少日志量
- 使用集中式日志管理平台
- 定期清理旧的审计日志
- 考虑使用采样审计
- 对审计日志进行压缩存储
Q: 如何审计 MariaDB Galera Cluster?
A: 审计 Galera Cluster 的方法:
- 在每个节点上启用审计日志
- 使用集中式日志管理平台收集所有节点的审计日志
- 确保审计配置在所有节点上一致
- 特别关注集群级别的操作
最佳实践
合理配置审计策略
- 根据业务需求和合规要求选择审计事件类型
- 只审计必要的用户和操作
- 定期评估和调整审计策略
确保审计日志的安全性
- 限制审计日志的访问权限
- 加密审计日志的传输和存储
- 定期备份审计日志
- 确保审计日志的完整性和不可篡改性
自动化审计日志分析
- 使用集中式日志管理平台
- 设置审计日志告警规则
- 定期生成审计日志报告
- 自动化异常检测和响应
定期审查审计日志
- 建立审计日志审查流程
- 定期审查审计日志,发现安全问题
- 记录审查结果和发现的问题
- 及时处理发现的安全问题
结合其他安全措施
- 与防火墙、入侵检测系统结合
- 与身份认证和授权系统结合
- 与数据加密和脱敏技术结合
- 建立全面的数据库安全体系
通过合理配置和有效使用 MariaDB 审计日志,可以提高数据库的安全性,满足合规要求,及时发现和处理安全事件,保护企业的数据资产。
