Skip to content

MariaDB 审计与合规 ​

审计概述 ​

审计是指对数据库活动进行记录和监控,以便在发生安全事件时进行调查和分析。MariaDB 审计功能可以记录:

  • 用户登录和退出事件
  • DDL(数据定义语言)操作
  • DML(数据操作语言)操作
  • 权限变更操作
  • 系统配置变更
  • 错误和警告信息

审计插件 ​

内置审计插件 ​

MariaDB 提供了多种审计插件:

  • server_audit:功能全面的审计插件,支持多种审计事件类型
  • audit_log:MySQL 兼容的审计插件
  • mariadb_audit:MariaDB 特有的审计插件
  • audit_filter:提供细粒度审计规则的插件

第三方审计插件 ​

  • McAfee MySQL Audit Plugin:McAfee 提供的审计插件
  • Oracle MySQL Enterprise Audit:Oracle 提供的企业级审计插件

server_audit 插件 ​

概述 ​

server_audit 是 MariaDB 最常用的审计插件,支持多种审计事件类型和灵活的配置选项。

安装插件 ​

sql
-- 安装 server_audit 插件
INSTALL SONAME 'server_audit';

-- 检查插件状态
SHOW PLUGINS LIKE 'server_audit';

配置参数 ​

参数名描述默认值
server_audit_logging是否启用审计日志OFF
server_audit_events要审计的事件类型CONNECT,QUERY,TABLE
server_audit_incl_users要审计的用户列表空(审计所有用户)
server_audit_excl_users不审计的用户列表空(审计所有用户)
server_audit_log_file审计日志文件路径server_audit.log
server_audit_file_rotate_size日志文件轮换大小(字节)1000000
server_audit_file_rotations日志文件保留数量9
server_audit_file_rotate_now是否立即轮换日志文件OFF
server_audit_file_rotate_current当前日志文件编号0
server_audit_json_file是否使用 JSON 格式记录日志OFF
server_audit_syslog_facilitySyslog 设备LOG_USER
server_audit_syslog_identSyslog 标识符mysql-server_auditing
server_audit_syslog_infoSyslog 额外信息空
server_audit_syslog_prioritySyslog 优先级LOG_INFO

配置示例 ​

在 my.cnf 或 my.ini 文件中添加以下配置:

ini
[mysqld]
# 审计插件配置
plugin-load-add = server_audit.so
server_audit_logging = ON
server_audit_events = CONNECT,QUERY,TABLE,QUERY_DDL,QUERY_DML
server_audit_incl_users = admin,root
server_audit_excl_users = 'mysql.session','mysql.sys'
server_audit_log_file = /var/log/mysql/server_audit.log
server_audit_file_rotate_size = 10485760
server_audit_file_rotations = 10
server_audit_json_file = ON

动态配置 ​

可以通过 SET GLOBAL 语句动态修改部分审计配置:

sql
SET GLOBAL server_audit_logging = ON;
SET GLOBAL server_audit_events = 'CONNECT,QUERY,TABLE,QUERY_DDL,QUERY_DML';
SET GLOBAL server_audit_file_rotate_now = ON;

审计事件类型 ​

事件类型描述
CONNECT连接和断开连接事件
QUERY所有查询事件
TABLE表级操作事件
QUERY_DDLDDL 操作事件
QUERY_DMLDML 操作事件
QUERY_DCLDCL 操作事件
QUERY_DML_NO_SELECT除 SELECT 外的 DML 操作事件
QUERY_DDL_DCLDDL 和 DCL 操作事件
QUERY_ALL所有查询事件(包括 DDL、DML、DCL)
STATUS状态变量变更事件
VARIABLE系统变量变更事件
GENERAL通用事件
TABLE_DDL表级 DDL 操作事件
TABLE_DML表级 DML 操作事件
TABLE_DML_NO_SELECT表级除 SELECT 外的 DML 操作事件
TABLE_ALL所有表级操作事件

审计日志格式 ​

文本格式 ​

文本格式的审计日志示例:

20230101 10:00:00,server1,root,localhost,1,100,CONNECT,,,0
20230101 10:00:05,server1,root,localhost,1,101,QUERY,,'SELECT * FROM users',0
20230101 10:00:10,server1,root,localhost,1,102,TABLE,test,users,SELECT,0

JSON 格式 ​

JSON 格式的审计日志示例:

json
{"timestamp":"2023-01-01T10:00:00+00:00","server":"server1","username":"root","host":"localhost","connection_id":1,"query_id":100,"event":"CONNECT","sqltext":"","status":0}
{"timestamp":"2023-01-01T10:00:05+00:00","server":"server1","username":"root","host":"localhost","connection_id":1,"query_id":101,"event":"QUERY","sqltext":"SELECT * FROM users","status":0}
{"timestamp":"2023-01-01T10:00:10+00:00","server":"server1","username":"root","host":"localhost","connection_id":1,"query_id":102,"event":"TABLE","database":"test","table":"users","sqltext":"SELECT","status":0}

审计日志管理 ​

日志轮换 ​

server_audit 插件支持自动日志轮换,配置参数包括:

  • server_audit_file_rotate_size:单个日志文件的最大大小
  • server_audit_file_rotations:保留的日志文件数量
  • server_audit_file_rotate_now:立即轮换日志文件

日志压缩 ​

可以使用外部工具压缩旧的审计日志文件:

bash
# 压缩旧的审计日志文件
gzip /var/log/mysql/server_audit.log.1

# 自动压缩日志文件
find /var/log/mysql -name "server_audit.log.*" -type f -exec gzip {} \;

日志清理 ​

可以使用 cron 作业定期清理旧的审计日志文件:

bash
# 保留最近 30 天的日志文件
find /var/log/mysql -name "server_audit.log.*" -type f -mtime +30 -delete

日志监控 ​

可以使用监控工具监控审计日志,如:

  • ELK Stack:Elasticsearch、Logstash、Kibana
  • Graylog:日志管理和分析平台
  • Splunk:企业级日志管理平台
  • Prometheus + Grafana:监控和可视化平台

合规要求 ​

GDPR 合规 ​

GDPR 要求企业:

  • 记录数据处理活动
  • 提供数据主体访问其个人数据的能力
  • 及时报告数据泄露
  • 实施适当的技术和组织措施保护个人数据

HIPAA 合规 ​

HIPAA 要求医疗机构:

  • 保护电子受保护健康信息 (ePHI)
  • 实施访问控制和审计
  • 定期进行风险评估
  • 制定应急响应计划

PCI DSS 合规 ​

PCI DSS 要求处理信用卡信息的企业:

  • 安装和维护防火墙配置
  • 不使用供应商提供的默认密码
  • 保护存储的持卡人数据
  • 加密传输中的持卡人数据
  • 使用和定期更新防病毒软件
  • 开发和维护安全的系统和应用程序
  • 实施强访问控制措施
  • 定期测试安全系统和流程
  • 维护信息安全政策

审计最佳实践 ​

1. 制定审计策略 ​

  • 明确审计目标和范围
  • 确定需要审计的事件类型
  • 确定需要审计的用户和对象
  • 制定审计日志的保留和销毁策略

2. 配置合理的审计规则 ​

  • 只审计必要的事件类型,避免日志过大
  • 审计敏感用户和敏感对象
  • 避免审计过多的普通用户活动
  • 定期审查和更新审计规则

3. 保护审计日志 ​

  • 限制审计日志的访问权限
  • 将审计日志存储在安全的位置
  • 考虑将审计日志发送到远程服务器
  • 定期备份审计日志
  • 加密审计日志文件

4. 监控和分析审计日志 ​

  • 定期审查审计日志
  • 使用自动化工具分析审计日志
  • 建立异常检测机制
  • 及时处理审计日志中的异常事件

5. 定期测试审计功能 ​

  • 测试审计日志的生成和存储
  • 测试审计规则的有效性
  • 测试审计日志的恢复
  • 测试审计功能的性能影响

6. 结合其他安全措施 ​

  • 结合访问控制和加密
  • 结合入侵检测和防御系统
  • 结合安全信息和事件管理 (SIEM) 系统
  • 定期进行安全审计和渗透测试

常见问题 ​

审计日志过大? ​

解决方法:

  1. 只审计必要的事件类型
  2. 配置合理的日志轮换策略
  3. 定期压缩和清理旧的日志文件
  4. 考虑使用外部日志管理系统

审计影响性能? ​

解决方法:

  1. 只审计必要的事件类型
  2. 避免审计过多的用户和对象
  3. 配置合理的日志轮换策略
  4. 使用高性能的存储设备存储审计日志

如何审计特定用户的活动? ​

解决方法:

  1. 使用 server_audit_incl_users 参数指定要审计的用户
  2. 使用 server_audit_excl_users 参数指定不审计的用户
  3. 配置细粒度的审计规则

如何审计 DDL 操作? ​

解决方法:

  1. 在 server_audit_events 参数中添加 QUERY_DDL 或 TABLE_DDL
  2. 配置审计规则,记录所有 DDL 操作
  3. 定期审查 DDL 审计日志

如何将审计日志发送到远程服务器? ​

解决方法:

  1. 配置 server_audit_syslog_facility 参数,将日志发送到 Syslog 服务器
  2. 使用外部工具,如 rsyslog、Logstash 等,将日志发送到远程服务器
  3. 使用云服务,如 AWS CloudWatch、Azure Monitor 等

故障排除 ​

审计日志不生成? ​

解决方法:

  1. 检查 server_audit_logging 参数是否设置为 ON
  2. 检查插件是否已正确安装
  3. 检查日志文件路径和权限是否正确
  4. 查看错误日志,了解具体失败原因

审计日志包含敏感信息? ​

解决方法:

  1. 配置审计规则,避免记录敏感信息
  2. 使用数据脱敏技术处理审计日志
  3. 限制审计日志的访问权限

审计插件加载失败? ​

解决方法:

  1. 检查 MariaDB 版本是否支持该插件
  2. 检查插件文件是否存在
  3. 查看错误日志,了解具体失败原因
  4. 确保插件文件权限正确

审计日志格式不正确? ​

解决方法:

  1. 检查 server_audit_json_file 参数是否正确设置
  2. 确保日志文件没有被损坏
  3. 重新配置审计插件

结论 ​

审计是 MariaDB 安全的重要组成部分,通过配置审计插件,可以记录和监控数据库活动,满足合规要求,及时发现和响应安全事件。在生产环境中,建议使用 server_audit 插件,配置合理的审计规则,保护审计日志的安全,定期监控和分析审计日志。

定期测试审计功能,结合其他安全措施,建立完善的安全体系,是确保 MariaDB 数据库安全的关键。通过实施这些最佳实践,可以显著提高 MariaDB 数据库的安全性,保护企业数据资产,满足合规要求。