第 2 章 常见审计日志类型:系统、应用、安全

做审计日志采集,第一件事就是把日志分清楚。我个人的习惯是先把日志分成三类:系统、应用、安全。别小看这个分类,很多采集方案踩坑,根源就是分类没理清。

为什么要分?因为三类日志的源头、格式、关注点完全不一样。系统日志看的是机器本身的状态,应用日志盯的是业务行为,安全日志抓的是恶意动作。你想想看,混在一起采集,后面分析的时候头得有多大。

2.1 系统日志

系统日志,说白了就是操作系统和各系统服务产生的记录。拿 Linux 来说,/var/log/messages、/var/log/syslog,还有 dmesg,这些都是系统日志。Windows 那边就是 Event Log,分 Application、System、Security 几个大类 —— 注意,Windows 的 Security 日志其实属于安全日志,我后面会讲。

系统日志的核心字段通常包括:

  • 时间戳 —— 精确到毫秒甚至微秒
  • 主机名 / IP
  • 进程 ID 和进程名
  • 日志级别(INFO, WARNING, ERROR, CRITICAL)
  • 消息正文

举个例子,Linux 内核的一条 dmesg 日志:

Jan 18 10:23:45 webserver kernel: [150732.123456] usb 1-1: new high-speed USB device number 5 using ehci_hcd

嗯,这里要注意,系统日志的格式五花八门。Syslog 是 RFC 3164 定义的,但很多设备厂商自己加字段。我在项目里遇到过某品牌交换机发的日志,时间戳居然不带年份,导致后续解析全部偏移。所以,采集系统日志时一定要先看原始格式,别迷信正则模板。

个人技巧: 先用 head -n 5 或 tail -f 盯一下原始日志,确认时间格式、分隔符、多行情况,再写采集配置。

2.2 应用日志

应用日志就热闹了。Web 服务器、数据库、消息队列、Java 中间件……每个都有自己的脾气。我做过一个电商项目,接入应用日志时发现同一个 Nginx 集群竟然有两种日志格式 —— 有的服务器加了 X-Forwarded-For,有的没加。你猜怎么着?之前的开发者手动改了配置,没有同步。

常见的应用日志类型:

  • Web 访问日志(Nginx / Apache):记录 URL、状态码、响应时间、User-Agent 等
  • Web 错误日志:记录 4xx / 5xx 详细信息
  • 数据库慢查询日志:SQL 执行时间、扫描行数
  • 应用业务日志:交易流水、用户操作、异常堆栈

给你看一条典型的 Nginx access log:

192.168.1.10 - - [18/Jan/2025:10:30:00 +0800] "POST /api/order HTTP/1.1" 200 1234 "-" "Mozilla/5.0" 0.045

这条日志告诉我们:谁在什么时间调了什么接口,返回了什么状态,花了多少毫秒。我建议在应用日志里强制写入一个全局追踪 ID(trace-id),这样后面做请求链路分析会方便很多。有一次我排查线上响应慢,就是靠 trace-id 一把串起了网关、业务、DB 三层的日志。

曾经踩过的坑: 应用日志的换行问题。某个 Java 应用打印异常堆栈时跨了十几行,采集 agent 默认单行解析,结果每行都变成独立事件,异常信息全碎了。后来必须配置多行合并规则。

2.3 安全日志

安全日志,是审计日志里最敏感的一类。它记录了 谁 在 什么时候 对 什么资源 做了 什么动作,结果 成功还是失败。来源包括:

  • 防火墙(允许/拒绝连接)
  • 入侵检测/防御系统(IDS/IPS)
  • Web 应用防火墙(WAF)
  • 操作系统安全日志(如 Linux 的 auth.log, Windows 的 Security Event Log)
  • VPN 和堡垒机

安全日志的字段往往强制包含:源 IP、目标 IP、源端口、目标端口、协议、动作、结果。举个例子,Linux SSH 登录失败的日志:

Jan 18 11:00:01 jumpbox sshd[12345]: Failed password for root from 10.0.0.5 port 22 ssh2

为什么安全日志这么重要?因为在安全事件溯源时,你往往需要回溯几天甚至几个月的数据。我经历过一次勒索病毒应急,攻击者早在 45 天前就通过弱口令爆破进入了内网。如果当时没有保留完整的安全日志,根本找不到入口。

建议: 安全日志的保留周期要比系统日志和应用日志长得多。系统日志一般留 30 天,安全日志至少留 6 个月,合规要求严格的行业要留 1 年以上。

三类日志的对比

为了方便你快速区分,我做了一个表格,把三类日志的关键特征列一下。你在设计采集方案时可以对照参考:

维度 系统日志 应用日志 安全日志
主要来源 OS 内核、syslog、dmesg、Event Log Web 服务器、数据库、中间件、业务代码 防火墙、WAF、IDS/IPS、VPN、认证服务
典型事件 磁盘错误、服务启停、内存溢出 HTTP 请求、SQL 查询、事务提交 登录失败、端口扫描、规则命中
字段特点 时间、主机、进程、级别、文本 时间、URL、耗时、状态码、trace-id 源/目标 IP、协议、动作、结果
格式复杂性 中等(syslog 有 RFC 但常被扩展) 高(各框架自定格式,需逐个适配) 低到中(设备厂商较统一,但字段多)
推荐保留期限 30 天 60 天(业务分析需求可能更长) 180 天+

三类日志的采集关系

我把三类日志的采集链路画了一张图。你可以看到,系统日志通常从 syslog 或 agent 入,应用日志从文件或 API 入,安全日志则大量走 syslog 或者专用协议。最终统一流向集中存储和分析平台。

审计日志三类采集关系图 审计日志采集:系统 · 应用 · 安全 系统日志 syslog / agent 应用日志 文件 / API 安全日志 syslog / 协议 采集 Agent 解析 · 格式化 多行合并 字段标准化 时间对齐 分类打标签 缓冲压缩 发送队列 集中存储 ES / ClickHouse HDFS / S3 告警 · 分析 仪表盘 注意: 系统与应用日志常共用采集 agent,安全日志建议独立链路(避免被日志洪峰干扰)。 三类日志在采集端统一打标签(log_type: system/app/security),后续分析直接按类型过滤。

一点总结

分类是日志采集的第一步,也是最容易被忽视的一步。系统日志保机器健康,应用日志保业务稳定,安全日志保资产安全。你要是能把这三类日志从源头就分开采集、分开存储、分开分析,后面的工作至少轻松一半。

最后说一个我自己的习惯:不管哪种日志,采集时一定要保留原始日志的完整副本。就算解析失败了,原始文本还在,还能重采。嗯,这个原则帮过我不少次。

行动清单:
- 盘点你手上的日志源,按系统/应用/安全分类
- 确认每种日志的格式和字段,写解析配置前先看原始样例
- 安全日志单独规划存储容量和保留周期
- 给采集 agent 配置多行合并,尤其对付 Java 堆栈日志