2、审计日志基础:审计日志的概念、审计日志的作用、常见审计日志类型
好,咱们今天聊聊审计日志。很多人一听「审计」两个字,就觉得那是财务或者合规部门的事。其实不然。
说白了,审计日志就是数据库的「黑匣子」。它记录着数据库里发生的每一件「大事小事」——谁登录了、执行了什么 SQL、改了什么数据。没有它,你就像蒙着眼睛开飞机。
2.1 什么是审计日志?
审计日志,本质上是一个带时间戳的、不可篡改的事件记录流。它要回答三个问题:
- 谁(身份、IP、应用名)
- 在什么时候(精确到毫秒)
- 做了什么(SQL 原文、影响行数、返回码)
我记得刚入行那会儿,有次客户说数据被删了。我查了半天,没开审计,根本找不到是谁干的。最后只能恢复备份,损失了 4 个小时的数据。那之后,我养成了一个习惯:任何生产库上线第一件事,就是开审计。
核心要点:审计日志不是监控日志,不是错误日志。它是对「账号行为」的完整追溯,必须做到「已记录、不可改、可回溯」。
2.2 审计日志的作用
为什么要费劲去搞审计日志?原因很实在,我列几个最常见的使用场景:
| 作用 | 说明 | 我见过的问题 |
|---|---|---|
| 合规性 | 满足等保、GDPR、SOX 等法规要求 | 等保测评时,客户被查出未开启审计,直接扣分 |
| 异常检测 | 发现非工作时间登录、批量删除等异常行为 | 凌晨 3 点的全表 DELETE,审计日志直接就发现了 |
| 故障排查 | 定位慢查询、锁冲突、错误操作 | 误操作导致索引被删,审计记录精准锁定责任人 |
| 安全审计 | 追溯数据泄露路径,确认攻击行为 | 撞库攻击不会只试一次,审计日志能看到连续失败 |
| 内部威慑 | 让 DBA 和开发知道操作会被记录 | 有审计后,违规直连生产库的情况明显减少 |
我的建议:千万别等到出事了再开审计。我在项目里见过太多「事后诸葛亮」式的审计日志——等日志开启的时候,攻击者早跑远了。
2.3 常见审计日志类型
审计日志不是只有一种。不同的数据库、不同的需求,要配不同的审计粒度。我个人习惯把审计日志分成以下三大类:
2.3.1 基于数据库内置审计
几乎所有的商业数据库和主流开源数据库都自带审计功能。比如:
- Oracle 的 Audit Vault 和传统的 Fine-Grained Auditing
- MySQL 的 General Log 和 Audit Plugin(如 MariaDB Audit Plugin)
- PostgreSQL 的 pgAudit
- SQL Server 的 Server Audit 和 Database Audit Specification
内置审计的好处是:和数据库深度集成,几乎不额外消耗网络资源。坏处是:可能会拖慢数据库性能,尤其在高并发场景下。我曾经压测过一台 PgSQL,开启 pgAudit 后 TPS 直接降了 15%——所以建议按需开启,别全量审计。
2.3.2 基于网络代理捕获
在数据库和应用层之间插一个代理层,截获所有流量。这种方式对数据库本身零侵入。
- 方案举例:ProxySQL、MaxScale、自研 MySQL Proxy
- 捕获内容:完整 SQL、绑定参数、返回行数
- 适用场景:多数据源、统一审计平台
但要注意,代理层会成为性能瓶颈和单点故障。我在某个千万级 QPS 的场景下踩过坑——流量一上来,Proxy 先扛不住了,直接导致数据库连锁雪崩。
2.3.3 基于操作系统或文件系统审计
审计日志也可以直接来自操作系统层面。
- Linux Auditd:可以监控数据库进程的文件操作、系统调用
- 文件变化监控:监控数据库数据文件的修改操作
- 数据库日志文件本身:比如 MySQL 的 binlog 配合 canal 做实时解析
这种方式比较重,我一般只在等保三级以上的场景才用。日常巡检的话,你可能根本不会去翻。
注意:操作系统级审计会产生大量日志,小心磁盘被日志撑爆——我见过一个案例,audit.log 一周写了 200GB,直接把 /var 分区写满了。先规划好日志轮转和归档策略再启用。
2.4 审计日志核心流程
我把审计日志从产生到消费的整个链路整理成了一张图,方便你理解:
从这张图能看出来,审计日志不是产出来就完事了。你得规划好「从哪来、存哪、怎么用」这三个环节,缺一个都不行。
2.5 审计日志的典型内容示例
那审计日志里面到底长什么样?我拿一个 MySQL 的审计插件日志给你看:
2025-03-21 14:23:45,dba_admin,192.168.1.50,5432,
finance_db,UPDATE, "UPDATE accounts SET balance = balance - 1000
WHERE account_id = 10086",3 rows affected,OK
一条日志包含了:时间、用户、来源 IP、端口、库名、操作类型、SQL 原文、影响行数、执行状态。你想想看,这就是一条铁证。
我还见过更细的,连绑定参数都记下来:
2025-03-21 14:23:45 | user:order_svc | host:10.0.0.8
| db:ecom | SELECT * FROM orders WHERE user_id = ? AND status = ?
| params:[123456, 'PAID'] | returned:87 rows | 12.3ms
这种日志对于排查慢查询和参数化注入,简直好用到不行。
2.6 审计日志的类型对比
最后,我把三类审计日志的优缺点给你总结了一下,方便选型时参考:
| 审计类型 | 优点 | 缺点 | 推荐场景 |
|---|---|---|---|
| 数据库内置审计 | 零额外部署、深度集成 | 可能影响性能 | 核心生产库、合规要求高 |
| 网络代理捕获 | 零侵入、多数据源统一 | 潜在单点故障、延迟 | 微服务架构、多 DB 环境 |
| 操作系统/文件审计 | 粒度最细、无法绕过 | 日志量大、配置复杂 | 等保三级以上、安全审计专项 |
一个小技巧:如果条件允许,可以「混合部署」——核心表走内置审计 + 所有 DDL 走操作系统审计,双保险。我在银行项目里就用这个方案,运行了三年没出过岔子。