一、Snort介绍
Snort 是一款开源的网络入侵检测与防御系统 (IDS/IPS)。自 1998 年由 Martin Roesch 创建以来,Snort 已经发展成为全球最广泛部署的 IDS/IPS 之一,拥有数百万次的下载量和庞大的用户社区。目前,Snort 由思科公司开发和维护。
可以将 Snort 理解为一个网络安全领域的瑞士军刀,它能够执行多种任务,主要有以下三种模式:
- 嗅探器模式 (Sniffer Mode): 类似于
tcpdump
工具,Snort 可以捕获网络数据包并在控制台上显示它们的信息。这对于网络流量的实时监控和初步分析非常有用。你可以使用-v
选项来启动 Snort 的嗅探器模式,例如:./snort -v
。更详细的信息可以使用-vd
或-vde
等选项。 - 数据包记录器模式 (Packet Logger Mode): 在此模式下,Snort 将捕获的网络数据包保存到磁盘上的日志文件中。这对于后续的网络流量分析、故障排除和安全事件调查至关重要。你可以使用
-l
选项指定日志文件的存储路径,例如:./snort -l /var/log/snort
。 - 网络入侵检测系统模式 (Network Intrusion Detection System Mode - NIDS): 这是 Snort 最核心的功能。在此模式下,Snort 会实时分析网络流量,并将其与预先定义的规则集进行比对。当检测到与规则匹配的可疑或恶意活动时,Snort 会生成警报。你可以使用
-c
选项指定 Snort 的配置文件,例如:./snort -dev -l /var/log/snort -h 192.168.1.0/24 -c /etc/snort/snort.conf
。
Snort 的主要特点和功能包括:
- 基于规则的检测: Snort 使用一套灵活且强大的规则语言来描述需要检测的恶意网络活动、漏洞利用尝试、端口扫描和其他可疑行为。这些规则可以基于协议、端口、IP 地址、数据包内容等进行定义。
- 实时流量分析: Snort 能够实时捕获和分析网络数据包,从而及时发现和响应潜在的安全威胁。
- 协议分析: Snort 不仅检查数据包的内容,还能分析各种网络协议(如 TCP、UDP、ICMP、HTTP 等)的头部信息和行为,以识别协议异常或攻击。
- 特征匹配 (Signature-Based Detection): Snort 通过将网络流量中的模式与已知的恶意活动特征(签名)进行比对来检测威胁。这对于识别已知的攻击和恶意软件非常有效。
- 异常检测 (Anomaly-Based Detection): 虽然 Snort 主要依赖于特征匹配,但它也具备一定的异常检测能力,通过分析网络流量中不寻常的行为模式来发现潜在的未知威胁。
- 自定义规则: 用户可以根据自己的网络环境和安全需求编写自定义的 Snort 规则,以检测特定的威胁或策略违规行为。
- 灵活的输出选项: Snort 可以将警报和日志信息输出到多种目标,包括控制台、Syslog、数据库等,方便用户进行监控和分析。
- 多种操作模式: 如前所述,Snort 可以作为数据包嗅探器、数据包记录器和全功能的网络入侵检测系统运行。
- 插件化架构 (Snort 3.x): Snort 的新版本(Snort 3)采用了更加模块化和可扩展的插件化架构,拥有超过 200 个插件,提供了更丰富的功能和更高的性能。
- 多平台兼容性: Snort 可以在多种操作系统上运行,包括 Linux、Windows 和 macOS。
- 庞大的社区支持: Snort 拥有一个活跃的开源社区,不断贡献新的检测规则和提供支持。思科 Talos 团队也维护着一套高质量的付费规则集(Snort Subscriber Ruleset),可以实时更新最新的威胁情报。
Snort 的一些常见应用场景包括:
- 实时监控网络流量,检测恶意活动和攻击。
- 记录网络数据包,用于安全事件分析和取证。
- 识别和阻止已知的网络威胁(在 IPS 模式下)。
- 检测潜在的漏洞利用尝试和端口扫描。
- 监控特定协议或应用程序的异常行为。
- 为其他安全工具提供网络流量分析数据。
要开始使用 Snort,你需要进行以下基本步骤:
- 下载 Snort: 访问 Snort 的官方网站 (Snort - Network Intrusion Detection & Prevention System) 下载适合你操作系统的版本。目前主要有两个主要版本:Snort 2 (Legacy) 和 Snort 3。建议新用户尝试 Snort 3。
- 安装 Snort: 按照官方文档提供的安装指南进行安装。在 Windows 系统上,通常需要先安装 WinPcap 或 Npcap 数据包捕获库以及 Visual C++ Redistributable。在 Linux 系统上,可以使用包管理器进行安装,或者从源代码编译安装。
- 配置 Snort: 主要的配置文件是
snort.conf
,你需要编辑此文件来定义网络接口、IP 地址、规则路径、输出方式等。 - 获取规则集: 你可以使用 Snort 社区规则集(免费)或购买 Snort Subscriber Ruleset(付费)。你需要将这些规则文件配置到
snort.conf
中。 - 运行 Snort: 根据你的需求选择合适的运行模式(嗅探器、记录器或 NIDS)。
- 分析警报和日志: 当 Snort 检测到可疑活动时,它会生成警报。你需要配置适当的输出方式,并定期分析这些警报和日志,以便及时响应安全事件。
Snort 是一款功能强大且灵活的网络安全工具,对于网络安全专业人员和系统管理员来说,理解和掌握 Snort 的使用是非常重要的。它可以帮助你深入了解网络流量,及时发现和应对潜在的安全威胁,从而提升整体的网络安全防护水平。
二、安装及运行
1、下载
git clone https://github.com/snort3/snort3.git
2、安装
请按照以下步骤操作:
1.设置源目录:
-
如果您使用的是 GitHub 克隆:
cd snort3/
-
否则,请执行以下操作:
tar zxf snort-tarball cd snort-3.0.0*
2.设置安装路径:
export my_path=/path/to/snorty
3.编译安装:
-
要使用 cmake 和 make 进行构建,请运行 configure_cmake.sh。它将自动创建并填充一个名为“build”的新子目录。
./configure_cmake.sh --prefix=$my_path cd build make -j $(nproc) install
4.笔记:
- 如果您可以执行 src/snort -V,则表示您构建成功。
- 如果您熟悉 cmake,您可以运行 cmake/ccmake 而不是 configure_cmake.sh。
- cmake --help 会列出所有可用的生成器,例如 Xcode。您可以随意使用,但具体帮助信息将另行提供。
2、运行
以下是一些示例。如果您使用的是 Talos 规则和/或配置,则应首先在 snort.lua 和 snort_defaults.lua 的顶部设置所需的变量。
-
Snort++从命令行提供了许多帮助,包括:
$my_path/bin/snort --help $my_path/bin/snort --help-module suppress $my_path/bin/snort --help-config | grep thread
-
检查并转储 pcap 文件。将以下内容中的 a.pcap 替换为您喜欢的文件:
$my_path/bin/snort -r a.pcap $my_path/bin/snort -L dump -d -e -q -r a.pcap
-
验证配置(有或无规则):
$my_path/bin/snort -c $my_path/etc/snort/snort.lua $my_path/bin/snort -c $my_path/etc/snort/snort.lua -R $my_path/etc/snort/sample.rules
-
运行 IDS 模式。将以下内容中的 pcaps/ 替换为包含一个或多个 *.pcap 文件的目录路径:
$my_path/bin/snort -c $my_path/etc/snort/snort.lua -R $my_path/etc/snort/sample.rules \-r a.pcap -A alert_test -n 100000
-
让我们抑制 1:2123。我们可以编辑配置文件,或者这样做:
$my_path/bin/snort -c $my_path/etc/snort/snort.lua -R $my_path/etc/snort/sample.rules \-r a.pcap -A alert_test -n 100000 --lua "suppress = { { gid = 1, sid = 2123 } }"
-
对具有多个数据包线程的目录进行全面检查:
$my_path/bin/snort -c $my_path/etc/snort/snort.lua -R $my_path/etc/snort/sample.rules \--pcap-filter \*.pcap --pcap-dir pcaps/ -A alert_fast --max-packet-threads 8
三、安装Docker版本
1、前提条件:
- 你已经安装了 Docker Engine。
2、基本使用步骤:
1.拉取 Snort Docker 镜像 (如果尚未拉取):
通常,你会从 Docker Hub 上拉取一个预构建的 Snort 镜像。有许多不同的维护者提供了 Snort 镜像,你可以根据自己的需求选择。一些常见的镜像包括官方 Snort 镜像(如果有的话,请查阅 Docker Hub)或者社区维护的镜像。
例如,假设你选择了一个名为 your_snort_image
的镜像,你可以使用以下命令拉取:
docker pull your_snort_image
示例:
#下载容器
docker pull ciscotalos/snort3
#启动容器
docker run --name snort3 -h snort3 -u snorty -w /home/snorty -d -it ciscotalos/snort3 bash
#进入 Snort 容器
docker exec -it snort3 bash
#停止 Snort 容器
docker kill snort3
2.运行 Snort Docker 容器:
使用 docker run
命令来启动 Snort 容器。你需要根据你的需求挂载配置文件、指定网络模式、传递 Snort 的命令行参数等。
以下是一些常见的 docker run
选项和 Snort 的使用场景:
-
基本运行 (嗅探模式):
如果你只是想简单地在容器中运行 Snort 并查看网络流量(嗅探模式),你需要将宿主机的网络接口传递给容器。可以使用
--network host
选项(注意:这可能会带来一些安全风险,因为它允许容器直接访问宿主机的网络堆栈)。docker run --rm --name snort-sniffer --network host your_snort_image -v -i eth0
--rm
: 容器退出后自动删除。--name snort-sniffer
: 为容器指定一个名称。--network host
: 使容器共享宿主机的网络命名空间。你需要将eth0
替换为你实际的网络接口名称。your_snort_image
: 你拉取的 Snort 镜像名称。-v -i eth0
: 传递给 Snort 的命令行参数,这里是详细模式 (-v
) 并监听eth0
接口 (-i eth0
).
-
使用自定义配置文件:
通常,你需要使用自定义的 Snort 配置文件、规则集等。你需要将这些文件挂载到容器中。
docker run --rm --name snort-ids --network host \ -v /path/to/your/snort.conf:/etc/snort/snort.conf \ -v /path/to/your/rules:/etc/snort/rules \ -v /var/log/snort:/var/log/snort \ your_snort_image -dev -i eth0 -c /etc/snort/snort.conf -l /var/log/snort -S HOME_NET=192.168.1.0/24
-v /path/to/your/snort.conf:/etc/snort/snort.conf
: 将宿主机上的snort.conf
文件挂载到容器内的/etc/snort/snort.conf
。-v /path/to/your/rules:/etc/snort/rules
: 将宿主机上的规则目录挂载到容器内的/etc/snort/rules
。你可能需要在snort.conf
中配置这些规则的路径。-v /var/log/snort:/var/log/snort
: 将宿主机上的日志目录挂载到容器内的/var/log/snort
,以便在宿主机上查看日志。-dev -i eth0 -c /etc/snort/snort.conf -l /var/log/snort -S HOME_NET=192.168.1.0/24
: 传递给 Snort 的命令行参数,包括指定接口、配置文件、日志目录和定义$HOME_NET
变量。
-
使用 Docker 网络 (更安全的方式):
使用
--network host
会让容器共享宿主机的网络堆栈,这在某些情况下可能不安全。更安全的方式是创建 Docker 网络并将 Snort 容器连接到该网络,并捕获流经该网络的数据包。这通常需要更复杂的设置,例如将 Snort 容器连接到 Docker 网桥,并可能需要使用tcpdump
或其他工具在宿主机上捕获流经网桥的流量,然后将捕获的文件挂载到 Snort 容器进行分析。或者,一些更高级的 Docker 网络方案(例如使用 Macvlan)可以允许容器拥有自己的 MAC 地址和直接连接到物理网络。
-
结合其他工具 (例如 Snorby/BASE):
如果你想使用 GUI 工具来分析 Snort 的警报,你需要配置 Snort 将警报输出到 Docker 容器内,然后将容器内的警报日志或 Unified2 文件挂载到运行 Snorby 或 BASE 的另一个容器中,或者配置 Snort 将警报发送到宿主机,再由宿主机上的 GUI 工具进行处理。
3.常用操作:
-
查看正在运行的 Snort 容器:
docker ps
-
查看 Snort 容器的日志 (如果警报输出到容器的标准输出):
docker logs <容器名称或ID>
-
停止 Snort 容器:
docker stop <容器名称或ID>
-
删除 Snort 容器:
docker rm <容器名称或ID>
4.注意事项:
- 网络接口权限: 确保 Docker 进程有权限访问你的网络接口。你可能需要使用
sudo
来运行 Docker 命令。 - 配置文件和规则路径: 仔细检查你在
docker run
命令中挂载的配置文件和规则路径是否正确。 - 网络模式选择: 根据你的安全需求和使用场景选择合适的 Docker 网络模式。
--network host
虽然简单,但需要谨慎使用。 - 日志管理: 配置正确的日志挂载,以便在宿主机上方便地查看和管理 Snort 的日志。
- Snort 版本和镜像维护者: 不同 Docker 镜像可能包含不同版本的 Snort 和预配置。选择一个你信任并了解的镜像。
- 资源限制: 你可以使用 Docker 的资源限制选项(例如
-m
for memory,--cpus
for CPU)来控制 Snort 容器使用的资源。
5.总结:
使用 Docker 运行 Snort 可以简化部署和管理。需要通过 docker run
命令启动容器,并使用 -v
选项挂载配置文件和日志目录,使用 -i
和 -c
等 Snort 命令行参数来配置 Snort 的行为。根据你的需求选择合适的网络模式,并考虑如何管理和分析 Snort 生成的警报和日志。熟悉 Docker 的基本操作和 Snort 的命令行选项是成功使用 Docker 版 Snort 的关键。
四、Docker版本注意事项
Docker 版本的 Snort 本质上就是在 Docker 容器这个隔离的环境中运行各种 Snort 的命令行程序。
Docker 提供了一个轻量级的、可移植的容器化平台。当你使用 Docker 镜像来运行 Snort 时,实际上是启动了一个包含了 Snort 及其依赖项的独立环境。
以下是需要理解的关键点:
- 镜像 (Image): Docker 镜像就像一个包含了运行 Snort 所需的所有文件、库、环境变量和配置的模板。它是一个静态的文件系统。
- 容器 (Container): 当你使用
docker run
命令基于一个镜像启动时,就创建了一个容器。容器是镜像的一个运行实例。它是一个隔离的进程,拥有自己的文件系统、网络空间等,但与宿主机共享内核。 - 命令行参数传递: 你在使用
docker run
命令时,可以将 Snort 的各种命令行选项(例如-c
指定配置文件,-i
指定网络接口,-l
指定日志目录等)作为参数传递给在容器内部运行的 Snort 可执行文件。 - 资源隔离: Docker 提供了资源隔离机制,可以限制 Snort 容器可以使用的 CPU、内存等资源。
- 环境一致性: 使用 Docker 可以确保在不同的宿主机上运行的 Snort 环境是一致的,避免了因环境差异导致的问题。
- 便捷部署: Docker 简化了 Snort 的部署过程,你不需要手动安装 Snort 及其依赖项。
举个例子:
当运行类似这样的 Docker 命令:
docker run --rm --name snort-ids --network host \
-v /path/to/your/snort.conf:/etc/snort/snort.conf \
your_snort_image -dev -i eth0 -c /etc/snort/snort.conf
实际上发生的是:
- Docker 基于
your_snort_image
创建并启动了一个新的容器。 -v /path/to/your/snort.conf:/etc/snort/snort.conf
这个选项将你宿主机上的snort.conf
文件挂载到容器内部的/etc/snort/snort.conf
路径。-dev -i eth0 -c /etc/snort/snort.conf
这部分被传递给了容器内部的 Snort 可执行文件,就好像你在直接在命令行运行snort -dev -i eth0 -c /etc/snort/snort.conf
一样。
因此,Docker 版本的 Snort 并没有改变 Snort 本身的使用方式,你仍然需要熟悉 Snort 的各种命令行选项和配置文件。Docker 只是提供了一个更方便、更隔离的方式来运行这个命令行工具及其相关的环境。
五、Snort命令使用介绍
1、基本语法:
snort <选项>
2、核心选项:
-
-A <mode>
: 设置警报输出模式。常用的模式有:full
: 输出完整的警报信息(默认)。fast
: 只输出时间戳、警报消息和优先级。none
: 不输出警报到控制台。unsock
: 使用 UNIX 套接字发送警报到其他程序。console
: 将警报输出到控制台。syslog
: 将警报发送到系统日志。unified2
: 以二进制格式输出警报,通常与 Barnyard2 等后处理工具配合使用。alert_unixsock
: 使用 UNIX 套接字发送警报,包含更多信息。
# 使用 fast 模式输出警报 sudo snort -A fast -dev -i eth0 -c /etc/snort/snort.conf
-
-b
: 以二进制格式记录数据包(BPF 格式)。通常与-l
选项一起使用。# 以二进制格式记录数据包到 /var/log/snort 目录 sudo snort -b -l /var/log/snort -i eth0
-
-c <config_file>
: 指定 Snort 的配置文件路径。这是最常用的选项之一,用于加载规则、预处理器、输出插件等配置。# 使用指定的配置文件启动 Snort sudo snort -c /etc/snort/my_snort.conf -dev -i eth0
-
-d
: 转储应用程序层的数据包数据。在嗅探器模式或记录器模式下查看数据包内容非常有用。# 嗅探数据包并显示应用层数据 sudo snort -vde -i eth0
-
-D
: 以守护进程模式运行 Snort,使其在后台运行。通常与-l
选项一起使用,将日志记录到指定目录。# 以守护进程模式运行 Snort 并记录日志 sudo snort -D -l /var/log/snort -i eth0 -c /etc/snort/snort.conf
-
-e
: 在数据包转储中显示数据链路层头部信息(例如 MAC 地址)。# 嗅探数据包并显示链路层头部 sudo snort -ve -i eth0
-
-f
: 让 Snort 在读取完所有指定的数据包文件后退出(通常与-r
选项一起使用)。# 读取指定的 pcap 文件并退出 sudo snort -r captured.pcap -f
-
-F <bpf_file>
: 从指定的文件加载 BPF 过滤器。BPF (Berkeley Packet Filter) 是一种强大的数据包过滤语言,可以精确地捕获感兴趣的网络流量。# 使用指定的 BPF 过滤器文件 sudo snort -F /etc/snort/my_filter.bpf -dev -i eth0 -c /etc/snort/snort.conf
-
-h <home_network>
: 定义受保护的内部网络地址和掩码。这个变量可以在 Snort 规则中使用,用$HOME_NET
指代。可以使用 CIDR 表示法(例如192.168.1.0/24
)或以逗号分隔的 IP 地址列表。# 定义内部网络 sudo snort -h 192.168.1.0/24 -dev -i eth0 -c /etc/snort/snort.conf
-
-i <interface>
: 指定 Snort 监听的网络接口。可以使用接口名称(例如eth0
,wlan0
)或any
监听所有接口。# 监听特定的网络接口 sudo snort -i wlan0 -dev -c /etc/snort/snort.conf
-
-I
: 启用内联模式(仅在 Snort 作为入侵防御系统 IPS 运行时有效,需要特定的内核模块或配置)。 -
-k <table>,<policy>
: 配置流会话策略。 -
-K <format>
: 设置数据包日志文件的格式 (pcap
或dump
). -
-l <log_dir>
: 指定 Snort 日志文件的存储目录。# 将日志记录到指定的目录 sudo snort -l /var/log/snort -dev -i eth0 -c /etc/snort/snort.conf
-
-L <binary_log_file>
: 指定要读取的二进制日志文件(通常与-r
结合使用)。 -
-m <message>
: 在启动时打印自定义消息。 -
-M
: 启用多进程模式(在 Snort 3.x 中更常见)。 -
-n <count>
: 只捕获指定数量的数据包后退出。# 只捕获 100 个数据包后退出 sudo snort -n 100 -v -i eth0
-
-N
: 禁止网络名称解析,以避免 DNS 查询。 -
-o
: 设置输出文件名前缀。 -
-O
: 禁止优化。 -
-p
: 不将网络接口设置为混杂模式(promiscuous mode)。在混杂模式下,网卡会接收所有经过的网络流量,而不仅仅是发往自身的数据包。通常 Snort 需要混杂模式才能捕获所有相关的流量。 -
-P <performance_profile>
: 加载性能配置文件。 -
-q
: 安静模式,不显示启动信息和统计数据。 -
-Q <queue_type>
: 指定数据包捕获队列类型。 -
-r <pcap_file>
: 从指定的 pcap 文件读取数据包进行分析,而不是从网络接口捕获。这对于离线分析非常有用。# 从 pcap 文件分析数据包 sudo snort -r captured_traffic.pcap -c /etc/snort/snort.conf
-
-R <ruleset>
: 指定要加载的额外规则文件或目录。 -
-s <snaplen>
: 设置数据包捕获的快照长度(以字节为单位)。Snort 只会捕获每个数据包的前snaplen
个字节。较小的snaplen
可以提高性能,但可能会丢失一些数据包的详细信息。# 设置快照长度为 1500 字节 sudo snort -s 1500 -dev -i eth0 -c /etc/snort/snort.conf
-
-S <signature_sid>=<filename>
: 覆盖特定 SID 的签名。 -
-T
: 测试配置文件是否正确,但不实际运行 Snort。# 测试配置文件 sudo snort -T -c /etc/snort/snort.conf
-
-u <user>
: 以指定用户身份运行 Snort。 -
-U
: 启用 UTC 时间戳。 -
-v
: 详细模式,显示捕获的数据包头部信息。# 以详细模式嗅探数据包 sudo snort -v -i eth0
-
-V
: 显示 Snort 版本信息并退出。# 显示 Snort 版本 snort -V
-
-w <wait_time>
: 设置等待接口启动的时间(以秒为单位)。 -
-W
: 显示可用接口列表并退出。# 显示可用网络接口 snort -W
-
-x <rule_var>
: 设置规则变量的值。 -
-X
: 转储原始十六进制数据包数据。 -
-y
: 包括链路层在原始十六进制转储中。 -
-z <pid_file>
: 指定 Snort 进程 ID (PID) 文件的路径(通常在守护进程模式下使用)。
3、Snort 3.x 特有的选项 (部分):
Snort 3.x 引入了更多的模块化和插件化架构,因此也有一些新的或修改的命令行选项。以下是一些例子:
--daq <daq_type>
: 指定要使用的数据采集 (DAQ) 模块。DAQ 负责从网络接口捕获数据包。常见的类型包括pcap
、afpacket
等。--daq-var <daq_option>=<value>
: 设置 DAQ 模块的特定选项。--lua-rule <lua_script>
: 加载 Lua 规则文件。Snort 3.x 支持使用 Lua 脚本编写更复杂的规则。--plugin-path <path>
: 指定插件的搜索路径。--module <module_name>
: 加载特定的 Snort 模块。--dump-config
: 转储已解析的 Snort 配置。
4、常用命令示例:
-
简单嗅探指定接口的流量:
sudo snort -v -i eth0
-
使用配置文件运行 Snort 作为入侵检测系统,并将警报输出到控制台:
sudo snort -dev -i eth0 -c /etc/snort/snort.conf
-
以守护进程模式运行 Snort,将日志记录到
/var/log/snort
目录:sudo snort -D -l /var/log/snort -i eth0 -c /etc/snort/snort.conf
-
从 pcap 文件读取数据包并使用指定的配置文件进行分析:
sudo snort -r captured.pcap -c /etc/snort/snort.conf
-
使用 fast 模式输出警报,并将日志记录到
/var/log/snort
目录:sudo snort -A fast -l /var/log/snort -dev -i eth0 -c /etc/snort/snort.conf
-
测试 Snort 配置文件是否有效:
sudo snort -T -c /etc/snort/snort.conf
5、总结:
Snort 的命令行选项非常强大且灵活,可以满足各种网络监控和入侵检测的需求。熟练掌握这些选项对于有效地使用 Snort 至关重要。建议经常查阅 Snort 的官方文档以获取最全面和最新的命令选项说明。在实际使用中,通常需要根据具体的网络环境和安全目标组合使用多个选项。