外观
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_facility | Syslog 设备 | LOG_USER |
server_audit_syslog_ident | Syslog 标识符 | mysql-server_auditing |
server_audit_syslog_info | Syslog 额外信息 | 空 |
server_audit_syslog_priority | Syslog 优先级 | 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_DDL | DDL 操作事件 |
| QUERY_DML | DML 操作事件 |
| QUERY_DCL | DCL 操作事件 |
| QUERY_DML_NO_SELECT | 除 SELECT 外的 DML 操作事件 |
| QUERY_DDL_DCL | DDL 和 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,0JSON 格式
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) 系统
- 定期进行安全审计和渗透测试
常见问题
审计日志过大?
解决方法:
- 只审计必要的事件类型
- 配置合理的日志轮换策略
- 定期压缩和清理旧的日志文件
- 考虑使用外部日志管理系统
审计影响性能?
解决方法:
- 只审计必要的事件类型
- 避免审计过多的用户和对象
- 配置合理的日志轮换策略
- 使用高性能的存储设备存储审计日志
如何审计特定用户的活动?
解决方法:
- 使用
server_audit_incl_users参数指定要审计的用户 - 使用
server_audit_excl_users参数指定不审计的用户 - 配置细粒度的审计规则
如何审计 DDL 操作?
解决方法:
- 在
server_audit_events参数中添加QUERY_DDL或TABLE_DDL - 配置审计规则,记录所有 DDL 操作
- 定期审查 DDL 审计日志
如何将审计日志发送到远程服务器?
解决方法:
- 配置
server_audit_syslog_facility参数,将日志发送到 Syslog 服务器 - 使用外部工具,如 rsyslog、Logstash 等,将日志发送到远程服务器
- 使用云服务,如 AWS CloudWatch、Azure Monitor 等
故障排除
审计日志不生成?
解决方法:
- 检查
server_audit_logging参数是否设置为 ON - 检查插件是否已正确安装
- 检查日志文件路径和权限是否正确
- 查看错误日志,了解具体失败原因
审计日志包含敏感信息?
解决方法:
- 配置审计规则,避免记录敏感信息
- 使用数据脱敏技术处理审计日志
- 限制审计日志的访问权限
审计插件加载失败?
解决方法:
- 检查 MariaDB 版本是否支持该插件
- 检查插件文件是否存在
- 查看错误日志,了解具体失败原因
- 确保插件文件权限正确
审计日志格式不正确?
解决方法:
- 检查
server_audit_json_file参数是否正确设置 - 确保日志文件没有被损坏
- 重新配置审计插件
结论
审计是 MariaDB 安全的重要组成部分,通过配置审计插件,可以记录和监控数据库活动,满足合规要求,及时发现和响应安全事件。在生产环境中,建议使用 server_audit 插件,配置合理的审计规则,保护审计日志的安全,定期监控和分析审计日志。
定期测试审计功能,结合其他安全措施,建立完善的安全体系,是确保 MariaDB 数据库安全的关键。通过实施这些最佳实践,可以显著提高 MariaDB 数据库的安全性,保护企业数据资产,满足合规要求。
