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 日志集中存储:为什么不能“各管各的”
你想想看,一个中型网络至少有几十台设备。如果每台设备都自己存日志,出问题时要一台一台登录去查,效率极低。更麻烦的是——攻击者通常会先清理日志,如果日志分散在设备本地,他删掉就没了。
集中存储的核心价值就三点:
- 统一检索:一个地方查所有设备的日志
- 安全留存:日志发送到集中服务器后,设备本地的日志被删也不怕
- 关联分析:把防火墙、服务器、交换机的日志放一起,才能还原攻击路径
下面这张图展示了典型的日志集中存储架构:
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加密可以后面慢慢加。别一开始就想搞大而全,先把基础链路打通,后面的事情就好办了。