10.2. 元关键词¶
元关键词不会影响Suricata对网络流量的检测;但它们会影响Suricata报告事件/警报的方式。
10.2.1. msg (消息)¶
msg关键词提供关于签名和可能警报的上下文信息。
msg的格式为:
msg: "描述内容";
示例:
msg:"ET恶意软件 Win32/RecordBreaker CnC登录";
msg:"ET漏洞利用 SMB-DS DCERPC PnP绑定尝试";
延续上一章节的示例,签名中的msg部分在下方被强调:
alert http $HOME_NET any -> $EXTERNAL_NET any (msg:"HTTP GET请求包含URI中的规则"; flow:established,to_server; http.method; content:"GET"; http.uri; content:"rule"; fast_pattern; classtype:bad-unknown; sid:123; rev:1;)
Tip
规则编写的标准做法是将签名msg的首部分大写,并标明签名的类别。
另一个标准做法是将``msg``作为签名中的第一个关键词。
Note
以下字符在msg中必须转义:
;
\
"
10.2.2. sid (签名ID)¶
sid关键词为每个签名分配唯一的ID。该ID用大于零的数字表示。sid的格式为:
sid:123;
签名中sid的示例:
alert http $HOME_NET any -> $EXTERNAL_NET any (msg:"HTTP GET请求包含URI中的规则"; flow:established,to_server; http.method; content:"GET"; http.uri; content:"rule"; fast_pattern; classtype:bad-unknown; sid:123; rev:1;)
Tip
规则编写的标准做法是将签名``sid``作为最后一个关键词(如果有``rev``则是倒数第二个)。
存在保留的sid范围,这些保留记录在https://sidallocation.org/。
Note
该值在同一:ref:规则组 <gid>`(``gid`)中的所有规则中必须唯一。
由于Suricata-update目前仅考虑规则的``sid``(参见`Bug#5447 <https://redmine.openinfosecfoundation.org/issues/5447>`_),建议选择完全唯一的``sid``。
10.2.3. rev (版本)¶
sid关键词通常伴随rev关键词。rev表示签名的版本。如果签名被修改,签名编写者会递增rev的数字。rev的格式为:
rev:123;
签名中rev的示例:
alert http $HOME_NET any -> $EXTERNAL_NET any (msg:"HTTP GET请求包含URI中的规则"; flow:established,to_server; http.method; content:"GET"; http.uri; content:"rule"; fast_pattern; classtype:bad-unknown; sid:123; rev:1;)
Tip
规则编写的标准做法是将rev关键词放在sid关键词之后。sid和rev关键词通常作为签名中的最后两个关键词。
10.2.4. gid (组ID)¶
gid关键词可用于为不同组的签名分配另一个ID值(类似于sid)。Suricata默认使用gid 1。可以修改默认值。在大多数情况下,无需更改默认的gid值。更改gid值没有技术影响,该值仅记录在警报数据中。
fast.log文件中警报条目的gid值示例。在[1:123]部分中,第一个1是gid(123是sid,1是rev)。
07/12/2022-21:59:26.713297 [**] [1:123:1] HTTP GET请求包含URI中的规则 [**] [分类: 潜在恶意流量] [优先级: 2] {TCP} 192.168.225.121:12407 -> 172.16.105.84:80
10.2.5. classtype¶
classtype关键词提供关于规则和警报分类的信息。它由短名称、长名称和优先级组成。例如,它可以说明规则是仅提供信息还是关于CVE。对于每个classtype,classification.config中有一个优先级,将在规则中使用。
示例classtype定义:
config classification: web-application-attack,Web应用攻击,1
config classification: not-suspicious,非可疑流量,3
在配置文件中定义了分类后,我们可以在规则中使用classtypes。具有classtype web-application-attack的规则将被分配优先级1,并且警报将在Suricata日志中包含'Web应用攻击':
classtype |
警报 |
优先级 |
---|---|---|
web-application-attack |
Web应用攻击 |
1 |
not-suspicious |
非可疑流量 |
3 |
我们的延续示例也有一个classtype:bad-unknown:
alert http $HOME_NET any -> $EXTERNAL_NET any (msg:"HTTP GET请求包含URI中的规则"; flow:established,to_server; http.method; content:"GET"; http.uri; content:"rule"; fast_pattern; classtype:bad-unknown; sid:123; rev:1;)
Tip
规则编写的标准做法是将classtype关键词放在sid和rev关键词之前(如示例规则所示)。
10.2.6. reference¶
reference关键词用于记录关于签名和签名试图解决的问题的信息来源。reference关键词可以在签名中出现多次。该关键词是为签名编写者和分析人员准备的,用于调查签名匹配的原因。其格式为:
reference:type,reference
一个典型的www.info.com的引用会是:
reference:url,www.info.com
有几种系统可以用作引用。一个常见的例子是CVE数据库,它为漏洞分配编号,以避免重复输入相同的URL。一个CVE的示例引用:
reference:cve,CVE-2014-1234
这将引用http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-1234。
所有引用类型都在reference.config配置文件中定义。
10.2.7. priority¶
priority关键词带有一个强制性的数值,范围可以从1到255。通常使用1到4的值。最高优先级是1。优先级较高的签名将首先被检查。通常签名通过classtype定义确定优先级。classtype定义可以通过在签名中定义priority关键词来覆盖。priority的格式为:
priority:1;
10.2.8. metadata¶
metadata关键词允许向签名添加额外的、非功能性的信息。虽然格式是自由形式的,但建议坚持使用`[key, value]`对,因为Suricata可以将这些包含在eve警报中。格式为:
metadata: key value;
metadata: key value, key value;
10.2.9. target¶
target关键词允许规则编写者指定警报的哪一侧是攻击的目标。如果指定,警报事件将增强包含关于源和目标的信息。
格式为:
target:[src_ip|dest_ip]
如果值是src_ip,则生成的事件中的源IP(JSON中的src_ip字段)是攻击的目标。如果target设置为dest_ip,则目标是生成事件中的目标IP。
10.2.10. requires¶
``requires``关键词允许规则要求启用特定的Suricata功能、特定的关键词可用,或Suricata版本匹配表达式。不满足要求的规则将被忽略,Suricata不会将它们视为错误。
遵循``<keyword> <expression>``有效格式但Suricata未知的要求允许用于未来兼容性,然而未知的要求表达式将导致要求不满足,跳过规则。
在解析规则时,解析器尝试在处理其他关键词之前处理``requires``关键词。这允许它出现在可能仅在特定版本的Suricata中存在的关键词之后,如``requires``语句所指定的那样。然而,前面的关键词仍然必须遵守Suricata规则的基本已知格式。
格式为:
requires: feature geoip, version >= 7.0.0, keyword foobar
要要求多个功能,必须多次指定feature子关键词:
requires: feature geoip, feature lua
或者,*and*表达式可以这样表示:
requires: version >= 7.0.4 < 8
而*or*表达式可以用``|``表示,如:
requires: version >= 7.0.4 < 8 | >= 8.0.3
表示规则需要版本7.0.4或更高,但小于8,**或**大于或等于8.0.3。如果一个关键词直到7.0.4和8.0.3补丁版本才添加,这可能很有用,因为它不会存在于8.0.1中。
这可以扩展到多个发布分支:
requires: version >= 7.0.10 < 8 | >= 8.0.5 < 9 | >= 9.0.3
如果没有提供*minor*或*patch*版本组件,它将默认为0。
``version``只能指定一次,如果指定多次,规则将记录错误并不加载。
``requires``关键词在Suricata 7.0.3和8.0.0中引入。