了解Suricata签名
介绍
本系列的第一个教程解释了如何安装和配置 Suricata。 如果您遵循该教程,您还学习了如何下载和更新 Suricata 规则集,以及如何检查日志以获取有关可疑活动的警报。 但是,您在该教程中下载的规则很多,涵盖了许多可能与您的网络和服务器无关的不同协议、应用程序和攻击向量。
在本教程中,您将了解 Suricata 签名的结构以及大多数规则中常用的一些重要选项。 一旦您熟悉了如何理解签名中的结构和字段,您就可以编写自己的签名,您可以将这些签名与防火墙结合起来,以提醒您有关服务器的大多数可疑流量,而无需使用其他外部规则集。
这种编写和管理规则的方法意味着您可以更有效地使用 Suricata,因为它只需要处理您编写的特定规则。 一旦您有了一个描述您希望在网络中遇到的大部分合法和可疑流量的规则集,您就可以开始使用 Suricata 在其主动入侵防御 (IPS) 模式下选择性地丢弃无效流量。 本系列的下一个教程将解释如何启用 Suricata 的 IPS 功能。
先决条件
出于本教程的目的,您可以在任何系统上运行 Suricata,因为签名通常不需要任何特定的操作系统。 如果您正在关注本教程系列,那么您应该已经拥有:
- Suricata 在 Ubuntu 20.04、Debian 11 或 Rocky Linux 8 服务器 上安装并运行。
- ET Open Ruleset 使用
suricata-update
命令下载,并包含在您的 Suricata 签名中。
了解 Suricata 签名的结构
Suricata 签名一开始可能看起来很复杂,但是一旦您了解了它们的结构以及 Suricata 如何处理它们,您就可以创建自己的规则来满足您的网络要求。
在高层次上,Suricata 签名由三部分组成:
- 当流量与规则匹配时采取的 Action。
- 描述主机、IP 地址、端口、协议和流量方向(传入或传出)的 Header。
- Options,指定诸如签名 ID (
sid
)、日志消息、匹配数据包内容的正则表达式、分类类型和其他有助于缩小识别合法和可疑范围的修饰符交通。
签名的一般结构如下:
通用规则结构
ACTION HEADER OPTIONS
签名的标题和选项部分有多个部分。 例如,在上一个教程中,您使用带有 sid
2100498 的规则测试了 Suricata。 以下是完整的规则供参考:
西德:2100498
alert ip any any -> any any (msg:"GPL ATTACK_RESPONSE id check returned root"; content:"uid=0|28|root|29|"; classtype:bad-unknown; sid:2100498; rev:7; metadata:created_at 2010_09_23, updated_at 2010_09_23;)
签名的 alert
部分是 action,ip any any -> any any
部分是 header,其余的签名以 (msg:GPL ATTACK_RESPONSE...
包含规则的 选项。
在以下部分中,您将详细检查 Suricata 规则的每个部分。
行动
sid:2100498
签名的第一部分是动作,在本例中为 alert
。 Suricata 签名的动作部分指定当数据包匹配规则时要采取的动作。 根据 Suricata 是在 IDS 还是 IPS 模式下运行,操作可以是以下之一:
- Pass - Suricata 将停止扫描数据包并允许它,而不生成警报。
- Drop - 在 IPS 模式下工作时,Suricata 将立即停止处理数据包并生成警报。 如果生成数据包的连接使用 TCP,它将超时。
- Reject - 当 Suricata 运行 IPS 模式时,将发送一个 TCP 重置数据包,Suricata 将丢弃匹配的数据包。
- Alert - Suricata 将生成警报并将其记录下来以供进一步分析。
标头
每个 Suricata 签名都有一个标头部分,用于描述网络协议、源和目标 IP 地址、端口和流量方向。 参考示例 sid:2100498
签名,规则的标题部分是突出显示的 ip any any -> any any
部分:
西德:2100498
alert ip any any -> any any (msg:"GPL ATTACK_RESPONSE id check returned root"; content:"uid=0|28|root|29|"; classtype:bad-unknown; sid:2100498; rev:7; metadata:created_at 2010_09_23, updated_at 2010_09_23;)
规则标题部分的一般格式是:
规则格式
<PROTOCOL> <SOURCE IP> <SOURCE PORT> -> <DESTINATION IP> <DESTINATION PORT>
Protocol 可以是以下之一:
- TCP
- UDP
- ICMP
- 知识产权
- 许多其他应用协议
Source 和 Destination 字段可以是 IP 地址或网络范围,或特殊值 any
,它将匹配所有 IP 地址和网络。 ->
箭头指示交通方向。
注意:签名也可以使用非定向标记 <>
来匹配两个方向的流量。 但是,关于方向标记 的 Suricata 文档指出,大多数规则将使用 ->
右匹配箭头。
如果您想对恶意出站流量(即离开您的网络的流量)发出警报,那么 Source 字段将是您系统的 IP 地址或网络范围。 Destination 可以是远程系统的 IP 或网络,或特殊的 any
值。
相反,如果您想为恶意传入流量生成警报,可以将 Source 字段设置为 any
,将 Destination 设置为系统的 IP 地址或网络范围。
您还可以使用 Port 字段指定要检查的 TCP 或 UDP 端口。 通常,来自系统的流量被分配一个随机端口,因此 any
值适用于 ->
指标的左侧。 如果您计划检查每个传入数据包的内容,目标端口也可以是 any
,或者您可以将签名限制为仅扫描单个端口上的数据包,例如 22 用于 SSH 流量,或 443 用于 HTTPS。
sid:2100498
中的 ip any any -> any any
标头是一个通用标头,将匹配 all 流量,无论协议、源或目标 IP 或端口如何。 当您要确保检查入站和出站流量是否有可疑内容时,这种“捕获所有”标头很有用。
请注意,Source、Destination 和 Port 字段也可以使用特殊的 !
否定运算符,它将处理 不 与字段值匹配的流量。
例如,以下签名将使 Suricata 对来自 any
网络且发往您的网络的所有传入 SSH 数据包发出警报(由 203.0.113.0/24
IP 块表示),即 不是 [ X206X] 发往端口 22:
示例标题
alert ssh any any -> 203.0.113.0/24 !22 (sid:1000000;)
此警报不会那么有用,因为它不包含任何有关数据包的消息或分类类型。 为了向警报添加额外信息,以及匹配更具体的标准,Suricata 规则有一个 Options 部分,您可以在其中为签名指定许多其他设置。
选项
Suricata 签名中括号 (. . .)
内的参数包含各种选项和关键字修饰符,可用于匹配数据包的特定部分、分类规则或记录自定义消息。 虽然规则的标头参数在 IP、端口和协议级别对数据包标头进行操作,但选项匹配包含在 数据包内 的数据。
Suricata 规则中的选项必须用 ;
分号分隔,并且通常使用 key:value 格式。 有些选项没有任何设置,只需要在规则中指定名称。
使用上一节中的示例签名,您可以添加值为 SSH traffic detected on non-SSH port
的 msg
选项,以解释警报的含义:
示例标题
alert ssh any any -> 203.0.113.0/24 !22 (msg:"SSH TRAFFIC on non-SSH port"; sid:1000000;)
关于如何使用 Suricata 规则中的每个选项的完整说明超出了本教程的范围。 从第 6.2 节 开始的 Suricata 规则文档详细描述了每个关键字选项。
但是,有一些核心选项,例如 content
关键字和各种 Meta 关键字,它们在大多数签名中都使用,我们将在以下部分中进行研究。
Content
关键字
任何规则最重要的选项之一是 content
关键字。 回想一下示例 sid:2100498
签名:
西德:2100498
alert ip any any -> any any (msg:"GPL ATTACK_RESPONSE id check returned root"; content:"uid=0|28|root|29|"; classtype:bad-unknown; sid:2100498; rev:7; metadata:created_at 2010_09_23, updated_at 2010_09_23;)
突出显示的 content:"uid=0|28|root|29|";
部分包含 content
关键字,以及 Suricata 将在数据包中查找的值。 在此示例签名的情况下,将检查来自任何端口上的任何 IP 地址的所有数据包,以确保它们不包含字符串值 uid=0|28|root|29|
(在上一个教程中用作指示受感染主机的示例)。
content
关键字可以与 Suricata 中的大多数其他关键字一起使用。 您可以使用标头组合和针对特定应用程序协议的选项来创建非常具体的签名,然后使用正则表达式检查数据包内容中的单个字节、字符串或匹配项。
例如,以下签名会检查 DNS 流量,寻找任何内容为 your_domain.com
的数据包并生成警报:
dns.query 示例
alert dns any any -> any any (msg:"DNS LOOKUP for your_domain.com"; dns.query; content:"your_domain.com"; sid:1000001;)
但是,如果 DNS 查询使用域 YOUR_DOMAIN.COM
,则此规则将不匹配,因为 Suricata 默认为区分大小写的内容匹配。 要使内容匹配不区分大小写,请将 nocase;
关键字添加到规则中:
不区分大小写的 dns.query 示例
alert dns any any -> any any (msg:"DNS LOOKUP for your_domain.com"; dns.query; content:"your_domain.com"; nocase; sid:1000001;)
现在任何小写或大写字母的组合仍将匹配 content
关键字。
msg
关键字
本教程中的示例签名都包含带有签名信息的 msg
关键字。 虽然 msg
选项不是必需的,但将其留空会让人难以理解为什么在检查 Suricata 的日志时会发生警报或删除操作。
msg
选项设计为警报的人类可读文本描述。 它应该是描述性的并向警报添加上下文,以便您或正在分析日志的其他人了解触发警报的原因。 在本教程的 [reference
Keyword](reference Keyword) 部分中,您将了解 reference
选项,您可以使用该选项链接到有关签名的更多信息和它旨在检测的问题。
sid
和 rev
关键字
每个 Suricata 签名都需要一个唯一的签名 ID (sid
)。 如果两个规则具有相同的 sid
(在以下示例输出中为 sid:10000000
),Suricata 将不会启动,而是会生成如下错误:
Example Duplicate sid Error. . . 19/11/2021 -- 01:17:40 - <Error> - [ERRCODE: SC_ERR_DUPLICATE_SIG(176)] - Duplicate signature "drop ssh any any -> 127.0.0.0/8 !22 (msg:"blocked invalid ssh"; sid:10000000;)" . . .
当您创建自己的签名时,范围 1000000-1999999 保留用于自定义规则。 Suricata 的内置规则范围为 2200000-2299999。 其他 sid
范围记录在 新兴威胁 SID 分配 页面上。
sid
选项通常是 Suricata 规则的最后一部分。 但是,如果存在随时间变化的多个签名版本,则有一个 rev
选项用于指定规则的版本。 例如,本教程前面的 SSH 警报可以更改为仅扫描端口 2022 上的 SSH 流量:
带有 rev 的 SSH 签名示例
alert ssh any any -> 203.0.113.0/24 2022 (msg:"SSH TRAFFIC on non-SSH port"; sid:1000000; rev:2;)
更新的签名现在包括 rev:2
选项,表明它已从以前的版本更新。
reference
关键字
reference
关键字在签名中用于描述在哪里可以找到有关规则旨在检测的攻击或问题的更多信息。 例如,如果签名旨在检测一种新的漏洞利用或攻击方法,则参考字段可用于链接到记录该问题的安全研究人员或公司网站。
OpenSSL 中的 Heartbleed 漏洞是一个被广泛宣传和研究的错误示例。 Suricata 带有旨在检查不正确 TLS 数据包的签名,并包含对主要 Heartbleed CVE 条目 的引用:
/etc/suricata/rules/tls-events.rules
alert tls any any -> any any (msg:"SURICATA TLS invalid heartbeat encountered, possible exploit attempt (heartbleed)"; flow:established; app-layer-event:tls.invalid_heartbeat_message; flowint:tls.anomaly.count,+,1; classtype:protocol-command-decode; reference:cve,2014-0160; sid:2230013; rev:1;)
注意签名中突出显示的 reference:cve,2014-0160;
部分。 此参考选项告诉您或正在检查 Suricata 警报的分析师在哪里可以找到有关特定问题的更多信息。
引用选项可以使用 /etc/suricata/reference.config
文件中的任何前缀。 例如,可以使用 url
代替前面示例中的 cve
,并使用直接指向 Heartbleed 站点的链接代替 2014-0160
CVE 标识符。
classtype
关键字
Suricata 可以根据您使用 Linux 发行版的包管理器安装 Suricata 包时包含的一组预配置类别对流量进行分类。 默认分类文件通常位于 /etc/suricata/classification.config
中,包含如下条目:
/etc/suricata/classification.config
# # config classification:shortname,short description,priority # config classification: not-suspicious,Not Suspicious Traffic,3 config classification: unknown,Unknown Traffic,3 config classification: bad-unknown,Potentially Bad Traffic, 2 . . .
如文件头所示,每个分类条目包含三个字段:
- 一个简短的、机器可读的名称,在上述示例中分别为
not-suspicious
、unknown
和bad-unknown
。 - 与警报一起使用的分类的描述,例如
Not Suspicious Traffic
。 - 优先级字段,确定 Suricata 处理签名的顺序。 最高优先级是值 1。 当 Suricata 处理数据包时,将首先检查使用具有更高优先级的分类器的签名。
在示例 sid:2100498
签名中,类类型为 classtype:bad-unknown;
,在以下示例中突出显示:
西德:2100498
alert ip any any -> any any (msg:"GPL ATTACK_RESPONSE id check returned root"; content:"uid=0|28|root|29|"; classtype:bad-unknown; sid:2100498; rev:7; metadata:created_at 2010_09_23, updated_at 2010_09_23;)
签名的隐含优先级是 2,因为这是分配给 /etc/suricata/classification.config
中的 bad-unknown
类类型的值。 如果您想覆盖类类型的默认优先级,可以在签名中添加 priority:n
选项,其中 n
是 1 到 255 之间的值。
target
关键字
Suricata 签名中另一个有用的选项是 target
选项。 它可以设置为以下两个值之一:src_ip
和 dest_ip
。 此选项的目的是正确识别 Suricata 警报日志中的 source
和 target
主机。
例如,可以使用 target:dest_ip;
选项增强本教程前面的 SSH 签名:
带有目标字段的 SSH 签名示例
alert ssh any any -> 203.0.113.0/24 2022 (msg:"SSH TRAFFIC on non-SSH port"; target:dest_ip; sid:1000000; rev:3;)
此示例使用 dest_ip
,因为该规则旨在检查进入我们示例网络的 SSH 流量,因此它是目标。 将 target
选项添加到规则将导致 eve.json
日志条目的 alert
部分中出现以下额外字段。
. . . "source": { "ip": "127.0.0.1", "port": 35272 }, "target": { "ip": "203.0.113.1", "port": 2022 } . . .
通过 Suricata 日志中的这些条目,可以将它们发送到安全信息和事件管理 (SIEM) 工具,以便更轻松地搜索可能来自公共主机的警报,或针对您的特定目标的攻击网络。
结论
在本教程中,您检查了构成完整 Suricata 签名的每个主要部分。 规则中的每个 Actions、Header 和 Options 部分都有多个选项,并支持使用许多不同的协议扫描数据包。 虽然本教程没有深入探讨任何部分,但规则的结构和示例中的重要字段应该足以开始编写您自己的规则。
如果您想探索包含比本教程中描述的更多选项的完整签名,请探索 /etc/suricata/rules
目录中的文件。 如果您想进一步了解规则中的某个字段,则 Suricata 规则文档 是有关每个选项及其可能值含义的权威资源。
一旦您能够轻松阅读和测试签名,您就可以继续学习本系列的下一个教程。 在其中,您将学习如何启用 Suricata 的 IPS 模式,该模式用于丢弃可疑流量,而不是仅生成警报的默认 IDS 模式。