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.cnfmy.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_DDLTABLE_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 数据库的安全性,保护企业数据资产,满足合规要求。