6.4.7 审计合规:策略、工具与留存规范

审计合规的目标是在满足法规与内控要求的前提下,确保数据库访问、变更与敏感操作全程可追溯、不可抵赖、可快速取证。本节从策略、工具与留存规范三个层面建立可执行的审计体系,并提供可落地的安装、配置、排错与演练示例。

一、审计策略设计
- 审计范围:登录/登出、权限变更、DDL/DCL、敏感表DML、账户与密码策略变更、备份与导出操作、审计日志自身访问与清理。
- 分级合规:按业务敏感度划分级别(核心、重要、一般),核心库启用强审计与最小留存间隔加密。
- 最小可用性影响:避免全量 general log 导致性能抖动,优先采用插件审计或代理层审计。
- 行为基线:建立白名单操作与时间窗口,异常操作触发告警与自动化冻结。
- 职责分离:DBA、审计员、运维人员权限隔离,审计数据只读访问。

二、原理草图与架构

文章图片

三、工具与落地路径(含安装与示例)
- 插件审计(MariaDB Audit Plugin 示例)
适用于 MySQL 社区版 + 兼容审计插件场景,重点审计 CONNECT/DISCONNECT/QUERY_DDL/QUERY_DCL。
1)安装与启用(基于 Yum 包示例):
```bash
# 安装插件包(视发行版名称可能不同)
sudo yum install -y MariaDB-audit

# 在 MySQL 中安装插件
mysql -uroot -p -e "INSTALL PLUGIN server_audit SONAME 'server_audit.so';"
mysql -uroot -p -e "SHOW PLUGINS LIKE 'server_audit%';"
2)配置(/etc/my.cnf):ini
[mysqld]
server_audit_logging=ON
server_audit_events=CONNECT,QUERY_DDL,QUERY_DCL
server_audit_output_type=FILE
server_audit_file_path=/var/log/mysql/audit.log
server_audit_file_rotate_size=1G
server_audit_file_rotations=10
3)重载并验证:bash
sudo systemctl restart mysqld
mysql -uroot -p -e "SHOW VARIABLES LIKE 'server_audit%';"

# 触发审计事件
mysql -uroot -p -e "CREATE USER 'audit_t'@'%' IDENTIFIED BY 'P@ssw0rd!';"
mysql -uroot -p -e "GRANT SELECT ON . TO 'audit_t'@'%';"

# 查看日志
sudo tail -n 5 /var/log/mysql/audit.log
```
预期效果:日志中出现 CONNECT 与 QUERY_DDL/QUERY_DCL 事件记录,包含用户、来源 IP、时间戳。

  • 代理层审计(ProxySQL 简化示例)
    适用于多实例统一审计与规则命中统计,降低主库性能影响。
    1)安装:
    bash sudo yum install -y proxysql sudo systemctl enable --now proxysql
    2)写入审计规则并持久化:
    ```bash
    # 登录 ProxySQL 管理端口
    mysql -uadmin -padmin -h127.0.0.1 -P6032

-- 规则:记录 DDL / DCL / 敏感表 DML
INSERT INTO mysql_query_rules (rule_id, active, match_pattern, log, apply)
VALUES
(100, 1, '^\s(CREATE|ALTER|DROP)\s+', 1, 1),
(101, 1, '^\s
(GRANT|REVOKE)\s+', 1, 1),
(102, 1, '^\s(INSERT|UPDATE|DELETE)\s+.(sensitive_table)', 1, 1);

LOAD MYSQL QUERY RULES TO RUNTIME;
SAVE MYSQL QUERY RULES TO DISK;
3)查看审计命中日志(示例路径可能为 /var/lib/proxysql/proxysql.log):bash
sudo grep -E "rule_id=10[0-2]" /var/lib/proxysql/proxysql.log | tail -n 10
```
预期效果:日志中出现规则 ID 命中记录,包含 SQL 摘要与来源会话。

  • 日志集中化(Filebeat 示例)
    ```bash
    sudo yum install -y filebeat

sudo tee /etc/filebeat/filebeat.yml >/dev/null <<'EOF'
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/mysql/audit.log
- /var/lib/proxysql/proxysql.log
fields:
env: prod
app: mysql-audit
fields_under_root: true

output.elasticsearch:
hosts: ["http://10.0.0.10:9200"]
index: "mysql-audit-%{+yyyy.MM.dd}"
EOF

sudo systemctl enable --now filebeat
sudo filebeat test output
`` **预期效果**:Elasticsearch 中出现mysql-audit-*` 索引,日志可检索。

四、留存规范与存储安全(含命令)
- 留存周期:一般 6–12 个月,金融/政务 3–5 年;设分层存储:热 7–30 天、温 3–6 个月、冷归档。
- 不可篡改:WORM/对象存储版本控制;审计日志写入与管理分离。
- 脱敏与最小披露:敏感字段脱敏或仅记录元数据(表名/主键/行数)。
- 归档与清理流程:归档前压缩、加密、生成索引;清理需双人审批与留痕。

示例:本地归档 + 加密 + 校验

# 每日归档(示例)
ARCHIVE_DIR=/data/audit-archive/$(date +%F)
sudo mkdir -p "$ARCHIVE_DIR"

# 压缩
sudo gzip -c /var/log/mysql/audit.log > "$ARCHIVE_DIR/audit.log.gz"

# 加密(使用对称密钥)
openssl enc -aes-256-cbc -salt \
  -in "$ARCHIVE_DIR/audit.log.gz" \
  -out "$ARCHIVE_DIR/audit.log.gz.enc" \
  -pass file:/etc/audit/audit.key

# 生成校验和
sha256sum "$ARCHIVE_DIR/audit.log.gz.enc" > "$ARCHIVE_DIR/audit.log.gz.enc.sha256"

预期效果:归档目录包含加密文件与校验文件,便于取证验证完整性。

五、排错与常见问题定位
- 审计日志无输出
- 检查插件加载:
bash mysql -uroot -p -e "SHOW PLUGINS LIKE 'server_audit%';"
- 检查配置是否生效:
bash mysql -uroot -p -e "SHOW VARIABLES LIKE 'server_audit%';"
- 检查文件权限:
bash sudo ls -l /var/log/mysql/audit.log sudo chown mysql:mysql /var/log/mysql/audit.log
- 性能抖动
- 缩小审计事件范围:
bash mysql -uroot -p -e "SET GLOBAL server_audit_events='CONNECT,QUERY_DDL,QUERY_DCL';"
- 评估将 DML 仅限敏感表(代理层规则过滤)。
- 日志轮转失败
- 确认 rotate 参数与目录空间:
bash df -h /var/log/mysql mysql -uroot -p -e "SHOW VARIABLES LIKE 'server_audit_file_rotate%';"

六、演练与取证示例
- 审计回溯:查找高权限账户操作
bash # 过滤出 root / dba 的 DDL/DCL sudo grep -E "user=(root|dba).*QUERY_(DDL|DCL)" /var/log/mysql/audit.log | tail -n 20
- 时间窗口异常操作
bash # 过滤凌晨 00:00-05:00 的操作(示例) awk '$1 ~ /^2024-.*(00|01|02|03|04|05):/' /var/log/mysql/audit.log | head

七、练习与检查清单
1. 启用审计插件,仅记录 CONNECT/QUERY_DDL/QUERY_DCL,执行建用户与授权操作并验证日志记录。
2. 在 ProxySQL 中添加一条敏感表 DML 审计规则,执行 UPDATE 并验证命中日志。
3. 使用 Filebeat 将审计日志发送至 ELK,完成一次关键词检索截图留存。
4. 完成一次归档加密与校验,验证校验和一致性。
5. 编写一条“异常时间窗口操作”告警规则,并模拟触发。