元关键词 ============= .. role:: example-rule-emphasis 元关键词不会影响Suricata对网络流量的检测;但它们会影响Suricata报告事件/警报的方式。 msg (消息) ------------- msg关键词提供关于签名和可能警报的上下文信息。 msg的格式为:: msg: "描述内容"; 示例:: msg:"ET恶意软件 Win32/RecordBreaker CnC登录"; msg:"ET漏洞利用 SMB-DS DCERPC PnP绑定尝试"; 延续上一章节的示例,签名中的msg部分在下方被强调: .. container:: example-rule alert http $HOME_NET any -> $EXTERNAL_NET any (:example-rule-emphasis:`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中必须转义: ``;`` ``\`` ``"`` sid (签名ID) ------------------ sid关键词为每个签名分配唯一的ID。该ID用大于零的数字表示。sid的格式为:: sid:123; 签名中sid的示例: .. container:: example-rule 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; :example-rule-emphasis:`sid:123;` rev:1;) .. tip:: 规则编写的标准做法是将签名``sid``作为最后一个关键词(如果有``rev``则是倒数第二个)。 存在保留的sid范围,这些保留记录在https://sidallocation.org/。 .. Note:: 该值在同一:ref:`规则组 `(``gid``)中的所有规则中必须唯一。 由于Suricata-update目前仅考虑规则的``sid``(参见`Bug#5447 `_),建议选择完全唯一的``sid``。 rev (版本) -------------- sid关键词通常伴随rev关键词。rev表示签名的版本。如果签名被修改,签名编写者会递增rev的数字。rev的格式为:: rev:123; 签名中rev的示例: .. container:: example-rule 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; :example-rule-emphasis:`rev:1;`) .. tip:: 规则编写的标准做法是将rev关键词放在sid关键词之后。sid和rev关键词通常作为签名中的最后两个关键词。 .. _gid: gid (组ID) -------------- gid关键词可用于为不同组的签名分配另一个ID值(类似于sid)。Suricata默认使用gid 1。可以修改默认值。在大多数情况下,无需更改默认的gid值。更改gid值没有技术影响,该值仅记录在警报数据中。 fast.log文件中警报条目的gid值示例。在[1:123]部分中,第一个1是gid(123是sid,1是rev)。 .. container:: example-rule 07/12/2022-21:59:26.713297 [**] [:example-rule-emphasis:`1`:123:1] HTTP GET请求包含URI中的规则 [**] [分类: 潜在恶意流量] [优先级: 2] {TCP} 192.168.225.121:12407 -> 172.16.105.84:80 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: .. container:: example-rule 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; :example-rule-emphasis:`classtype:bad-unknown;` sid:123; rev:1;) .. tip:: 规则编写的标准做法是将classtype关键词放在sid和rev关键词之前(如示例规则所示)。 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配置文件中定义。 priority -------- priority关键词带有一个强制性的数值,范围可以从1到255。通常使用1到4的值。最高优先级是1。优先级较高的签名将首先被检查。通常签名通过classtype定义确定优先级。classtype定义可以通过在签名中定义priority关键词来覆盖。priority的格式为:: priority:1; metadata -------- metadata关键词允许向签名添加额外的、非功能性的信息。虽然格式是自由形式的,但建议坚持使用`[key, value]`对,因为Suricata可以将这些包含在eve警报中。格式为:: metadata: key value; metadata: key value, key value; target ------ target关键词允许规则编写者指定警报的哪一侧是攻击的目标。如果指定,警报事件将增强包含关于源和目标的信息。 格式为:: target:[src_ip|dest_ip] 如果值是src_ip,则生成的事件中的源IP(JSON中的src_ip字段)是攻击的目标。如果target设置为dest_ip,则目标是生成事件中的目标IP。 .. _keyword_requires: requires -------- ``requires``关键词允许规则要求启用特定的Suricata功能、特定的关键词可用,或Suricata版本匹配表达式。不满足要求的规则将被忽略,Suricata不会将它们视为错误。 遵循`` ``有效格式但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中引入。