Suricata规则3

1,132 阅读3分钟

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:

  1. alert 生成警告
  2. 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 的设置
[EXTERNALNET,!EXTERNAL_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类似不过多解释。

  1. 源端口和目标端口 看箭头的位置,->左侧源地址,右侧目标地址
  2. 端口的操作符 | 操作符 |说明 | | --- | --- | |: |端口范围 | |!|否定| |[...,...]|组|
    下面是对上面操作符的例子: |例子|说明| |---|---| |[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

这个小节,主要涉及到就是上面例子的箭头,->。
有两种箭头形式,-> <>。

注意:没有<-这个箭头

image.png
说明上图:有客户端和服务端进行通信,发送请求和响应数据包。
从上图我们来理解->,和<>箭头的区别。
alert tcp 1.2.3.4 1024 -> 5.6.7.8 80
上面这个规则只会第一个数据包,第二个数据包不会匹配,因为上面的数据包从1.2.3.4IP地址的1024端口到5.6.7.8的80端口流量数据包。如何<>是这个箭头,两个数据包都会匹配。 这里关于action和header已经说明完,下面我将章节将要讲解,规则选项的配置。