4. 日志管理入门:Syslog协议、日志格式与集中存储

日志这东西,说白了就是设备的“黑匣子”。你想想看,交换机、防火墙、服务器每天在干什么?谁连进来了?谁在扫端口?哪个进程挂了?这些信息全写在日志里。我刚开始做运维那会儿,总觉得日志是事后才看的,直到有一次内网被入侵,翻遍所有设备才发现日志根本没开全……嗯,从那以后,我再也不敢轻视日志管理了。

这一章,我们就来聊聊日志管理的三个核心问题:怎么传(Syslog协议)、长什么样(WELF/CEF格式)、放哪里(集中存储)。

4.1 Syslog协议:日志传输的“通用语言”

Syslog是日志传输的事实标准。几乎所有网络设备、Linux服务器都支持它。它的设计其实很简单——发送端把日志扔给接收端,至于接收端怎么处理,它不管。

核心要点:Syslog使用UDP 514端口(默认),也支持TCP和TLS。UDP快但不保证送达,TCP可靠但可能阻塞。我个人习惯:内网用UDP,跨公网用TLS。

Syslog消息的结构长这样:

<PRI>TIMESTAMP HOSTNAME APP_NAME[PID]: MESSAGE

举个例子:

<134>Feb 12 10:15:30 core-sw01 sshd[12345]: Failed password for root from 192.168.1.100 port 22 ssh2

这里<134>是优先级码,它由设施(Facility)和严重级别(Severity)计算得出。我整理了一张常用对照表:

严重级别 数值 说明
Emergency 0 系统不可用
Alert 1 需要立即处理
Critical 2 严重故障
Error 3 错误
Warning 4 警告
Notice 5 正常但重要
Info 6 一般信息
Debug 7 调试信息

小技巧:配置日志发送时,建议把级别设在Info(6)以上。Debug日志量太大,容易把接收端撑爆。我曾经见过一台核心交换机开了Debug日志,结果每秒产生2万条消息,直接把日志服务器搞挂了。

4.2 日志格式:WELF与CEF

Syslog只定义了传输格式,没定义日志内容怎么写。这就导致一个问题——不同厂商的日志长得完全不一样。比如思科的日志和华为的日志,解析起来简直是两门语言。

为了解决这个问题,业界出现了两种标准化格式:WELF和CEF。

4.2.1 WELF(WebTrends Enhanced Log Format)

WELF是WebTrends公司定义的格式,后来被很多安全设备采用。它的特点是键值对结构,可读性好。

格式示例:

time="2025-02-12 10:15:30" fw=192.168.1.1 src=10.0.0.100 dst=8.8.8.8 sport=12345 dport=53 proto=udp action=allow

每个字段用key=value表示,字段之间用空格分隔。解析起来非常方便,直接用正则或split就能搞定。

4.2.2 CEF(Common Event Format)

CEF是ArcSight(现属Micro Focus)定义的格式,在SIEM领域用得特别多。它的结构更紧凑,包含固定头部和扩展字段两部分。

格式示例:

CEF:0|Security|Firewall|1.0|100|Port Scan Detected|5|src=10.0.0.100 dst=8.8.8.8 dpt=80 proto=tcp

固定头部各字段含义:

位置 字段 示例
1 版本 0
2 设备厂商 Security
3 设备产品 Firewall
4 设备版本 1.0
5 事件ID 100
6 事件名称 Port Scan Detected
7 严重级别 5

注意:CEF的严重级别是0-10,数值越大越严重。而Syslog是0-7,数值越小越严重。这两个方向是反的!我见过有人直接把Syslog级别映射到CEF,结果告警全乱套了。

4.3 日志集中存储:为什么不能“各管各的”

你想想看,一个中型网络至少有几十台设备。如果每台设备都自己存日志,出问题时要一台一台登录去查,效率极低。更麻烦的是——攻击者通常会先清理日志,如果日志分散在设备本地,他删掉就没了。

集中存储的核心价值就三点:

  • 统一检索:一个地方查所有设备的日志
  • 安全留存:日志发送到集中服务器后,设备本地的日志被删也不怕
  • 关联分析:把防火墙、服务器、交换机的日志放一起,才能还原攻击路径

下面这张图展示了典型的日志集中存储架构:

日志集中存储架构 防火墙 交换机 服务器 Syslog / TLS 传输 日志集中服务器(Syslog-ng / Rsyslog) 磁盘 / NAS / 对象存储

4.4 实战:用Rsyslog搭建集中日志服务器

Rsyslog是Linux上最常用的日志收集工具。配置起来不复杂,我直接给一个能用的例子。

服务端配置(/etc/rsyslog.conf):

# 开启UDP接收
module(load="imudp")
input(type="imudp" port="514")

# 开启TCP接收(可选)
module(load="imtcp")
input(type="imtcp" port="514")

# 按设备IP和日期存储
$template RemoteLogs,"/var/log/remote/%FROMHOST-IP%/%$YEAR%-%$MONTH%-%$DAY%.log"
*.* ?RemoteLogs

客户端配置(/etc/rsyslog.conf):

# 把所有日志发送到集中服务器
*.* @192.168.1.100:514

避坑指南:我曾经配置完Rsyslog后发现收不到日志,排查了半天才发现是防火墙没放行UDP 514端口。另外,如果日志量很大,建议用@@(TCP)代替@(UDP),避免丢日志。

4.5 日志格式转换:从Syslog到WELF/CEF

很多设备原生输出的是普通Syslog,不是WELF或CEF。这时候就需要做格式转换。Rsyslog自带了转换功能,用template就能搞定。

举个例子,把普通Syslog转成CEF格式:

template(name="CEFFormat" type="string"
  string="CEF:0|MyCompany|Firewall|1.0|%msgid%|%msg%|5|src=%srcip% dst=%dstip%\n")

*.* action(type="omfwd" target="192.168.1.200" port="514"
         protocol="udp" template="CEFFormat")

注意:CEF格式对特殊字符有转义要求。比如=、|、\这些字符在字段值里出现时,需要用反斜杠转义。否则接收端解析会出错。我踩过这个坑,当时排查了整整一天才发现是日志里有个未转义的竖线符。

4.6 本章小结

日志管理是态势感知的基石。没有日志,一切分析都是空谈。这一章我们讲了:

  • Syslog协议:日志传输的标准,UDP/TCP/TLS三种方式各有适用场景
  • WELF和CEF格式:两种主流的日志结构化格式,WELF偏键值对,CEF偏固定头部+扩展
  • 集中存储:用Rsyslog搭建日志服务器,实现统一收集和存储

我个人建议,刚上手时先跑通Syslog的UDP传输,把日志收上来再说。格式转换和TLS加密可以后面慢慢加。别一开始就想搞大而全,先把基础链路打通,后面的事情就好办了。