Skip to content

MySQL 审计日志插件

审计日志的概念与作用

审计日志是记录数据库操作的重要工具,用于监控和审计数据库的访问和操作行为。MySQL 审计日志插件允许记录所有或特定的数据库操作,帮助管理员满足合规性要求,检测安全威胁,并进行故障排查。

审计日志插件的类型

1. MySQL Enterprise Audit

MySQL Enterprise Audit 是 MySQL 企业版提供的官方审计插件,功能全面,性能优秀。

特点

  • 支持细粒度的审计策略
  • 高性能,对数据库性能影响小
  • 支持多种输出格式
  • 与 MySQL Enterprise Monitor 集成
  • 支持审计日志的加密和压缩

2. MariaDB Audit Plugin

MariaDB Audit Plugin 是 MariaDB 开发的审计插件,也可以在 MySQL 中使用。

特点

  • 开源免费
  • 易于安装和配置
  • 支持多种审计事件类型
  • 支持输出到文件或系统日志

3. Percona Audit Log Plugin

Percona Audit Log Plugin 是 Percona Server 提供的审计插件,也可以在 MySQL 中使用。

特点

  • 开源免费
  • 支持 JSON 格式输出
  • 高性能设计
  • 支持细粒度的审计规则

MariaDB Audit Plugin 的安装与配置

1. 安装插件

从 MariaDB 下载插件

  • 从 MariaDB 官方网站下载对应版本的插件文件 server_audit.so
  • 将插件文件复制到 MySQL 的插件目录

安装插件

sql
INSTALL PLUGIN server_audit SONAME 'server_audit.so';

验证插件安装

sql
SHOW PLUGINS LIKE 'server_audit';

2. 基本配置

启用审计日志

sql
SET GLOBAL server_audit_logging = ON;

配置审计事件类型

sql
-- 审计所有事件
SET GLOBAL server_audit_events = 'CONNECT,QUERY,TABLE';

-- 仅审计特定事件
SET GLOBAL server_audit_events = 'CONNECT,QUERY_DDL,QUERY_DML';

配置审计日志文件

sql
-- 日志文件路径
SET GLOBAL server_audit_file_path = '/var/lib/mysql/server_audit.log';

-- 日志文件大小限制(字节)
SET GLOBAL server_audit_file_rotate_size = 1000000;

-- 日志文件保留数量
SET GLOBAL server_audit_file_rotations = 10;

3. 配置文件永久生效

在 MySQL 配置文件中添加以下配置,使配置永久生效:

ini
[mysqld]
# 审计日志插件配置
server_audit_logging = ON
server_audit_events = 'CONNECT,QUERY,TABLE'
server_audit_file_path = '/var/lib/mysql/server_audit.log'
server_audit_file_rotate_size = 1000000
server_audit_file_rotations = 10
server_audit_incl_users = ''
server_audit_excl_users = ''

审计日志的内容与格式

1. 审计日志格式

MariaDB Audit Plugin 的日志格式示例:

20230515 14:30:45,localhost,root,localhost,1,0,QUERY,test,'SELECT * FROM users',0
20230515 14:31:02,localhost,root,localhost,1,0,TABLE,test,users,READ,SELECT

字段说明

  • 时间戳
  • 服务器名称
  • 用户名
  • 客户端主机
  • 连接 ID
  • 状态码
  • 事件类型
  • 数据库名称
  • 对象名称(如表名)
  • 操作类型(如 READ、WRITE)
  • SQL 语句

2. 审计事件类型

CONNECT 事件

  • 连接建立
  • 连接关闭
  • 认证失败

QUERY 事件

  • SELECT、INSERT、UPDATE、DELETE 语句
  • DDL 语句(CREATE、ALTER、DROP 等)
  • 存储过程和函数的执行

TABLE 事件

  • 表级操作的详细信息
  • 包括操作类型(READ、WRITE)

审计日志的管理与维护

1. 日志轮换与清理

  • 配置自动日志轮换,避免单个日志文件过大
  • 定期清理过期的审计日志,释放磁盘空间
  • 考虑将审计日志归档到外部存储系统

2. 日志安全管理

  • 限制审计日志文件的访问权限,仅允许管理员访问
  • 考虑对审计日志进行加密,保护敏感信息
  • 定期检查审计日志的完整性,防止篡改

3. 性能优化

  • 仅审计必要的事件类型,减少日志量
  • 排除频繁执行的非关键操作
  • 考虑使用高性能的存储设备存储审计日志
  • 定期监控审计日志对数据库性能的影响

审计日志的分析与使用

1. 常见分析场景

安全审计

  • 检测未授权的数据库访问
  • 识别异常的操作模式
  • 发现潜在的 SQL 注入攻击

合规性检查

  • 满足 PCI DSS、HIPAA 等合规性要求
  • 生成审计报告,证明合规性
  • 跟踪敏感数据的访问和修改

故障排查

  • 跟踪导致数据库问题的操作
  • 分析性能问题的根源
  • 重现用户报告的问题

2. 审计日志分析工具

命令行工具

  • grep、awk、sed 等 Linux 命令行工具
  • MySQL Enterprise Monitor

第三方工具

  • ELK Stack(Elasticsearch、Logstash、Kibana)
  • Splunk
  • Graylog

自定义脚本

  • 使用 Python、Perl 等编写自定义分析脚本
  • 提取特定的审计事件
  • 生成自定义报告

MySQL Enterprise Audit 的配置与使用

1. 安装与启用

安装插件

sql
INSTALL PLUGIN audit_log SONAME 'audit_log.so';

启用审计日志

sql
SET GLOBAL audit_log_enabled = ON;

2. 配置审计策略

创建审计策略

sql
CREATE AUDIT POLICY my_audit_policy
  PRIVILEGES
    CREATE, ALTER, DROP,
    SELECT, INSERT, UPDATE, DELETE
  ACTIONS
    ALL;

应用审计策略

sql
ATTACH AUDIT POLICY my_audit_policy TO USERS 'admin', 'root';

查看审计策略

sql
SHOW AUDIT POLICIES;

3. 审计日志格式

MySQL Enterprise Audit 支持多种输出格式,包括:

  • 原生二进制格式(默认)
  • JSON 格式
  • XML 格式

配置输出格式

sql
SET GLOBAL audit_log_format = JSON;

审计日志的最佳实践

1. 审计策略设计

  • 根据业务需求和合规性要求设计审计策略
  • 采用最小权限原则,仅审计必要的事件
  • 对不同用户和角色应用不同的审计策略
  • 定期审查和更新审计策略

2. 性能优化

  • 仅审计关键业务表和敏感数据
  • 排除系统用户和应用程序服务账户的常规操作
  • 考虑在低峰期进行更详细的审计
  • 监控审计日志对数据库性能的影响

3. 安全管理

  • 确保审计日志的完整性和不可篡改性
  • 限制审计日志的访问权限
  • 定期备份审计日志
  • 考虑使用集中式日志管理系统

4. 合规性考虑

  • 了解相关的合规性要求(如 PCI DSS、HIPAA、GDPR)
  • 确保审计日志包含必要的信息
  • 保留审计日志足够长的时间
  • 定期生成合规性报告

审计日志的版本差异

1. MySQL 5.7

  • 支持 MariaDB Audit Plugin
  • 支持 Percona Audit Log Plugin
  • MySQL Enterprise Audit 功能相对简单

2. MySQL 8.0

  • 增强了 MySQL Enterprise Audit 的功能
  • 支持更细粒度的审计策略
  • 支持 JSON 格式输出
  • 提高了审计日志的性能
  • 增强了审计日志的安全性

常见问题(FAQ)

Q1: 审计日志插件会影响数据库性能吗?

A1: 审计日志插件会对数据库性能产生一定影响,影响程度取决于审计的事件类型和数量。合理配置审计策略,仅审计必要的事件,可以将性能影响降到最低。

Q2: 如何选择合适的审计日志插件?

A2: 选择审计日志插件时需要考虑以下因素:

  • 预算限制(企业版 vs 开源版本)
  • 功能需求
  • 性能要求
  • 合规性要求
  • 与现有系统的兼容性

Q3: 如何配置审计日志仅记录特定用户的操作?

A3: 使用 server_audit_incl_users 参数配置需要审计的用户:

sql
SET GLOBAL server_audit_incl_users = 'admin,root';

或者使用 server_audit_excl_users 参数配置不需要审计的用户:

sql
SET GLOBAL server_audit_excl_users = 'application_user';

Q4: 如何查看审计日志的内容?

A4: 可以使用以下方法查看审计日志:

  • 直接查看审计日志文件(适用于文本格式)
  • 使用 MySQL Enterprise Monitor(适用于 MySQL Enterprise Audit)
  • 使用第三方日志分析工具(如 ELK Stack、Splunk)

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

A5: 确保审计日志安全性的措施:

  • 限制审计日志文件的访问权限(chmod 600)
  • 定期备份审计日志到安全的位置
  • 考虑对审计日志进行加密
  • 定期检查审计日志的完整性

Q6: 审计日志应该保留多长时间?

A6: 审计日志的保留时间取决于合规性要求和业务需求:

  • PCI DSS 要求保留至少 1 年
  • HIPAA 要求保留至少 6 年
  • 建议根据业务需求和存储能力合理设置保留时间

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

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

  • 配置自动日志轮换
  • 定期清理过期的审计日志
  • 使用集中式日志管理系统
  • 考虑对审计日志进行压缩存储

Q8: 如何排除特定的操作类型?

A8: 使用 server_audit_excl_commands 参数排除特定的操作类型:

sql
SET GLOBAL server_audit_excl_commands = 'SELECT,SHOW';

或者在 MySQL Enterprise Audit 中创建更细粒度的审计策略,仅包含需要审计的操作类型。