审计数据基础:审计日志格式、常见审计源

做 DSPM 审计联动,第一步不是配接口,而是搞明白你面对的数据长什么样。我刚开始接触这个领域时,以为审计日志就是一堆时间戳加用户名,结果被各种奇葩格式折腾得够呛。今天咱们就把这块硬骨头啃下来。

审计日志的核心要素

不管你从哪个源头拉日志,下面这几项几乎都会出现。记牢它们,后续解析才能不跑偏。

字段 说明 示例
时间戳 操作发生的精确时间,含时区 2025-02-18T09:23:45+08:00
主体 谁发起的操作(用户、服务账号) app_user@example.com
客体 被操作的对象(表、文件、API) db01.orders.payment
动作 具体操作类型 SELECT, DROP, MODIFY
结果 操作成功/失败,以及错误码 SUCCESS 或 403 Forbidden
上下文 IP、客户端工具、会话ID等 192.168.1.10, JDBC

我习惯拿到新日志源后,先提取这六个字段做个“格式映射表”。后面写联动规则时,哪项对应哪项,一目了然。

三大常见审计源

数据库审计日志

这是最常见、也是最重要的一类。MySQL、PostgreSQL、Oracle 都有各自的原生审计日志。说白了就是记录谁在什么时候对哪些表做了什么操作。

举个 MySQL 的例子,开启审计插件后,日志大致长这样:

2025-02-18T09:23:45  root[root] @ localhost []  QUERY  testdb.orders  'SELECT * FROM orders WHERE amount > 1000'  0
2025-02-18T09:24:10  app_user[app_user] @ 192.168.1.10 []  QUERY  testdb.users  'UPDATE users SET email = ...'  0

你会看到:时间戳、用户名、来源IP、数据库名、SQL语句、影响行数。我在项目中遇到过一个问题:公司生产库用的是 MariaDB,它默认的审计日志格式跟 MySQL 社区版不一样。当时我们写了个简单的格式化脚本才对齐。

系统审计日志

系统层级的审计,比如 Linux 的 auditd、Windows 的安全日志。这类日志主要记录文件访问、进程启动、权限变更等行为。对于 DSPM 来说,它们能帮你发现“非数据库操作”导致的数据泄漏,比如运维人员用 scp 直接把文件拷走了。

Linux auditd 的一条典型记录:

type=SYSCALL msg=audit(1708233825.123:456): arch=c000003e syscall=59 success=yes exit=0 a0=7ffe... a1=... a2=... a3=... items=2 ppid=1234 pid=5678 uid=1000 gid=1000 auid=1000 comm="scp" exe="/usr/bin/scp" key="data_transfer"

这里面你能提取出时间、进程名、用户ID、传输工具(scp)等关键信息。嗯,要特别注意那个 key 字段,很多公司会用它来做规则匹配的标签。

应用审计日志

应用层自己记录的日志,比如 Nginx 的 access_log、Spring Boot 的审计埋点。它们通常包含 HTTP 请求、API 调用、用户行为等。这类日志最灵活,但也最不规范。我曾经处理过一个客户案例:他们的自研 CRM 系统把审计日志写成了 JSON 数组,而且字段名隔几个月就改一次,那段时间我天天跟正则表达式较劲。

举个例子,一个标准的 Nginx 访问日志(经过自定义 JSON 格式化后):

{"time":"2025-02-18T09:23:45+08:00","remote_addr":"10.0.0.5","request":"GET /api/export/users?format=csv","status":200,"body_bytes_sent":1048576,"http_user_agent":"Python-urllib/3.9"}

看到那个 1MB 的响应体大小没?这里有个坑——单次响应太大可能说明有人在批量拉数据。DSPM 联动时就要对这种模式打标记。

千万别假设所有审计日志的时间戳都是 UTC+8 或者带时区。我碰到过系统日志用 UTC 但应用日志用本地时间,导致关联分析时偏差了 8 小时,查了半天才发现。

日志格式的三大“派系”

你想想看,几十种源凑在一起,格式千差万别。但归类后其实就三大流派:

  • 固定列文本日志:像上面 MySQL 审计日志,列之间用空格或制表符分隔。解析直接,但字段顺序一变就崩。
  • 键值对/KV 日志:像 auditd 的输出,字段用 key=value 表示。灵活,但同一字段可能有多种拼写(比如 uid vs user_id)。
  • 结构日志(JSON):现代应用的主流。天然支持嵌套,但字段命名不统一,有的用驼峰有的用下划线。

我个人建议:能转 JSON 就转 JSON。结构化数据在后续的解析、聚合、规则匹配上都省力。实在转不了的,用 Logstash 或 Fluentd 的 filter 也能硬撸成统一格式。

知识地图:审计数据到联动配置

下面这张图把本章的核心串起来了。你顺着它,就能看清从日志源头到联动规则的完整链条。

审计数据到联动配置知识结构图 审计数据基础 → 联动配置知识脉络 数据库审计日志 系统审计日志 应用审计日志 六大核心要素 时间 / 主体 / 客体 / 动作 / 结果 / 上下文 固定列文本 键值对 KV JSON 结构化 联动规则 / 审计策略配置 统一字段映射是关键

记住这个脉络:采集源头 → 提取核心要素 → 归一化格式 → 配置联动规则。后面所有章节都是在这条线上深化。

实践建议:搭建审计日志采集的第一道坎

与其纸上谈兵,不如直接上手试。我建议你先挑一个最简单的源做通——比如 MySQL 开启审计日志,然后写一个 Python 脚本读一行、解析一行。不需要高大上的框架,先手动跑通,你才能真正理解字段映射的痛点。

最后提一句:审计数据本身也是敏感数据,别在日志里明文存密码或信用卡号。我曾经看过一个系统的审计日志里居然带着完整的三要素认证信息,那简直是把钥匙挂在门锁上了。