了解 Suricata 签名

介绍

本系列的第一个教程解释了如何安装和配置Suricata。如果您遵循该教程,您还了解了如何下载和更新Suricata规则集,以及如何检查有关可疑活动的通知日志。

在本教程中,您将了解Suricata签名是如何结构化的,以及大多数规则中常用的一些重要选项.一旦您熟悉了签名中的结构和字段,您将能够编写自己的签名,您可以与防火墙相结合,以提醒您最可疑的服务器流量,而无需使用其他外部规则集。

这种编写和管理规则的方法意味着您可以更有效地使用Suricata,因为它只需要处理您编写的特定规则。一旦您有一个规则集,描述了您期望在网络中遇到的大多数合法和可疑的流量,您可以开始选择性地使用Suricata在其活跃的入侵预防(IPS)模式中放弃无效的流量。

前提条件

对于本教程的目的,你可以在任何系统上运行Suricata,因为签名通常不需要任何特定的操作系统。

了解Suricata签名结构

Suricata 签名可能一开始看起来很复杂,但一旦您了解它们的结构,以及 Suricata 如何处理它们,您将能够创建自己的规则,以满足您的网络需求。

在高层次上,Suricata签名由三个部分组成:

  1. 在流量匹配规则时采取的 ** 行动**
  2. 描述主机、IP 地址、端口、协议以及流量方向的 ** Header**
  3. ** 选项**,指定诸如签名 ID(sid)、日志信息、匹配包的内容的常规表达式、分类类类型和其他可帮助狭隘识别合法和可疑流量的修改器。

一个签名的总体结构如下:

1[label Generic Rule Structure]
2ACTION HEADER OPTIONS

标题和选项部分的签名有多个部分. 例如,在上一个教程中,你测试了Suricata使用规则的‘sid’ 2100498. 这里是完整的参照规则:

1[label sid:2100498]
2alert 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;)

签名的警告部分是 action,ip any -> any any部分是 header,而开始于(msg:GPL ATTACK_RESPONSE...的其他签名包含规则的 选项

在以下部分中,您将详细研究Suricata规则的每个部分。

行动

页:2100498签名的第一个部分是行动,在这种情况下是警告。Suricata签名的行动部分指定了当一个包匹配规则时要采取的行动。

  • Pass - Suricata 将停止扫描包,并允许它,而不会生成警报
  • Drop - 在 IPS 模式下工作时,Suricata 将立即停止处理包并生成警报.如果生成包的连接使用 TCP,它将耗时
  • Reject - 当 Suricata 运行 IPS 模式时,将发送 TCP 重置包,而 Suricata 将放弃匹配包
  • Alert - Suricata 将生成警报日志并进行进一步分析

头部

每个 Suricata 签名都有一个标题部分,它描述了网络协议、源和目的地 IP 地址、端口和流量方向。 参考示例 sid:2100498 签名,规则的标题部分是突出的 ip any -> any any 部分:

1[label sid:2100498]
2alert 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;)

规则标题部分的一般格式是:

1[label Rule Format]
2<PROTOCOL> <SOURCE IP> <SOURCE PORT> -> <DESTINATION IP> <DESTINATION PORT>

协议可以是以下之一:

  • TCP
  • UDP
  • ICMP
  • IP
  • 一些其他应用程序协议

目的地字段可以是IP地址或网络范围,或者是特殊值任何,这将匹配所有IP地址和网络。

<$>[注] :签名也可以使用非方向标记 <>,这将匹配两种方向的流量。然而,关于方向标记的Suricata文档(https://suricata.readthedocs.io/en/suricata-6.0.4/rules/intro.html#direction)指出,大多数规则将使用->`右对应箭头。

如果你想警告恶意的输出流量(即流量离开你的网络),那么 字段将是你的系统的IP地址或网络范围。

相反,如果您想生成恶意传入流量警报,则可将 字段设置为任何,并将 目的地设置为您的系统的 IP 地址或网络范围。

您还可以指定 TCP 或 UDP 端口以使用 Port 字段进行检查。通常,来自系统的流量被分配为随机端口,因此任何值适用于->指标的左侧。

ip any -> anysid:2100498的标题是一个通用标题,将匹配 all流量,无论协议,源或目的地IP或端口。

请注意,源、目的地和端口字段也可以使用特殊的 ! 否定操作器,该操作器将处理没有 ** 匹配该字段值的流量。

例如,下面的签名会使Suricata警告来自任何网络的所有入口SSH包,这些包是为您的网络(由203.0.113.0/24IP块表示)的,而这些包不是为端口22的:

1[label Example Header]
2alert ssh any any -> 203.0.113.0/24 !22 (sid:1000000;)

此警报不会那么有用,因为它不包含关于包的任何消息,或分类类类型. 为了向警报添加额外的信息,以及更具体的标准匹配,Suricata 规则有一个 ** 选项** 部分,您可以为签名指定一些额外的设置。

选择

Suricata 签名中的(... )列表中的参数包含各种选项和关键字修改器,您可以使用这些参数来匹配包的特定部分,分类规则或记录自定义消息。

Suricata 规则中的选项必须由一个 ; 半栏分开,通常使用一个 key:value 格式。

使用上一节的示例签名,您可以添加msg选项,其中含有在非SSH端口上检测到的SSH流量的值,解释了警报的内容:

1[label Example Header]
2alert ssh any any -> 203.0.113.0/24 !22 (msg:"SSH TRAFFIC on non-SSH port"; sid:1000000;)

如何在Suricata规则中使用每个选项的完整解释超出了本教程的范围。 Suricata规则文档从第 6.2 节开始详细描述了每个关键字选项。

然而,有一些核心选项,如内容关键字和各种 Meta关键字,这些关键字在大多数签名中使用,我们将在以下部分中探讨。

关键词内容

任何规则最重要的选项之一是内容的关键字,请记住页:2100498的签名:

1[label sid:2100498]
2alert 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;)

突出显示的内容:uid=0Ɛ28Ɛroototelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotelotel

您可以使用标题组合和针对特定应用程序协议的选项创建非常具体的签名,然后检查单个字节、字符串或匹配使用常规表达式的包内容。

例如,下面的签名会检查 DNS 流量,查找包含内容的任何包 your_domain.com,并生成警告:

1[label dns.query Example]
2alert 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 默认情况为案例敏感内容匹配。

1[label Case-insensitive dns.query Example]
2alert dns any any -> any any (msg:"DNS LOOKUP for your_domain.com"; dns.query; content:"your_domain.com"; nocase; sid:1000001;)

现在,任何较低或较高字母的组合仍然会匹配内容关键字。

msg的关键字

本教程中的示例签名都包含有关签名的信息的msg关键字.虽然不需要msg选项,但将其留在空格中使得很难理解为什么在检查Suricata的日志时发生了警报或放弃操作。

一个msg选项被设计为一个可人读的警报的文本描述。它应该是描述性的,并为警报添加背景,以便您或正在分析日志的其他人了解警报的原因。在本教程的 [‘reference’ Keyword](‘reference’ Keyword](#the-reference-keyword))部分中,您将了解有关reference选项,您可以使用它来链接到有关签名和它旨在检测问题的更多信息。

关键词revsid

每个 Suricata 签名都需要一个独特的 Signature ID(‘sid’)。如果两个规则具有相同的‘sid’(在下面的示例输出中,它是‘sid:10000000’),Suricata 不会启动,而是会生成如下类似的错误:

1[secondary_label Example Duplicate sid Error]
2. . .
319/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;)"
4. . .

当您创建自己的签名时,范围 1000000-1999999仅用于自定义规则。Suricata的内置规则在 2200000-2299999的范围内。

sid 选项通常是 Suricata 规则的最后一部分,但是,如果签名的多种版本随着时间的推移而发生变化,则有一个 rev 选项用于指定规则的版本,例如,本教程中早些时候的 SSH 警报可以更改为只扫描 2022 端口上的 SSH 流量:

1[label Example SSH Signature with rev]
2alert ssh any any -> 203.0.113.0/24 2022 (msg:"SSH TRAFFIC on non-SSH port"; sid:1000000; rev:2;)

更新的签名现在包含rev:2选项,表示它已从以前的版本中更新。

关键词参考

参考关键字在签名中被用来描述如何找到有关规则旨在检测的攻击或问题的更多信息,例如,如果签名旨在检测一种新型攻击或攻击方法,则参考字段可以用来链接到一个安全研究人员或公司的网站,该网站记录了问题。

OpenSSL中的Heartbleed漏洞是一个被广泛宣传和研究的漏洞的例子,Suricata配备了旨在检查错误的TLS包的签名,并包含参考主要的Heartbleed CVE条目(http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-0160):

1[label /etc/suricata/rules/tls-events.rules]
2alert 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 标识符。

类型的关键词

Suricata 可以根据预先配置的一组类别来分类流量,这些类别在安装 Suricata 包时包含在您的 Linux 发行版的包管理器中。

1[label /etc/suricata/classification.config]
2#
3# config classification:shortname,short description,priority
4#
5
6config classification: not-suspicious,Not Suspicious Traffic,3
7config classification: unknown,Unknown Traffic,3
8config classification: bad-unknown,Potentially Bad Traffic, 2
9. . .

如文件标题所示,每个分类条目有三个字段:

  • 一个简短的机器可读的名称,在上面的示例中分别是不可疑未知不为人知
  • 用于警报的分类的描述,例如不可疑流量
  • 一个优先级字段,决定了Suricata将对签名进行处理的顺序。

sid:2100498签名示例中,类型为classtype:bad-unknown;,如下示例所示:

1[label sid:2100498]
2alert 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 中分配给‘坏未知’类型的值。

目标关键字

在Suricata签名中,另一个有用的选项是目标选项,可以设置为两个值之一:src_ipdest_ip

例如,本教程中早些时候的 SSH 签名可以通过 target:dest_ip; 选项来增强:

1[label Example SSH Signature with target field]
2alert 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流量,因此它是目的地。

 1. . .
 2  "source": {
 3    "ip": "127.0.0.1",
 4    "port": 35272
 5  },
 6  "target": {
 7    "ip": "203.0.113.1",
 8    "port": 2022
 9  }
10. . .

使用Suricata的日志中的这些条目,可以将其发送到安全信息和事件管理(SIEM)工具中,以便更容易搜索可能来自常见主机的警报,或攻击针对网络上的特定目标。

结论

在本教程中,你检查了每个主要部分,使一个完整的Suricata签名. 在一个规则中的每一个 Action, HeaderOptions部分都有多个选项,并支持使用许多不同的协议的扫描包。

如果您想探索包含比本教程中所描述的更多选项的完整签名,请探索 /etc/suricata/rules 目录中的文件. 如果规则中有一个字段,您想了解更多,则 Suricata Rules Documentation 是有关每个选项及其可能值的权威资源。

一旦您舒适地阅读和测试签名,您可以进入本系列的下一个教程,其中您将学习如何启用Suricata的IPS模式,该模式用于降低可疑的流量,而不是默认的IDS模式,它只会生成警报。

Published At
Categories with 技术
comments powered by Disqus