简介
Snort 是一个功能强大的开源入侵检测系统(IDS),它能够实时监控网络流量并将其与预定义的规则集进行比对。当可疑活动匹配到某条规则时,Snort 就会生成一条警报。对于任何网络安全专业人员来说,理解如何阅读和解读这些警报是一项基本技能。
生成警报仅仅是防御工作流程的开始。分析师仍需判断该事件是否有意义、网络上发生了什么,以及是否需要采取后续行动。这就是为什么警报解读与规则创建同样重要的原因。如果人类无法准确读取和分类其输出,那么再强大的检测堆栈也是无用的。
在本实验中,你将学习如何与 Snort 警报进行交互。你将使用自定义配置启动 Snort,生成网络流量以触发特定的检测规则,然后分析生成的日志文件。Snort 可以以多种格式输出日志;我们将重点关注 fast 日志(提供事件的快速、单行摘要)和 full 日志(包含详细的数据包头信息)。
触发多条规则
在此步骤中,你将启动 Snort 入侵检测系统并生成网络流量,以触发已为你预先配置好的自定义规则。
创建已知的良性测试流量是检测工程中的一种标准习惯。如果你确切知道哪些数据包应该触发哪些规则,那么你就拥有了一个清晰的基准,用于验证监控管道是否端到端正常工作。
实验环境已配置了两条简单的 Snort 规则:一条用于检测 ICMP(Ping)流量,另一条用于检测 80 端口上的 HTTP(Web)流量。我们还在 /etc/snort/custom.conf 中创建了一个自定义配置文件,告知 Snort 以两种不同的格式保存警报:fast 日志和 full 日志。
首先,使用自定义配置文件以守护进程(后台)模式启动 Snort。-D 标志告诉 Snort 在后台运行,-c 指定配置文件,-l 指定日志目录,-i eth0 告诉 Snort 监听默认的网络接口。
sudo snort -c /etc/snort/custom.conf -l /var/log/snort -i eth0 -D
你应该会看到一条消息,表明 Snort 已成功初始化并作为守护进程运行。
接下来,生成一些网络流量来触发规则。我们将向公共 DNS 服务器(8.8.8.8)发送三个 ICMP ping 数据包,以触发 ICMP 规则。
ping -c 3 8.8.8.8
现在,使用 curl 命令获取网页来生成一些 HTTP 流量。这将触发 HTTP 规则。我们使用 > /dev/null 来隐藏 HTML 输出,以免干扰终端显示。
curl -s http://example.com > /dev/null
最后,等待片刻,让 Snort 处理数据包并将其写入日志文件。你可以通过列出 Snort 日志目录的内容来验证日志文件是否已创建。
sleep 2
ls -l /var/log/snort
你应该会在输出中看到 fast_alert.log 和 full_alert.log,这表明 Snort 已成功检测到流量并生成了警报。
total 8
-rw-r--r-- 1 root root 345 Sep 15 10:00 fast_alert.log
-rw-r--r-- 1 root root 1250 Sep 15 10:00 full_alert.log
分析快速日志
在此步骤中,你将检查 fast_alert.log 文件。「快速」警报格式旨在实现易读和简洁。它在单行内记录了关于警报的最关键信息,非常适合快速审查或使用自动化脚本进行解析。
这是许多分析师首先接触的格式,因为分类工作通常从广泛的范围开始。在决定是否需要深入查看数据包细节之前,你需要先了解触发了什么、何时触发以及涉及哪些端点。
使用 cat 命令显示快速日志文件的内容。
cat /var/log/snort/fast_alert.log
你的输出将类似于以下内容:
09/15-10:00:01.123456 [**] [1:1000001:1] ICMP Ping Detected [**] {ICMP} 192.168.1.10 -> 8.8.8.8
09/15-10:00:01.123456 [**] [1:1000001:1] ICMP Ping Detected [**] {ICMP} 8.8.8.8 -> 192.168.1.10
09/15-10:00:05.654321 [**] [1:1000002:1] HTTP Traffic Detected [**] {TCP} 192.168.1.10:45678 -> 93.184.216.34:80
让我们拆解一下快速警报行的组成部分:
- 时间戳:
09/15-10:00:01.123456显示了捕获数据包的确切日期和时间。 - 生成器、SID 和修订版本:
[1:1000001:1]代表生成器 ID(1 表示它是标准 Snort 规则)、唯一标识该规则的 Snort ID(SID,即 1000001)以及规则的修订版本号(1)。 - 消息:
ICMP Ping Detected是规则中定义的易读消息。 - 协议:
{ICMP}或{TCP}指示所使用的网络协议。 - 源和目标:
192.168.1.10:45678 -> 93.184.216.34:80显示了源 IP 和端口、指示流量方向的箭头,以及目标 IP 和端口。
通过阅读此日志,安全分析师可以快速确定谁在发起攻击(源 IP)、目标是什么(目标 IP 和端口),以及怀疑是什么类型的攻击(消息)。
检查完整数据包转储
虽然快速日志非常适合快速概览,但它缺乏深入调查所需的详细技术细节。在此步骤中,你将检查 full_alert.log 文件。
完整日志支持另一个层面的问题:不仅是「触发了什么警报?」,而是「触发警报的数据包到底是什么样的?」。这种更深层次的上下文有助于分析师验证警报、理解协议行为,并调查潜在的误报或规避行为。
「完整」警报格式包含完整的数据包头信息。这使得分析师能够检查诸如生存时间(TTL)、服务类型(TOS)、数据包长度和 TCP 标志等细节,这些对于理解攻击性质或识别误报至关重要。
由于完整日志每个警报包含多行,因此可能会很长。使用 head 命令查看文件的前 30 行,这将向你展示前几个警报的详细信息。
head -n 30 /var/log/snort/full_alert.log
你的输出将类似于这样:
[**] [1:1000001:1] ICMP Ping Detected [**]
09/15-10:00:01.123456 192.168.1.10 -> 8.8.8.8
ICMP TTL:64 TOS:0x0 ID:12345 IpLen:20 DgmLen:84 DF
Type:8 Code:0 ID:15 Seq:1 ECHO
...
[**] [1:1000002:1] HTTP Traffic Detected [**]
09/15-10:00:05.654321 192.168.1.10:45678 -> 93.184.216.34:80
TCP TTL:64 TOS:0x0 ID:54321 IpLen:20 DgmLen:60 DF
******S* Seq: 0x1A2B3C4D Ack: 0x0 Win: 0xFAF0 TcpLen: 40
注意完整日志中提供的额外细节:
- IP 头信息:
TTL:64(生存时间)、TOS:0x0(服务类型)、ID:12345(IP 标识)和DgmLen:84(数据报长度)。 - ICMP 特性:
Type:8 Code:0表示 ICMP 回显请求(标准 ping)。 - TCP 特性:
******S*代表数据包中设置的 TCP 标志(在本例中,设置了 SYN 标志,表示连接的开始)。它还显示了序列号(Seq)、确认号(Ack)和窗口大小(Win)。
通过分析这些完整的数据包转储,你可以更深入地了解触发 IDS 警报的网络流量。
总结
在本实验中,你成功配置并运行了 Snort 入侵检测系统来监控网络流量。你学习了如何通过生成特定类型的网络流量(如 ICMP ping 和 HTTP 请求)来触发自定义检测规则。此外,你还探索了 Snort 的 fast 和 full 警报日志之间的区别,获得了阅读和解读其中关键信息的实践经验,从基本的源和目标 IP 到详细的数据包头标志。这些技能对于有效监控网络安全和应对潜在威胁至关重要。



