第 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 三层的日志。
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 天前就通过弱口令爆破进入了内网。如果当时没有保留完整的安全日志,根本找不到入口。
三类日志的对比
为了方便你快速区分,我做了一个表格,把三类日志的关键特征列一下。你在设计采集方案时可以对照参考:
| 维度 | 系统日志 | 应用日志 | 安全日志 |
|---|---|---|---|
| 主要来源 | 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 或者专用协议。最终统一流向集中存储和分析平台。
一点总结
分类是日志采集的第一步,也是最容易被忽视的一步。系统日志保机器健康,应用日志保业务稳定,安全日志保资产安全。你要是能把这三类日志从源头就分开采集、分开存储、分开分析,后面的工作至少轻松一半。
最后说一个我自己的习惯:不管哪种日志,采集时一定要保留原始日志的完整副本。就算解析失败了,原始文本还在,还能重采。嗯,这个原则帮过我不少次。
- 盘点你手上的日志源,按系统/应用/安全分类
- 确认每种日志的格式和字段,写解析配置前先看原始样例
- 安全日志单独规划存储容量和保留周期
- 给采集 agent 配置多行合并,尤其对付 Java 堆栈日志