Snort IDS 入门

网络安全Beginner
立即练习

简介

欢迎来到 Snort IDS 入门实验。

Snort 是一个开源的网络入侵防御系统(NIPS)和网络入侵检测系统(NIDS),能够对 IP 网络进行实时流量分析和数据包记录。它能够执行协议分析、内容搜索和匹配,通常用于主动拦截或被动检测各种攻击和探测,例如缓冲区溢出、隐蔽端口扫描、Web 应用攻击等。

从宏观层面来看,IDS 与数据包嗅探器解决的问题不同。嗅探器帮助你观察流量,而 IDS 则试图判断这些流量中是否有值得关注的内容。Snort 通过将数据包检查与规则语言相结合来实现这一点。换句话说,它将原始流量转化为与安全相关的事件。

在本实验中,你将学习 Snort 的基础知识。你将探索其配置文件,学习如何验证配置语法,并以其两种主要操作模式运行 Snort:嗅探模式(Sniffer mode)和数据包记录模式(Packet Logger mode)。

检查 Snort 配置文件

在这一步中,你将探索 Snort 使用的主要配置文件。理解该文件至关重要,因为它决定了 Snort 的行为方式、它保护的网络以及它所应用的规则。

配置之所以重要,是因为检测质量在很大程度上取决于上下文。如果一个 IDS 不知道哪些地址属于你的环境,它就无法很好地判断入站流量与内部流量。因此,像 HOME_NET 这样的变量不仅仅是装饰性的设置,它们是 Snort 对其所防御网络进行建模的一部分。

Snort 的主配置文件位于 /etc/snort/snort.conf。该文件包含各种设置,包括网络变量、规则文件路径和预处理器配置。

首先,让我们导航到你的项目目录,这是你的默认工作空间。

cd ~/project

Snort 配置文件中最重要的变量之一是 HOME_NET。此变量定义了 Snort 需要保护的内部网络。默认情况下,它通常设置为 any,这意味着 Snort 将监控所有网络流量。

你可以使用 grep 命令在配置文件中搜索 HOME_NET 变量。grep 命令是 Linux 中一个强大的工具,用于在文件中搜索特定的文本模式。由于配置文件受到保护,我们需要使用 sudo 以管理员权限运行该命令。

sudo grep "ipvar HOME_NET" /etc/snort/snort.conf

你应该会看到类似以下的输出:

ipvar HOME_NET any

此输出确认 HOME_NET 变量当前设置为 any。在真实的生产环境中,你通常会将其更改为匹配你特定的内部 IP 子网(例如 192.168.1.0/24),以减少误报并提高性能。

如果你想进一步探索,也可以使用 less 命令查看整个配置文件,尽管它非常长。目前,了解文件位置以及如何查找关键变量就足够了。

测试配置语法

在这一步中,你将学习如何测试 Snort 配置文件是否存在语法错误。

部署前进行验证是一项关键的操作实践。只有当引擎能够实际加载检测规则或配置文件时,它们才有用。语法测试相当于代码发布前的编译:它能尽早发现破坏性的更改,并防止生产环境中的盲点。

每当你对 snort.conf 文件进行更改时,强烈建议在启动或重启 Snort 服务之前测试配置。如果存在拼写错误或配置不当,Snort 将无法启动,这可能会导致你的网络处于无人监控的状态。

Snort 提供了一个内置的测试模式。你可以使用 -T 标志告诉 Snort 测试配置,并使用 -c 标志指定要测试的配置文件的路径。

运行以下命令来测试默认配置:

sudo snort -T -c /etc/snort/snort.conf

由于 Snort 需要访问网络接口和系统级文件,你必须使用 sudo 运行它以授予其管理员权限。

当命令运行时,Snort 会向终端输出大量信息。它正在初始化预处理器、加载规则并验证语法。

滚动到输出的底部。你需要寻找一条特定的成功消息,如下所示:

        --== Initialization Complete ==--

   ,,_     -*> Snort! <*-
  o"  )~   Version 2.9.15.1 GRE (Build 68)
   ''''    By Martin Roesch & The Snort Team: http://www.snort.org/contact#team
           Copyright (C) 2014-2019 Cisco and/or its affiliates. All rights reserved.
           Copyright (C) 1998-2013 Sourcefire, Inc., et al.
           Using libpcap version 1.10.1 (with TPACKET_V3)
           Using PCRE version: 8.39 2016-06-14
           Using ZLIB version: 1.2.11

           Rules Engine: SF_SNORT_DETECTION_ENGINE  Version 3.0  <Build 1>
           Preprocessor Object: SF_GTP  Version 1.1  <Build 4>
           Preprocessor Object: SF_CORVUS  Version 1.1  <Build 4>
           ...

Snort successfully validated the configuration!
Snort exiting

这里的关键短语是 Snort successfully validated the configuration!。这意味着你的 snort.conf 文件语法正确,可以使用了。

以嗅探模式运行 Snort

在这一步中,你将以嗅探模式(Sniffer mode)运行 Snort。

嗅探模式是使用 Snort 最基本的方式。在这种模式下,Snort 只是读取流经网络的流量,并以连续流的形式将其显示在控制台上。它的作用非常类似于流行的 tcpdump 工具。

这在教学上很有用,因为它表明 IDS 技术仍然是从数据包开始的。在 Snort 能够对流量发出警报之前,它必须正确捕获并解码该流量。先学习嗅探模式可以保持数据包层面的基础可见,而不是将警报视为某种神奇的东西。

要以嗅探模式运行 Snort,请使用 -v(详细)标志。这会告诉 Snort 将 TCP/IP 数据包头打印到屏幕上。

由于网络流量可能会非常大并淹没你的终端,我们还将使用 -n 标志后跟一个数字。这会告诉 Snort 只捕获特定数量的数据包,然后自动退出。

运行以下命令来捕获并显示 5 个数据包:

sudo snort -v -n 5

你将看到类似以下的输出,显示数据包头:

Running in packet dump mode

        --== Initializing Snort ==--
Initializing Output Plugins!
pcap DAQ configured to passive.
Acquiring network traffic from "eth0".
...
05/18-14:32:10.123456 192.168.1.10:54321 -> 8.8.8.8:53
UDP TTL:64 TOS:0x0 ID:12345 IpLen:20 DgmLen:63
Len: 35
...
===============================================================================
Snort exiting

如果你想查看更多细节,可以组合使用标志。例如,添加 -d 会显示数据包的应用数据(载荷),而 -e 会显示链路层(MAC 地址)头。

让我们尝试捕获 2 个包含完整详细信息(头、数据和链路层信息)的数据包:

sudo snort -vde -n 2

这种模式对于排查网络连接问题或快速检查当前通过网络接口的流量类型非常有用。

以数据包记录模式运行 Snort

在这一步中,你将学习如何以数据包记录模式(Packet Logger mode)运行 Snort。

虽然嗅探模式非常适合实时查看,但它不适用于长期监控或详细分析。数据包记录模式通过将捕获的数据包以可供后续分析(使用 Wireshark 或 Snort 本身)的格式保存到磁盘来解决这个问题。

保存的数据包证据非常重要,因为警报和数据包是相辅相成的。警报告诉你规则被触发了,而数据包记录则让你确认实际发生了什么,并调查警报摘要中可能未包含的细节。成熟的监控栈通常会同时保留这两者。

首先,你需要创建一个目录来存储日志文件。让我们在项目文件夹中创建一个名为 snort_logs 的目录。

mkdir -p ~/project/snort_logs

要以数据包记录模式运行 Snort,请使用 -l 标志后跟日志目录的路径。我们还将使用 -dev 来捕获完整的数据包细节,并使用 -n 10 在退出前精确捕获 10 个数据包。

运行以下命令:

sudo snort -dev -l ~/project/snort_logs -n 10

Snort 将捕获 10 个数据包并将它们写入你指定的目录。这次你不会在屏幕上看到打印出的数据包,但你会看到初始化和退出摘要。

Snort 运行完成后,你可以通过列出 snort_logs 目录的内容来验证日志文件是否已创建:

ls -l ~/project/snort_logs

你应该会看到一个名为 snort.log. 后跟时间戳的文件,类似于这样:

total 4
-rw------- 1 root root 1234 May 18 14:45 snort.log.1684421100

该文件以二进制格式(pcap)保存。你不能直接使用 nano 或 cat 等文本编辑器读取它。相反,你通常会使用 tcpdump 等工具,或者使用 -r(读取)标志将其读回 Snort 以进行进一步分析。

总结

恭喜!你已成功完成 Snort IDS 入门实验。

在本实验中,你学习了 Snort 的基本概念。你探索了主配置文件(snort.conf),并学习了如何使用 -T 标志验证其语法以防止启动错误。你还练习了以嗅探模式运行 Snort 以在终端查看实时网络流量,以及以数据包记录模式将捕获的数据包保存到目录中以供日后分析。这些基础技能对于任何希望利用 Snort 进行网络安全监控和入侵检测的人来说都是必不可少的。