审计日志格式与规范: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 的消息体看成纯文本串,因为它的字段没有固定分隔符。我在项目里见过不少团队用正则硬拆,结果遇到厂商自定义格式就崩了。

注意: Syslog 的 facility 和 severity 编码有很多坑。比如 kern.info 和 local7.debug 都混在里面,写解析器时最好统一映射成数值再处理。

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事件 ID114001
Name事件名称VPN Authentication Failed
Severity严重等级Low / Medium / High / Very-High
避坑指南: CEF 规范中 Severity 是整数 0-10,但很多实现直接用字符串。我的经验是——收到字符串先转小写,再映射数字,否则后面告警等级会错位。

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 倍。

LIE 格式解析简单,适合做批量管道。但字段少,遇到复杂事件必须搭配扩展字段(比如加到最后一列用冒号分隔)。

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。

性能陷阱: 同样的审计事件,JSON体积是Syslog的5-8倍。如果对延迟有要求,建议在采集端先做字段裁剪,只保留异常检测需要的字段。

字段解析:异常检测的核心

无论哪种格式,其实最终都要抽出一组通用字段。我整理了一个对比表,你在写检测规则时可以直接套用:

通用字段SyslogCEFLIEJSON
时间戳头 (固定位置)扩展段 (rt)第1列timestamp
源 IP消息体中提取src第4列sourceIPAddress
目标 IP消息体中提取dst—destinationIPAddress
用户名消息体中提取suser / duser第3列userIdentity.arn
操作类型进程名+动作msg / name第6列eventName
结果fail/pass 关键词outcome—responseElements
我的小技巧: 异常检测最敏感的三个字段是「源IP + 操作类型 + 结果」。我建议你不管用什么格式,先确保这三个字段被正确解析,其他字段可以慢慢补充。

一张图看懂四种格式

下面这张图展示了四种格式的核心结构,以及它们之间的差异。看懂这张图,面对任何审计日志你都能快速定位关键字段。

审计日志四种格式结构对比 Syslog 时间戳 主机名 进程[PID] 消息体(纯文本) 需正则提取字段 CEF 头:CEF:0|...|Severity 扩展段1:src=… 扩展段2:dst=… 扩展段3:cs1=… 字段名=值 对 LIE 时间戳|用户ID|用户名 源IP|端口|操作 固定竖线分隔 列位置即含义 无扩展字段 JSON timestamp eventSource userIdentity:{…} 嵌套对象 自描述结构 异常检测需要的通用字段 时间戳 | 源IP | 目标IP | 用户名 | 操作类型 | 结果 优先级:源IP + 操作类型 + 结果(三大核心) 无论哪种格式,最终都要映射到这六个字段 Tips:解析时先做格式识别,再调用对应解析器,最后统一输出为标准字段

小结

四种格式各有适用场景:Syslog 最通用但最散乱,CEF 适合 SIEM 预定义字段,LIE 适合管道高速处理,JSON 适合现代云平台。我在做异常检测系统时,通常会在采集层做一次格式抽象——无论输入什么,内部统一成 JSON 标准字段,这样后面的规则引擎只需要处理一种数据模型。

一句话总结: 先看懂日志长什么样,再拆出关键字段,异常检测就成功了一半。另一半,嗯,我们后面慢慢聊。