14.9.3 审计日志与合规性设置

审计日志与合规性设置的目标是“可追溯、可审计、可留存、可取证”。本节从采集、存储、检索、留存与销毁、权限隔离五个维度落地,并给出可执行示例、排错与练习。

原理草图(审计数据流)

文章图片

审计范围与分级策略#

  • 必审:登录/认证、用户与权限变更、路由规则变更、管理端口访问、连接异常/拒绝访问。
  • 可选:查询执行记录(按用户/库表/IP/操作类型过滤)。
  • 分级:核心业务库全量审计;非核心库按规则抽样,降低性能影响。

采集与配置示例(ProxySQL 管理端)#

1) 连接管理端并确认运行/持久化表#

# 连接 ProxySQL 管理端
mysql -h 127.0.0.1 -P6032 -u admin -padmin -e "select version()"

# 查看运行时与磁盘配置表
mysql -h 127.0.0.1 -P6032 -u admin -padmin -e "
show tables from main;
show tables from disk;"

2) 记录管理端口操作(配置变更审计)#

将所有管理端操作记录入 stats/日志,确保变更可追溯:

-- 进入管理端
mysql -h 127.0.0.1 -P6032 -u admin -padmin

-- 启用详细日志(示例:提高审计可见性)
SET admin_variables='admin-log=true';
LOAD ADMIN VARIABLES TO RUNTIME;
SAVE ADMIN VARIABLES TO DISK;

-- 查询管理端访问日志/统计表(不同版本表名可能不同)
SELECT * FROM stats_mysql_admin_connections ORDER BY time_start DESC LIMIT 5;

说明
- LOAD ... TO RUNTIME:立即生效
- SAVE ... TO DISK:持久化,避免重启丢失


查询审计与过滤示例#

以最小化性能影响为目标,基于用户与库名进行过滤:

-- 设置审计开关(示例为逻辑,具体变量以版本为准)
SET mysql-auditlog_enabled=1;
SET mysql-auditlog_filter_user='app_user';
SET mysql-auditlog_filter_db='core_db';
LOAD MYSQL VARIABLES TO RUNTIME;
SAVE MYSQL VARIABLES TO DISK;

预期效果
仅记录 app_usercore_db 的查询审计日志,避免全量日志。


日志存储与安全(本地落盘 + 集中转发)#

1) 本地日志目录与权限#

# 创建专用目录与最小权限
mkdir -p /var/log/proxysql/audit
chown proxysql:proxysql /var/log/proxysql/audit
chmod 750 /var/log/proxysql/audit

2) rsyslog 转发到集中平台(示例)#

# /etc/rsyslog.d/50-proxysql-audit.conf
if $programname == 'proxysql' then /var/log/proxysql/audit/proxysql-audit.log
& stop

# 转发到日志平台
*.* @@logserver.example.com:514
# 重启 rsyslog
systemctl restart rsyslog

合规性与留存策略(示例)#

  • 留存周期:90/180/365 天(按等保/行业监管要求)。
  • 归档与销毁:过期日志加密归档,销毁需审批记录。
# 归档与加密(示例)
tar czf /backup/proxysql-audit-$(date +%F).tgz /var/log/proxysql/audit
gpg --batch --yes -c /backup/proxysql-audit-$(date +%F).tgz

排错指南#

1) 审计日志无输出#

# 检查变量是否生效(运行时)
mysql -h 127.0.0.1 -P6032 -u admin -padmin -e "select * from global_variables where variable_name like '%audit%';"

# 检查文件权限与目录是否存在
ls -ld /var/log/proxysql/audit

可能原因:
- 未执行 LOAD ... TO RUNTIME
- 日志路径权限不足
- 过滤条件过严导致无命中

2) 审计日志量过大#

  • 收紧过滤:按用户、库、IP、操作类型筛选。
  • 调整抽样:非核心库按规则采样。

练习#

  1. 创建审计目录 /var/log/proxysql/audit,并配置 rsyslog 将 proxysql 日志转发到本地文件。验证日志可写入。
  2. 配置审计过滤,仅记录 app_usercore_dbUPDATE/DELETE 操作,执行测试 SQL 并验证日志命中。
  3. 模拟一次管理端变更(修改路由规则),检查 stats_mysql_admin_connections 是否记录。
  4. 编写一个 audit-archive.sh 脚本,对 7 天前的日志进行压缩和加密归档。