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
Action
Action
指 IDS
在规则或签名情形发生时,对数据包要采取的措施,常见措施有:
Pass
:如果当前数据包匹配了规则,suricata
会通过该数据请求,并且忽略之后所有规则对该数据包的匹配Drop
:发生在IPS/inline
模式下,如果匹配到,会立刻终止数据包的发送,也不会给发送方任何回应,发送方只能timeout
。suricata
会为该数据包生成一条alert
日志Reject
:匹配到的话,发送方和接收方都会收到拒绝数据包,拒绝数据包主要有两种。如果当前检测到的恶意包是tcp
数据包,则发送的tcp reset
包;其他协议,发送icmp error
包。suricata
生成一条alert
日志。如果是IPS/Inline
模式,同上面Drop
的处理,不会再发送拒绝数据包了。Alert
:如果匹配上,该数据包并不会被认为是个威胁包,但会生成一条警告日志
加载规则是按照规则文件中的先后顺序,但在解析匹配数据包时,规则的匹配顺序并不按照文件顺序,这当然是效率考虑。默认的规则解析顺序是:pass
,drop
,reject
,alert
Header
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_NET
为
suricata.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 keywords
,IP
keywords
,TCP keywords
,UDP
keywords
,Payload keywords
,HTTP
keywords
,Modbus keywords
这些常见规则项,未记录的规则项关键字参考文档。