3、日志标准化与格式化:Syslog、JSON、CEF格式解析,字段映射与富化,时间戳规范化
日志标准化,说白了就是把各路神仙的日志拉到同一个频道上。你想想看,防火墙、服务器、数据库、容器平台,每个系统都有自己的日志脾气。有的用Syslog,有的吐JSON,还有的用CEF这种老牌格式。如果不做标准化,后续的关联分析和告警根本没法搞。
我个人习惯把日志标准化分成三个步骤:格式解析、字段映射、时间戳统一。这三步走完,日志才算真正能用。
3.1 三大日志格式解析
先聊聊最常见的三种格式。我在项目中遇到过不少团队,连自己系统输出什么格式都没搞清楚,就开始做采集,结果后面全乱套了。
3.1.1 Syslog格式
Syslog是日志界的元老。它分两种:RFC 3164(老派)和RFC 5424(新派)。
RFC 3164 示例:
<34>Oct 11 22:14:15 mymachine su: 'su root' failed for lonvick on /dev/pts/8
RFC 5424 示例:
<34>1 2024-10-11T22:14:15.003Z mymachine.example.com su - - - 'su root' failed
这里有个坑——优先级值。尖括号里的数字是 Facility 和 Severity 的编码组合。比如 34,拆开看:Facility=4(auth),Severity=2(critical)。
3.1.2 JSON格式
JSON是现代日志的标配。结构清晰,解析方便,但问题也不少。
典型JSON日志:
{
"timestamp": "2024-10-11T22:14:15.003Z",
"level": "ERROR",
"logger": "com.example.AuthService",
"message": "Login failed for user admin",
"source_ip": "192.168.1.100",
"user_agent": "Mozilla/5.0"
}
JSON日志最大的问题是字段命名不统一。有的用 timestamp,有的用 @timestamp,还有用 time 的。我建议在采集层就做一次字段映射,统一成标准命名。
time 映射成 @timestamp,把 level 映射成 severity。这样下游处理就省心了。
3.1.3 CEF格式
CEF(Common Event Format)是ArcSight推的格式,在安全设备里很常见。它的结构是竖线分隔的。
CEF示例:
CEF:0|Security|ThreatManager|1.0|100|Login Failed|5|src=192.168.1.100 dst=10.0.0.1 duser=admin msg=Invalid password
CEF的字段是固定的:CEF:Version|Device Vendor|Device Product|Device Version|Signature ID|Name|Severity|Extension。Extension部分才是真正的自定义字段,用key=value对表示。
解析CEF时要注意转义问题。竖线和等号在CEF里有特殊含义,如果字段值里包含这些字符,必须用反斜杠转义。我见过不少安全设备输出的CEF日志,Extension部分格式乱七八糟,解析器直接报错。
3.2 字段映射与富化
格式解析完了,下一步就是字段映射。说白了,就是把不同来源的字段名统一成一套标准。
字段映射表示例:
| 原始字段 | 标准字段 | 说明 |
|---|---|---|
| src_ip / source / client_ip | source_ip | 统一为source_ip |
| dst_ip / dest / target | destination_ip | 统一为destination_ip |
| user / username / login | user_name | 统一为user_name |
| action / operation / event_type | event_action | 统一为event_action |
字段映射之后,还有一步叫富化。富化就是给日志补充上下文信息。比如:
- 把IP地址解析成地理位置(国家、城市)
- 把用户ID关联到部门、角色
- 把资产IP关联到资产类型、负责人
- 把威胁情报标签打上去
富化的价值: 一条原始日志可能只有IP和端口,富化之后就有了地理位置、资产归属、威胁等级。这样在做告警时,就能直接判断「这个IP来自高危地区,访问的是核心资产」,不需要再查别的系统。
我记得有一次做金融客户的合规审计,他们的防火墙日志只有源IP、目的IP和端口。富化之后,我们把IP映射到了业务系统、负责人、安全域。结果发现一条告警指向了测试环境的数据库,直接排除了误报。这就是富化的威力。
3.3 时间戳规范化
时间戳是日志标准化里最容易被忽视的环节。但恰恰是它,最容易出问题。
常见的时间戳问题:
- 格式不统一:有的用
2024-10-11T22:14:15Z,有的用10/11/2024 10:14:15 PM - 时区不明确:日志里没带时区信息,解析器默认用UTC还是本地时间?
- 精度不一致:有的精确到秒,有的精确到毫秒,有的甚至精确到纳秒
- 时钟不同步:不同设备的系统时间可能差几秒甚至几分钟
我的建议:
- 统一用UTC:所有日志在采集层就转成UTC时间,避免时区混乱
- 统一用ISO 8601格式:比如
2024-10-11T22:14:15.003Z,带毫秒和时区 - 使用NTP同步:所有日志源设备必须配置NTP,时钟偏差控制在1秒以内
- 保留原始时间戳:在富化字段里保留原始时间戳,方便排查问题
3.4 标准化处理流程
下面这张图展示了日志标准化的完整流程。从原始日志到标准化事件,每一步都有明确的处理逻辑。
这个流程看起来简单,但每个环节都有细节。比如格式解析时,Syslog的Facility和Severity要拆开;字段映射时,要处理多对一的情况;时间戳规范化时,要处理各种奇葩格式。
嗯,日志标准化这块就聊这么多。记住一个原则:标准化做得越早,后续分析越省心。在采集层就把格式、字段、时间戳统一好,后面的关联分析、告警规则、合规报表,都会变得非常顺畅。