审计日志格式与规范:Syslog、CEF、LIE、JSON
说实话,刚入行那会儿让我接审计日志,我对着满屏乱码差点想摔键盘。不同设备、不同厂商,日志格式五花八门。后来摸清楚了,其实主流审计日志就四种格式:Syslog、CEF、LIE 和 JSON。每种都有自己的脾气,但搞懂了底层字段,异常检测就会轻松很多。
Syslog——老大哥,但有点乱
Syslog 是 Unix/Linux 时代就有的协议,现在几乎所有网络设备、服务器默认都支持它。你随便打开一台 Linux 的 /var/log/auth.log,里面大部分就是 Syslog 格式。
它的结构特别简单:时间戳 + 主机名 + 进程信息 + 消息体。举个例子:
Feb 21 10:15:30 webserver sshd[12345]: Failed password for root from 192.168.1.100 port 22 ssh2
我个人习惯把 Syslog 的消息体看成纯文本串,因为它的字段没有固定分隔符。我在项目里见过不少团队用正则硬拆,结果遇到厂商自定义格式就崩了。
CEF——ArcSight 的“亲儿子”
CEF(Common Event Format)是 HP ArcSight 推的,现在很多 SIEM 工具都认它。说白了就是把关键字段预定义好,方便机器读。
典型格式长这样:
CEF:0|Vendor|Product|Version|Signature ID|Name|Severity|Extension
我最喜欢它的扩展段:key=value 对,动态字段随便加。比如:
CEF:0|Cisco|ASA|9.12|114001|VPN Authentication Failed|Low|src=10.0.0.1 dst=8.8.8.8 dpt=8443 cs1=External cs1Label=ConnectionType
我曾经接一个客户环境,他们把厂商 ID 写成了中文,结果解析器直接乱码。后来我建议他们在发送前强制 UTF-8 编码,问题才解决。
| CEF 头部分 | 含义 | 示例 |
|---|---|---|
| Device Vendor | 设备厂商 | Cisco |
| Device Product | 产品名 | ASA |
| Device Version | 版本 | 9.12 |
| Signature ID | 事件 ID | 114001 |
| Name | 事件名称 | VPN Authentication Failed |
| Severity | 严重等级 | Low / Medium / High / Very-High |
LIE——轻量级,被低估了
LIE(Log Index Event)可能不如 CEF 出名,但它在大型分布式系统里特别多,比如 Kafka 日志管道、ClickHouse 审计插件。格式极其紧凑:
2025-02-21T10:15:30Z|1024|root|192.168.1.100|5522|SSH login
字段位置固定,用竖线分隔。顺序是:时间戳 | 用户ID | 用户名 | 源IP | 端口 | 操作。
我记得有一次排查慢查询,发现 LIE 日志里时间戳都是字符串,没有时区信息。后来我们统一要求所有 agent 发送 UTC 时区,再转成毫秒时间戳,效率直接提升了 3 倍。
JSON——现代标准,但别滥用
JSON 格式现在最流行,CloudTrail、GCP Audit Logs、Azure 全用它。结构清晰,自带层级,机器和人都能看。
{
"timestamp": "2025-02-21T10:15:30.123Z",
"eventSource": "ec2.amazonaws.com",
"eventName": "RunInstances",
"userIdentity": {
"arn": "arn:aws:iam::123456789012:user/admin",
"accountId": "123456789012"
},
"sourceIPAddress": "203.0.113.50",
"resources": [
{"instanceId": "i-0abcd1234efgh5678"}
]
}
你想想看,JS对象嵌套,解析简单,但日志量暴增时会死得快。我见过一个系统一天写几百GB的JSON审计日志,光解析就耗掉30%的CPU。
字段解析:异常检测的核心
无论哪种格式,其实最终都要抽出一组通用字段。我整理了一个对比表,你在写检测规则时可以直接套用:
| 通用字段 | Syslog | CEF | LIE | JSON |
|---|---|---|---|---|
| 时间戳 | 头 (固定位置) | 扩展段 (rt) | 第1列 | timestamp |
| 源 IP | 消息体中提取 | src | 第4列 | sourceIPAddress |
| 目标 IP | 消息体中提取 | dst | — | destinationIPAddress |
| 用户名 | 消息体中提取 | suser / duser | 第3列 | userIdentity.arn |
| 操作类型 | 进程名+动作 | msg / name | 第6列 | eventName |
| 结果 | fail/pass 关键词 | outcome | — | responseElements |
一张图看懂四种格式
下面这张图展示了四种格式的核心结构,以及它们之间的差异。看懂这张图,面对任何审计日志你都能快速定位关键字段。
小结
四种格式各有适用场景:Syslog 最通用但最散乱,CEF 适合 SIEM 预定义字段,LIE 适合管道高速处理,JSON 适合现代云平台。我在做异常检测系统时,通常会在采集层做一次格式抽象——无论输入什么,内部统一成 JSON 标准字段,这样后面的规则引擎只需要处理一种数据模型。