审计日志基础概念

什么是审计日志?

说白了,审计日志就是系统里的一本“黑匣子”。它把谁、什么时候、在哪儿、干了什么、结果怎样,一条条记下来。我刚开始接触安全运维时,觉得这东西就是占磁盘的垃圾。直到有一次线上被入侵,翻遍日志才定位到异常访问——从那以后,我对审计日志再也不敢怠慢。

一条完整的审计记录,至少包含:时间戳、操作主体、操作对象、操作类型、结果状态。比如用户 admin 在 2025-03-20 10:00:00 通过 SSH 登录服务器 web01,结果成功。这些信息就是审计日志的最小单元。

核心作用:合规检查、入侵溯源、行为审计、异常检测。没有审计日志,安全事件就像在黑暗中抓蚊子。

常见的日志格式

我这些年见过的日志格式五花八门,但主流就三种:syslog、JSON、CEF。它们各有各的脾气,选对了能省一半解析功夫。

格式典型代表结构特点解析难度我碰到的坑
syslogRFC 5424头部+结构化数据+消息体中等不同设备的时间格式不统一,解析正则写到手软
JSONELK 全家桶key-value 键值对,层级清晰低字段名大小写不一致,需要提前做 schema 映射
CEFArcSight、Fortinet固定字段+扩展字段包中高扩展字段顺序依赖设备配置,漏字段直接断解析

syslog 格式

老牌日志协议,网络设备和 Linux 系统都在用。一条标准 syslog 长这样:

<14>1 2025-03-20T10:00:00Z myhost.example.com sshd 1234 - [timeQuality tzKnown="1" isSynced="1"] Failed password for root from 10.0.0.100

嗯,这里要注意:<14> 是设施和级别编码,1 是版本号。我刚开始看的时候直接懵了,后来用 rsyslog 搭配模板格式化才搞定批量解析。

JSON 格式

现代应用日志的宠儿,结构自由,支持嵌套。比如云平台的访问日志:

{
  "timestamp": "2025-03-20T10:00:00Z",
  "source_ip": "10.0.0.100",
  "user": "root",
  "action": "login_failed",
  "target": "10.0.0.1:22",
  "status": "deny"
}

我个人习惯把 JSON 日志直接喂给 Elasticsearch,解析几乎是零成本。但避坑一点:字段名一定要统一规范,否则后面的机器学习模型会学出一堆坏特征。

CEF 格式

ArcSight 定义的通用事件格式,在安全设备上很常见。它的结构是:

CEF:0|Vendor|Product|Version|SignatureID|Name|Severity|[Extension]
CEF:0|Cisco|ASA|9.12|106023|Deny TCP|5|src=10.0.0.100 dst=10.0.0.1 spt=12345 dpt=80

我曾经在对接 FortiGate 日志时,因为设备固件版本不同,扩展字段少了几个 key,导致下游 parser 直接崩溃。所以,用 CEF 格式一定要先做字段兼容性测试。

小提示:如果你从零搭建审计系统,优先选 JSON。结构化好、解析快、生态成熟。syslog 和 CEF 适合做设备网关协议转换,不宜直接做分析源。

常见来源

审计日志的来源通常分三类:服务器、数据库、网络设备。每一类都有自己特有的字段。

服务器

  • 操作系统日志:Linux 的 /var/log/auth.log、/var/log/secure;Windows 的 Security Event Log。记录登录、提权、账号变更。
  • 应用服务器日志:Nginx 的 access log、SSH 的 auth log。我遇到过一个真实案例:攻击者通过 Web 漏洞上传 webshell,Nginx access log 里的 POST 请求长度异常,直接暴露了行为。

数据库

  • MySQL:general_log 记录所有 SQL 语句,但默认关闭,开启后会极大影响性能。我建议只开启审计插件(audit log plugin)记录关键操作。
  • Oracle:审计功能成熟,可以细粒度到表级别。曾经有个客户数据库被删表,我们通过 Oracle 审计日志定位到是一次误操作,而非外部攻击。

网络设备

  • 防火墙:Cisco ASA、FortiGate、Palo Alto 都会输出连接日志。我习惯重点关注 deny 数量和来源 IP 聚合后的突发流量。
  • 路由器/交换机:syslog 格式输出,记录接口 up/down、ACL 匹配、BGP 邻居变更。网络设备日志时间戳通常用本地时间,对接时要注意时区转换。

避坑指南:我曾经以为所有设备都支持标准 syslog RFC 5424,结果对接一台老 Unix 服务器时发现它输出的是 RFC 3164 格式(头部 <PRI>Timestamp Hostname 没有版本号)。解析脚本当场报废。后来我在代码里加了格式探测:先看第一个字符是否数字,再决定用哪个 parser。

审计日志生成与收集流程 服务器 数据库 网络设备 Syslog JSON CEF 集中存储 (ELK/Syslog server) 异常检测 不同来源的日志通过 syslog、JSON 或 CEF 格式统一收拢到集中存储, 再喂给机器学习模型做异常检测。格式不统一时,需要先做协议转换。

你看,整个链条其实很简单:设备产生原始日志 → 套上固定格式 → 集中存储 → 最后喂给异常检测模型。这里面最容易翻车的就是格式解析。我建议你在做机器学习特征工程之前,先花点时间把日志结构摸清楚——你想想看,如果训练数据字段都对不齐,模型再牛也白搭。