Suricata规则
接下来就涉及到Suricata规则的整理。
Suricata规则格式
所有的规则包括下面三个部分
- action 规则匹配时,应该发什么行为
- header 定义规则的协议、IP 地址、端口和方向。
- rule options 定义规则的细节 举例:
drop
tcp
$HOME_NET any -> $EXTERNAL_NET any
(msg:”ET TROJAN Likely Bot Nick in IRC (USA +..)”; flow:established,to_server; flowbits:isset,is_proto_irc; content:”NICK “; pcre:”/NICK .*USA.*[0-9]{3,}/i”; reference:url,doc.emergingthreats.net/2008124; classtype:trojan-activity; sid:2008124; rev:2;)
在这个例子中,drop是一个action,$HOME_NET any -> $EXTERNAL_NET any是header,其余部分是 rule options;
在本节中我们将使用上面的例子来讲解规则格式。
action
可利用的action:
- alert 生成警告
- pass 停止进一步检查数据包 3.drop 丢弃数据包并生成警告 4.reject 向匹配数据包的发送方发送 RST/ICMP 未到达错误。 5.rejectsrc 和reject相同 6.rejectdst 发送 RST/ICMP 错误包给匹配包的接收者。 7.rejectboth 结束 RST/ICMP 错误数据包到对话双方。
tip: 在ops模式下,使用任何有关reject action 同时会启动drop action
协议-header
首先这些协议是否可用,需要在suricata.yaml设置,且在规则中只会匹配所设置的协议的流量,如http,只会配置http流量。
协议在header中,规则中的这个关键字告诉 Suricata 它涉及哪个协议。您可以在四种基本协议之间进行选择:
- tcp
- udp
- icmp
- ip (ip代表所有或者任何) 应用层的协议:
- http
- ftp
- tls (this includes ssl)
- smb
- dns
- dcerpc
- ssh
- smtp
- imap
- modbus (disabled by default)
- dnp3 (disabled by default)
- enip (disabled by default)
- nfs
- ike
- krb5
- ntp
- dhcp
- rfb
- rdp
- snmp
- tftp
- sip
- http2
源地址和目标地址-header
$HOME_NET any -> $EXTERNAL_NET
$HOME_NET 源地址。
$EXTERNAL_NET 目标地址。
any是指端口
上面的$HOME_NET是一个在suricata.yaml的变量,需要在配置文件中设置后才能使用,且需要注意一点就是源地址和目标地址需要注意中间的箭头
使用源和目的地,您可以分别指定流量的来源和目的地。您可以分配 IP 地址(支持 IPv4 和 IPv6)和 IP 范围。IP地址的表示可以与运算符结合使用,去表达更多的含义。
| 操作符 | 说明 |
|---|---|
| ../.. | IP 范围(CIDR 表示法) |
| ! | 否定 |
| [...,...] | 组 |
下面是对上面操作符的应用:
| 例子 | 说明 |
|---|---|
| ! 1.1.1.1 | 任何 IP 地址 但是不是 1.1.1.1 |
| ![1.1.1.1, 1.1.1.2] | 任何 IP 地址 但是不上 1.1.1.1 和 1.1.1.2 |
| $HOME_NET | 您在 yaml 中对 HOME_NET 的设置 |
| [HOME_NET] | EXTERNAL_NET 而不是 HOME_NET |
| [10.0.0.0/24, !10.0.0.5] | 10.0.0.0/24 除了 10.0.0.5 |
| […, [….]] | |
| […, ![…..]] |
警告:如果您将配置设置为如下所示:
HOME_NET: any
EXTERNAL_NET: ! $HOME_NET
您不能使用 $EXTERNAL_NET 编写签名,因为它代表“not any”。这是无效的设置。
端口-headerEXTERNAL_NET
这个端口的许多操作跟ip类似不过多解释。
- 源端口和目标端口 看箭头的位置,->左侧源地址,右侧目标地址
- 端口的操作符
| 操作符 |说明 |
| --- | --- |
|: |端口范围 |
|!|否定|
|[...,...]|组|
下面是对上面操作符的例子: |例子|说明| |---|---| |[80, 81, 82]|端口80 81 82| |[80: 82]|端口范围80到82| |[1024: ]|从1024端口到最高的端口(65232)| |!80|不上80端口| |[80:100,!99]|80端口到100端口,除了99端口| |[1:80,![2,4]]|1到80端口,除了2和4| |[.., [..,..]]||
方向-header
这个小节,主要涉及到就是上面例子的箭头,->。
有两种箭头形式,-> <>。
注意:没有<-这个箭头
说明上图:有客户端和服务端进行通信,发送请求和响应数据包。
从上图我们来理解->,和<>箭头的区别。
alert tcp 1.2.3.4 1024 -> 5.6.7.8 80
上面这个规则只会第一个数据包,第二个数据包不会匹配,因为上面的数据包从1.2.3.4IP地址的1024端口到5.6.7.8的80端口流量数据包。如何<>是这个箭头,两个数据包都会匹配。
这里关于action和header已经说明完,下面我将章节将要讲解,规则选项的配置。