数据库审计日志能说明什么
数据库审计记录登录、权限变更、DDL 与数据操作,是还原“数据被谁在什么时候读取或修改”的关键来源。审计开启时可以看到新增账号、权限授予、批量导出语句与非业务时段的变更;审计未开启时只能用慢查询日志、连接日志、二进制日志与备份记录侧面佐证。不同数据库的审计实现差异较大:MySQL 8 可用通用查询日志、企业版审计插件或第三方审计插件,PostgreSQL 通过 log_statement 与 pgaudit 扩展,SQL Server 用审计与默认跟踪。
基本信息
| 适用平台 | MySQL 8 / MariaDB、PostgreSQL 12+、SQL Server 2016+、Oracle 等 |
|---|---|
| MySQL 侧 | general_log(通用查询日志)、审计插件(企业版或第三方)、慢查询日志 |
| PostgreSQL 侧 | log_statement(none/ddl/mod/all)、pgaudit 扩展、log_connections |
| SQL Server 侧 | SQL Server 审计(Server Audit)与默认跟踪 |
| 关键字段 | 时间、执行账号、来源主机、语句文本、影响行数 |
典型使用场景
- 确认是否存在异常导出:非业务账号对大表做全量查询
- 核查权限提升与后门账号:新增账号、授予高权限、修改认证方式
- 定位数据被篡改的时间与语句,支撑恢复与责任认定
- 识别非业务时段的结构变更,与发布单核对
- 评估数据泄露范围:哪些表、多少行、通过哪个账号被读取
关注模式与查询
关注模式与查询
-- 关注模式(人工筛查的重点)
-- 1) 新账号与权限变更
CREATE USER / GRANT ALL ON *.* / ALTER USER ... IDENTIFIED BY
-- 2) 大表全量导出
SELECT * FROM <大表> LIMIT 0, ... 或带 WHERE 1=1 的批量语句
-- 3) 无 WHERE 的批量修改
DELETE FROM t; UPDATE t SET c=1;
-- 4) 凌晨批量导出行为(结合时间字段筛选)
-- MySQL 8:通用查询日志以表形式查看(log_output=TABLE 时)
SELECT event_time, user_host, argument FROM mysql.general_log
ORDER BY event_time DESC LIMIT 20;审计关注点对照
| 关注点 | 典型记录 | 判读要点 |
|---|---|---|
| 账号变更 | CREATE USER、ALTER USER、DROP USER | 比对账号台账,非计划新增即重点 |
| 权限授予 | GRANT、REVOKE | 全库全表权限与 SUPER 类权限最需关注 |
| 批量读取 | 大表 SELECT、导出语句 | 结合行数与时段判断是否为外带 |
| 批量修改 | 无 WHERE 的 UPDATE/DELETE | 确认是否有备份与恢复窗口 |
| 来源主机 | 连接来源地址 | 来自陌生主机或非应用节点即为疑点 |
审计未开启时可用替代证据:慢查询日志能反映无索引的大范围扫描、二进制日志可回放数据变更、连接日志能补充来源与时段。这些只能部分替代,覆盖范围要在结论里写明。
业务语句多数由 ORM 框架生成,形态与手写 SQL 明显不同(带占位符、批量参数、固定表别名),判读时要先建立“正常语句形态”的基线,异常往往体现在语法风格突变。