The quiter you become,the more you are able to hear!

suricata 规则结构解析

Author: geneblue

Blog: https://geneblue.github.io/

所谓规则 rule 或者签名 signature 就是 suricata 引擎在处理网络数据时,以此判断网络请求是否是恶意的,并分别对请求采取什么措施。

一条简单的规则如下:

1
alert ip any any -> any any (msg: "HELLO"; content: "HELLO"; )

可以大概看出,该规则是在判断网络数据中如果有 "HELLO" 消息就会产生报警。

suricate rules 处详细记录了 suricata 规则组成和各种网络协议关键参数。

大体上 suricata 单条规则由三部分组成: - 操作 Action - 头部 Header - 规则项 Rule Options

以上面规则为例:

rule-demo

Action

ActionIDS 在规则或签名情形发生时,对数据包要采取的措施,常见措施有:

  • Pass:如果当前数据包匹配了规则,suricata 会通过该数据请求,并且忽略之后所有规则对该数据包的匹配
  • Drop:发生在 IPS/inline 模式下,如果匹配到,会立刻终止数据包的发送,也不会给发送方任何回应,发送方只能 timeoutsuricata 会为该数据包生成一条 alert 日志
  • Reject:匹配到的话,发送方和接收方都会收到拒绝数据包,拒绝数据包主要有两种。如果当前检测到的恶意包是 tcp 数据包,则发送的 tcp reset 包;其他协议,发送 icmp error 包。suricata 生成一条 alert 日志。如果是 IPS/Inline 模式,同上面 Drop 的处理,不会再发送拒绝数据包了。
  • Alert:如果匹配上,该数据包并不会被认为是个威胁包,但会生成一条警告日志

加载规则是按照规则文件中的先后顺序,但在解析匹配数据包时,规则的匹配顺序并不按照文件顺序,这当然是效率考虑。默认的规则解析顺序是:passdroprejectalert

Header 定义协议,ip 地址,端口以及数据流向。

protocol

drop tcp
$HOME_NET any -> $EXTERNAL_NET any (msg:”ET TROJAN Likely Bot Nick in IRC (USA +..)”)

protocol 告知 IDS 该条规则用于解析哪种协议,常用的协议的有 tcp,udp,icmp,ip(ip 表示 all 或者 any)或者其他应用层协议,比如 http,ftp,tls(包含ssl),smb,dns,ssh,smtp,imap,modbus(默认关闭),dnp3(默认关闭)等。suricata 是否启用这些协议的解析,要看 suricata.yaml 中是否启动对协议的支持。  这里是不支持数据链路层协议,比如 arp,只支持网络层,传输层和应用层协议

源和目的地址

drop tcp $HOME_NET
any -> $EXTERNAL_NET
any (msg:”ET TROJAN Likely Bot Nick in IRC (USA +..)”)

如上,单向数据流,$HOME_NETsuricata.yaml 中定义的源地址,$EXTERNAL_NET 是目的地址,这种在配置文件中变量名使用的比较多,也可以使用具体的 ip 地址来表示,有如下标识符:

  • ../.. : 表示 ip 范围(支持 CIDR)
  • !: 非
  • [.., ..]: 集合

示例: - !1.1.1.1 : 除了 1.1.1.1 外的所有 ip - ![1.1.1.1, 2.2.2.2]:除了 1.1.1.1, 2.2.2.2 外的所有 ip - $HOME_NET: yaml 中定义,表示一般表示本地子网 - [10.0.0.0/24, !10.0.0.5]10.0.0.0/24 网段,但除了 10.0.0.5

源和目的端口

drop tcp $HOME_NET any
-> $EXTERNAL_NET any
(msg:”ET TROJAN Likely Bot Nick in IRC (USA +..)”)

示例规则表示的是源,目的任意端口,与上面类似,也可以采用标识符来精确表达:

  • :端口范围
  • :非
  • [..., ...]: 集合

示例: - [80,81,82]: 80,81,82端口 - [80:84]: 80 到 84 端口 - [1024:]: 1024 到最大端口号 - !80: 除 80 端口外的所有其他端口 - [80:100,!99]: 80 到 100 端口,但除了 99 - [1:80,![2,4]]: 1 到 80 端口,但除了 2 到 4 端口

dierction 数据流向

drop tcp $HOME_NET any ->
$EXTERNAL_NET any (msg:”ET TROJAN Likely Bot Nick in IRC (USA +..)”)

告知待检测数据包走向,-> 单项流量,从源到目的地址;<> 双向流量,没有 <-

依靠 header 段的这些关键字段,就可以比较灵活的表示任何网络范围

Rule Options

rule options 规则项定义要对网络数据做怎样筛查,规则项的书写对我们要检查某种恶意数据包至关重要,写的好不好直接影响检出率和检查效率。

规则项使用括号 () 包裹,其中的细则使用分号 ; 分隔。细则里有的会使用关键字比如 msg,然后冒号 : 后描述具体信息,有的细则可能直接就是个关键字,比如 nocase

规则项的顺序如果随意改动的话,可能会变更该条规则最初表达的意思。

之后简单介绍 Meta keywordsIP keywordsTCP keywordsUDP keywordsPayload keywordsHTTP keywords,Modbus keywords 这些常见规则项,未记录的规则项关键字参考文档。

参考