简介
在本次实验中,你将学习使用 Suricata(一款强大的开源威胁检测引擎)来检测网络异常。你将探索其关键特性,包括规则配置、流量监控和警报分析,以识别潜在的安全威胁。
实践练习将指导你完成 Suricata 的设置、基本规则创建以及实时流量检查。你将获得检测可疑活动(如 ICMP ping 请求)的实践经验,并针对特定威胁场景自定义规则。
在本次实验中,你将学习使用 Suricata(一款强大的开源威胁检测引擎)来检测网络异常。你将探索其关键特性,包括规则配置、流量监控和警报分析,以识别潜在的安全威胁。
实践练习将指导你完成 Suricata 的设置、基本规则创建以及实时流量检查。你将获得检测可疑活动(如 ICMP ping 请求)的实践经验,并针对特定威胁场景自定义规则。
在这一步中,你将安装 Suricata,一款开源的网络威胁检测引擎。Suricata 就像是你网络的安全摄像头,持续分析流量以识别潜在威胁。它可以执行三项关键功能:实时入侵检测(IDS)以监控攻击、内联入侵防御(IPS)以阻止恶意流量,以及网络安全监控以记录所有活动。
让我们逐步开始安装过程:
首先,我们需要更新软件包列表。这能确保在安装任何软件之前,你的系统了解最新可用的软件版本:
sudo apt update
sudo
命令赋予你管理员权限,而 apt update
会刷新系统的可用软件包列表。
现在,我们将安装 Suricata 及其所有必要的组件(依赖项)。-y
标志会自动确认安装:
sudo apt install -y suricata
此命令从 Ubuntu 的官方软件源下载并安装 Suricata 软件包。
安装完成后,让我们通过检查已安装的版本来验证一切是否正常工作:
suricata -V
你应该会看到类似以下的输出:
This is Suricata version 6.0.3 RELEASE
-V
标志指示 Suricata 显示其版本信息。看到此输出即确认安装成功。
Suricata 的行为由一个配置文件控制。让我们检查这个重要的文件是否存在于其默认位置:
ls /etc/suricata/suricata.yaml
/etc/suricata/
目录是 Linux 通常存储系统级应用程序配置文件的地方。
最后,Suricata 需要规则来知道在网络流量中查找什么。这些规则就像是一组指令,告诉 Suricata 什么构成了可疑活动。默认规则存储在:
ls /var/lib/suricata/rules
/var/lib/suricata/rules
目录包含随 Suricata 安装附带的规则文件。我们将在后续实验中使用这些规则。
在这一步中,你将为 Suricata 配置基本的检测规则。规则是告知 Suricata 在网络流量中查找什么的核心组件。可以将它们视为一组定义可疑模式或已知威胁的指令。
首先,导航到存储所有规则文件的 Suricata 规则目录:
cd /var/lib/suricata/rules
这里是 Suricata 存放其默认和自定义规则文件的地方。该目录位置在 Suricata 的配置中指定。
列出现有的规则文件,查看已经可用的规则:
ls
你应该会看到几个 .rules
文件,如 suricata.rules
。这些文件包含 Suricata 用于检测的不同类别的规则。
让我们来研究一下基本的规则结构。使用 nano 编辑器打开主规则文件:
sudo nano suricata.rules
nano 编辑器是一个简单的文本编辑器,我们将用它来修改规则。你会看到许多具有相似结构的现有规则。
添加一条简单的规则来检测 ICMP ping 请求(将此规则添加到文件末尾):
alert icmp any any -> any any (msg:"ICMP Ping Detected"; itype:8; sid:1000001; rev:1;)
让我们来详细分析这条规则的作用:
alert
:告知 Suricata 在匹配时生成警报icmp
:适用于 ICMP 协议流量any any -> any any
:匹配任何源 IP/端口到任何目标 IP/端口msg
:将出现在日志中的警报消息itype:8
:专门匹配 ICMP 类型 8(ping 请求)sid
:唯一的规则标识符(自定义规则从 1000001 开始)rev
:规则修订号保存文件(在 nano 中按 Ctrl+O,回车,Ctrl+X)。这会将你的新规则永久保存。
在应用规则之前,验证规则语法是否正确:
sudo suricata -T -c /etc/suricata/suricata.yaml -v
-T
标志用于测试配置。你应该会看到以如下内容结尾的输出:
Configuration provided was successfully loaded. Exiting.
这确认了你的规则格式正确。
重启 Suricata 以加载新规则并开始监控:
sudo pkill suricata
sudo suricata -c /etc/suricata/suricata.yaml -i eth0
第一条命令停止任何正在运行的 Suricata 实例,而第二条命令使用你的新规则重新启动它,并监控 eth0 接口。
在这一步中,我们将观察 Suricata 如何监控实时网络流量,并根据我们之前配置的规则生成警报。这是任何入侵检测系统(IDS, Intrusion Detection System)的核心功能——监控网络数据包并标记可疑活动。
首先,我们需要以实时捕获模式启动 Suricata。以下命令将先停止任何正在运行的 Suricata 实例(如果存在),然后启动一个新的实例来监控 eth0 接口:
sudo pkill suricata
sudo suricata -c /etc/suricata/suricata.yaml -i eth0
-c
标志指定我们的配置文件,而 -i
则告诉 Suricata 要监控哪个网络接口。
现在,让我们生成一些测试流量,这些流量应该会触发我们上一步创建的 ICMP 规则。打开一个新的终端并运行:
ping -c 3 8.8.8.8
这会向谷歌的 DNS 服务器(8.8.8.8)发送 3 个 ICMP ping 数据包。由于我们创建了一个检测 ICMP 流量的规则,Suricata 应该会记录此活动。
Suricata 将警报写入 /var/log/suricata/fast.log
。要实时查看这些警报,请使用:
sudo tail -f /var/log/suricata/fast.log
tail -f
命令会持续显示文件中新增的行。你应该会看到类似以下的输出:
01/01/2023-12:34:56.123456 [**] [1:1000001:1] ICMP Ping Detected [**] [Classification: (null)] [Priority: 3] {ICMP} 192.168.1.1 -> 8.8.8.8
这显示了时间戳、规则 ID(1:1000001:1)、警报消息以及源/目标 IP 地址。
若要查看更详细的 JSON 格式日志,我们可以检查 eve.json 文件。以下命令会过滤并美化输出,仅显示警报事件:
sudo tail -f /var/log/suricata/eve.json | jq '. | select(.event_type == "alert")'
jq
工具可帮助解析和格式化 JSON 输出,使其更易于阅读。
若要查看 Suricata 正在处理的流量统计信息,包括生成了多少警报,请使用:
sudo suricatasc -c stats
在输出中查找类似 detect.alert
的计数器——这显示了我们的规则触发警报的次数。
当你完成流量观察后,在任何正在监控日志的终端窗口中按 Ctrl+C 停止持续输出。
在这一步中,你将分析上一次监控会话中 Suricata 生成的警报。这有助于你了解哪些流量模式触发了你的规则。在使用入侵检测系统时,审查警报对于识别潜在的安全威胁和微调检测规则至关重要。
首先,查看基本的警报日志:
sudo cat /var/log/suricata/fast.log
此命令以简单易读的格式显示带有时间戳的警报。fast.log
是 Suricata 的默认警报输出文件。查找包含“ICMP Ping Detected”的条目,这些条目表示与你的检测规则匹配的 ping 请求。
若要进行更详细的分析,请检查结构化的 JSON 日志:
sudo cat /var/log/suricata/eve.json | jq '. | select(.event_type == "alert")'
eve.json
文件以 JSON 格式包含了全面的机器可读日志。我们使用 jq
仅过滤出警报事件。这将提供详细信息,包括:
若要统计每个警报被触发的次数:
sudo grep -o "ICMP Ping Detected" /var/log/suricata/fast.log | wc -l
这个命令管道首先使用 grep -o
提取所有“ICMP Ping Detected”的出现次数,然后使用 wc -l
进行计数。这有助于量化此事件发生的频率。
若要查看警报类型的摘要:
sudo jq -r '.alert.signature' /var/log/suricata/eve.json | sort | uniq -c
此命令提取所有警报签名(规则名称),按字母顺序排序,然后统计唯一出现的次数。它能让你了解哪些规则触发得最频繁。
若要查看带有源 IP 信息的警报:
sudo jq -r 'select(.event_type == "alert") | [.timestamp, .src_ip, .alert.signature] | @tsv' /var/log/suricata/eve.json
这个高级 jq
查询创建了一个以制表符分隔的输出,显示每个事件的时间戳、源 IP 和警报签名。@tsv
格式便于导入电子表格。
若要查看最近的 5 条警报:
sudo tail -n 5 /var/log/suricata/fast.log
tail
命令显示文件的最后几行。这对于快速检查最近的活动很有用,无需滚动查看整个日志。
在这一步中,你将学习如何创建并测试自己的 Suricata 规则,以检测网络流量中的特定模式。我们将以检测对测试域名(example.com)的 HTTP 请求为例进行实践。自定义规则能让你扩展 Suricata 的检测能力,使其超越默认规则集。
首先,导航到 Suricata 存储检测规则的目录:
cd /var/lib/suricata/rules
这里通常存储着所有 Suricata 规则文件。我们将把自定义规则添加到此处,以便与现有规则保持组织有序。
创建一个专门用于存放自定义规则的新规则文件:
sudo nano custom.rules
使用 sudo
是必要的,因为规则目录需要管理员权限才能修改。我们将文件命名为 custom.rules
,以便与 Suricata 的默认规则文件明确区分。
添加以下规则来检测对 example.com 的 HTTP 请求:
alert http any any -> any any (msg:"HTTP Request to example.com"; flow:to_server; http.host; content:"example.com"; nocase; sid:1000002; rev:1;)
下面来详细解释这条规则的作用:
alert http
:针对 HTTP 流量触发警报any any -> any any
:适用于从任何源端口到任何目标端口的流量msg
:提供一个人类可读的警报消息flow:to_server
:仅匹配流向服务器的流量http.host
:检查 HTTP 主机头content:"example.com"
:查找特定的域名nocase
:使匹配不区分大小写sid:1000002
:为规则赋予一个唯一的 ID(自定义规则的 ID 需大于 1,000,000)rev:1
:表示这是该规则的第一个版本在 nano 编辑器中,按 Ctrl+O(写入),然后按 Enter 确认,再按 Ctrl+X 退出以保存文件。
现在,我们需要告知 Suricata 加载新的规则文件。编辑主配置文件:
sudo nano /etc/suricata/suricata.yaml
找到 rule-files:
部分(通常在第 50 - 60 行左右)并添加:
- custom.rules
这一添加操作确保 Suricata 在启动时会加载我们的自定义规则。
在应用更改之前,验证规则语法是否正确:
sudo suricata -T -c /etc/suricata/suricata.yaml -v
-T
标志指示 Suricata 测试配置而不实际运行。这有助于在使用规则之前捕获其中的任何语法错误。
重启 Suricata 以加载新规则:
sudo pkill suricata
sudo suricata -c /etc/suricata/suricata.yaml -i eth0
第一条命令停止任何正在运行的 Suricata 实例,第二条命令使用更新后的配置重新启动它。
为了测试我们的规则是否有效,生成一些对 example.com 的 HTTP 流量:
curl http://example.com
此命令会发起一个简单的 HTTP 请求,应该会触发我们的新规则。
最后,通过查看最新的警报来检查 Suricata 是否检测到了该流量:
sudo tail -n 5 /var/log/suricata/fast.log
你应该会看到一条与我们自定义规则中关于对 example.com 的 HTTP 请求消息相匹配的警报。如果没有看到,请仔细检查每一步并验证规则语法。
在本次实验中,你学习了如何安装和配置开源网络威胁检测引擎 Suricata。该过程包括更新软件包、安装依赖项,以及通过检查配置文件和规则目录来验证安装情况。
你还尝试了创建自定义检测规则,添加了一条 ICMP ping 请求规则,并了解了其结构和组成部分。最后,你验证了规则语法,以确保 Suricata 能够有效地监控网络流量并针对异常情况生成警报。