Skip to content

MariaDB 审计日志配置与分析

审计日志概述

什么是审计日志

审计日志是 MariaDB 记录数据库活动的日志文件,包含了用户登录、查询执行、权限变更等重要操作信息,是实现安全审计和合规要求的重要工具。

审计日志的作用

  • 安全审计:记录所有数据库活动,便于追踪和分析安全事件
  • 合规要求:满足 PCI DSS、HIPAA、GDPR 等合规标准
  • 故障排查:帮助定位和分析数据库故障
  • 性能分析:识别异常查询和性能瓶颈
  • 责任追溯:确定特定操作的执行人和时间

审计日志与其他日志的区别

日志类型主要用途记录内容特点
错误日志故障排查系统错误、警告信息记录系统级事件
慢查询日志性能优化执行时间超过阈值的查询记录慢查询语句
Binlog数据恢复、主从复制所有数据修改操作记录数据变更
审计日志安全审计、合规所有数据库活动,包括查询和管理操作记录详细的用户活动

审计日志解决方案

MariaDB 审计插件

MariaDB 提供了多种审计插件,常用的有:

  1. Server Audit Plugin(推荐)

    • MariaDB 官方支持的审计插件
    • 功能全面,配置灵活
    • 支持多种审计格式
  2. Audit Plugin for MariaDB(Percona)

    • Percona 提供的审计插件
    • 与 Server Audit Plugin 兼容
    • 增加了一些额外功能
  3. MariaDB Enterprise Audit

    • 商业版 MariaDB 提供的审计解决方案
    • 更高级的功能和支持

Server Audit Plugin 配置

安装审计插件

  1. 检查插件是否已安装
sql
SHOW PLUGINS LIKE 'server_audit';
  1. 安装审计插件
sql
-- 安装 Server Audit Plugin
INSTALL PLUGIN server_audit SONAME 'server_audit.so';

-- 验证插件安装
SHOW PLUGINS LIKE 'server_audit';
  1. 卸载审计插件
sql
UNINSTALL PLUGIN server_audit;

配置参数

参数名称默认值描述
server_audit_loggingOFF是否启用审计日志
server_audit_eventsCONNECT,QUERY,TABLE审计事件类型
server_audit_excl_users(空)排除的审计用户
server_audit_incl_users(空)包含的审计用户
server_audit_file_pathserver_audit.log审计日志文件路径
server_audit_file_rotate_size1000000审计日志文件轮换大小
server_audit_file_rotations9审计日志文件轮换次数
server_audit_file_rotate_nowOFF立即轮换审计日志文件
server_audit_file_permissions0640审计日志文件权限
server_audit_loggingOFF是否启用审计日志
server_audit_mode0审计模式
server_audit_output_typeFILE审计日志输出类型(FILE/SYSLOG)
server_audit_syslog_facilityLOG_USERsyslog 设施
server_audit_syslog_identmysql-server_auditingsyslog 标识符
server_audit_syslog_info(空)syslog 附加信息
server_audit_syslog_priorityLOG_INFOsyslog 优先级
server_audit_query_log_limit1024审计查询日志长度限制

配置示例

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_DDLDDL 语句(CREATE, ALTER, DROP 等)
QUERY_DMLDML 语句(INSERT, UPDATE, DELETE 等)
QUERY_DCLDCL 语句(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

日志轮换

  1. 自动轮换

    • 当审计日志文件达到 server_audit_file_rotate_size 时,自动轮换
    • 保留 server_audit_file_rotations 个旧日志文件
  2. 手动轮换

sql
-- 立即轮换审计日志文件
SET GLOBAL server_audit_file_rotate_now = ON;
  1. 使用 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 审计日志:

  1. 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
  1. pt-query-digest
bash
# 使用 pt-query-digest 分析审计日志
pt-query-digest --type audit /var/log/mariadb/server_audit.log
  1. ELK Stack
  • 使用 Logstash 收集和解析审计日志
  • 存储到 Elasticsearch
  • 使用 Kibana 进行可视化分析和告警

常见安全事件分析

  1. 多次失败登录尝试
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
  1. 权限变更操作
bash
# 查找 GRANT 和 REVOKE 操作
grep -i "grant\|revoke" /var/log/mariadb/server_audit.log
  1. 表结构变更
bash
# 查找 CREATE, ALTER, DROP 操作
grep -i "create\|alter\|drop" /var/log/mariadb/server_audit.log
  1. 数据删除操作
bash
# 查找 DELETE 操作
grep -i "delete" /var/log/mariadb/server_audit.log
  1. 敏感数据访问
bash
# 查找访问敏感表的操作
grep "sensitive_table" /var/log/mariadb/server_audit.log

审计日志与合规

合规要求

  1. PCI DSS

    • 要求记录所有访问卡holder数据的操作
    • 审计日志至少保留 1 年,可查询 3 个月
    • 定期审查审计日志
  2. HIPAA

    • 要求记录所有电子保护健康信息(ePHI)的访问
    • 审计日志至少保留 6 年
    • 定期审查和分析审计日志
  3. GDPR

    • 要求记录个人数据的处理活动
    • 审计日志保留时间根据数据类型和用途而定
    • 确保审计日志的完整性和可靠性

合规最佳实践

  1. 全面审计

    • 审计所有用户的所有操作
    • 记录足够详细的信息,便于追溯
    • 确保审计日志的完整性和不可篡改性
  2. 定期审查

    • 每周或每月审查审计日志
    • 自动化审计日志分析,及时发现异常
    • 记录审查结果和发现的问题
  3. 安全存储

    • 将审计日志存储在安全的位置
    • 限制审计日志的访问权限
    • 考虑加密审计日志
  4. 及时响应

    • 建立审计日志告警机制
    • 对异常事件及时响应和处理
    • 记录事件响应过程和结果

审计日志性能优化

优化配置

  1. 只审计必要的事件

    • 根据业务需求选择合适的审计事件类型
    • 避免审计不必要的事件,减少日志量
  2. 限制审计用户

    • 使用 server_audit_incl_usersserver_audit_excl_users 限制审计用户
    • 只审计关键用户和操作
  3. 优化日志存储

    • 将审计日志存储在高性能磁盘上
    • 考虑将审计日志与数据文件分开存储
    • 调整日志轮换参数,避免频繁轮换
  4. 合理设置日志长度限制

    • 根据需要调整 server_audit_query_log_limit 参数
    • 避免记录过长的查询语句

性能监控

  1. 监控审计日志对性能的影响

    • 比较启用和禁用审计日志时的系统性能
    • 监控审计日志写入的 I/O 开销
    • 定期评估审计日志的性能影响
  2. 调整审计策略

    • 根据性能监控结果调整审计策略
    • 在性能和审计完整性之间取得平衡
    • 考虑使用采样审计,减少性能影响

常见问题(FAQ)

Q: 如何启用 MariaDB 审计日志?

A: 启用步骤:

  • 安装 Server Audit Plugin
  • 配置审计参数
  • 启用审计日志
  • 验证审计日志是否正常记录

Q: 审计日志对性能有影响吗?

A: 审计日志会对性能产生一定影响,主要取决于:

  • 审计事件类型的数量
  • 审计用户的数量
  • 系统负载
  • 存储性能 建议根据业务需求和性能要求调整审计策略,只审计必要的事件和用户。

Q: 如何确保审计日志的安全性?

A: 确保审计日志安全性的方法:

  • 设置正确的文件权限,限制访问
  • 将审计日志存储在安全的位置
  • 考虑加密审计日志
  • 定期备份审计日志
  • 确保审计日志的完整性和不可篡改性

Q: 如何处理大量的审计日志?

A: 处理大量审计日志的方法:

  • 优化审计策略,减少日志量
  • 使用集中式日志管理平台
  • 定期清理旧的审计日志
  • 考虑使用采样审计
  • 对审计日志进行压缩存储

Q: 如何审计 MariaDB Galera Cluster?

A: 审计 Galera Cluster 的方法:

  • 在每个节点上启用审计日志
  • 使用集中式日志管理平台收集所有节点的审计日志
  • 确保审计配置在所有节点上一致
  • 特别关注集群级别的操作

最佳实践

  1. 合理配置审计策略

    • 根据业务需求和合规要求选择审计事件类型
    • 只审计必要的用户和操作
    • 定期评估和调整审计策略
  2. 确保审计日志的安全性

    • 限制审计日志的访问权限
    • 加密审计日志的传输和存储
    • 定期备份审计日志
    • 确保审计日志的完整性和不可篡改性
  3. 自动化审计日志分析

    • 使用集中式日志管理平台
    • 设置审计日志告警规则
    • 定期生成审计日志报告
    • 自动化异常检测和响应
  4. 定期审查审计日志

    • 建立审计日志审查流程
    • 定期审查审计日志,发现安全问题
    • 记录审查结果和发现的问题
    • 及时处理发现的安全问题
  5. 结合其他安全措施

    • 与防火墙、入侵检测系统结合
    • 与身份认证和授权系统结合
    • 与数据加密和脱敏技术结合
    • 建立全面的数据库安全体系

通过合理配置和有效使用 MariaDB 审计日志,可以提高数据库的安全性,满足合规要求,及时发现和处理安全事件,保护企业的数据资产。