Suricata规则编写

规则格式

Suricata规则包括以下三部分:

  1. action,action决定当signature匹配的时候会发生什么
  2. header, 定义了协议,IP地址,端口和规则的位置
  3. 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;)

 

 

 

 

红色对应action,绿色对应header,蓝色对应rule options

Action

  • Pass

如果匹配到规则,Suricata停止扫描数据包并且跳过当前规则(当前数据包内的规则)

  • Drop

Drop只能在IPS/inline模式下可用,如果程序匹配到了规则,并且action为drop的话,它会立即停止。这个数据包不会再被发送。

缺点:接收器没有接收到正在发生事情的信息,导致超时(TCP),Suricata对这个数据包生成一个警报。

  • Reject

这是对数据包的主动拒绝。接收者和发送者收到一个拒绝数据包,有两种类型的拒绝数据包将自动选择。当违规数据包与TCP有关时,会发送Reset-Packet包。对其他所有协议,会发送ICMP-error包。Suricata同时会生成一个警告。在Inline/IPS模式下,违规数据包也会被drop掉,与Drop action相似。

  • Alert

当包含alert的被匹配到时,数据包会与其他没有问题(或者说无威胁的)数据包一样对待(放行),只不过Suricata 会对这个数据包生成一个告警,只有系统管理员才会看到这个告警。

规则的默认顺序为pass, drop, reject, alert.

Header

Protocol

用来告诉Suricata当前规则中包含的协议,何以选择的协议主要有:

  • tcp (for tcp-traffic)
  • udp
  • icmp
  • ip (ip stands for ‘all’ or ‘any’)

还有一些其他的应用层协议或七层协议也可以选择:

  • http
  • ftp
  • tls (this includes ssl)
  • smb
  • dns
  • dcerpc
  • ssh
  • smtp
  • imap
  • msn
  • modbus (disabled by default)
  • dnp3 (disabled by default)
  • enip (disabled by default)
  • nfs (depends on rust availability)
  • ikev2 (depends on rust availability)
  • krb5 (depends on rust availability)
  • ntp (depends on rust availability)
  • dhcp (depends on rust availability)

这些协议能不能用取决于配置文件suricata.yaml中是否配置了这些协议。

如果你有一个signature列如http协议,suricata确保只有当它是http流量时才会匹配

Source and destination

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;)

 

 

 

 

$HOME_NET是源,$EXTERNAL_NET是目的地址(注意箭头方向)

通过source和destination,你可以分别明确流量的源和目的地址。你可以分配IP地址(IPV4和IPV6都可以)和IP范围。这些可以与操作符结合使用

Operator Description
../.. IP 范围(CIDR 表示法)
例外和否定
[.., ..] 分组

 

 

 

 

 

通常还可以使用变量,如$HOME_NET、$EXTERNAL_NET。

举例:

Example Meaning
!1.1.1.1 除了1.1.1.1的每个IP地址
![1.1.1.1, 1.1.1.2] 除了1.1.1.1和1.1.1.2的每个IP地址
$HOME_NET 在yaml中设置的HOME_NET地址
[$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不合法。

Ports(source and destination)

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;)

 

 

 

 

流量通过端口进出,不同端口有不同的端口号,例如80是http的默认端口而https是443。但是注意,端口并不决定通信中使用哪个协议。相反,它决定哪个应用正在接受数据。

以上提到的端口通常都是目标端口。源端口,即发送数据包的应用通常由操作系统分配一个随机端口。当为自己的HTTP写规则时,应当通常写any->80,因为这意味从任何源端口到你的http程序的(80端口上的)数据包都是可以match到的

在设置端口时也可以使用特殊运算符,例如:

Operator Description
: 端口范围
除了哪个端口
[.., ..] 组合

 

 

 

 

 

例如:

Example Meaning
[80, 81, 82] 端口80,81,82
[80: 82] 从80到82端口
[1024: ] 从1024一直到最高端口号
!80 除了80端口
[80:100,!99] 80到100端口中除了99端口
[1:80,![2,4]] 1到80端口中除了2和4端口
[.., [..,..]]  

 

 

 

 

 

 

 

 

 

Direction

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;)

 

 

 

 

流向(direction)告诉规则用哪种方式匹配流量数据

大部分规则是->,即只匹配从source到destination的,也可以双向(<>)

注意:没有反转方向(<-)

例子为一个客户端使用IP地址1.2.3.4端口号1024,服务端使用IP地址5.6.7.8端口号80,客户端向服务端发送信息,并且服务端应答

Suricata规则编写_第1张图片

规则:

alert tcp 1.2.3.4 1024 -> 5.6.7.8 80

 

 

这样只有第一个数据包可以被匹配到,对于反向的流量会直接放行

Rule options

规则其余部分由选项组成,由括号括起分号隔开。一些选项可以设置(如msg)由选项的关键字规定,后面加“:”,一些不可以设置,只有关键字(如nocase)

:;

;

 

 

 

规则选项由特定的顺序,变换顺序就会改变规则的含义

注意:在Suricata 规则中" ; "和" " "有特殊含义,在规则选项值中使用时必须转义,如

msg:“Msg with semicolon\;”;

 

 

因此,还必须转义反斜杠,因为它用作转义字符。

Modifier Keywords

一些关键字函数可以用做修饰符,有两种修饰符

  • 旧风格的“content modifier”在rule中进行回顾,例如:
alert http any any -> any any (content:"index.php"; http_uri; sid:1;)

 

 

在例子中‘index.php’被修改为检查http uri缓冲区

  • 最新的类型成为‘sticky buffer’,他将缓冲区字段放在第一位,他后面的所有关键字都应用于这个缓冲区,例如:
alert http any any -> any any (http_response_line; content:"403 Forbidden"; sid:1;)

 

 

 

在这个例子中‘403 Forbidden’对http响应行检查,因为他在关键字http_response_line的后面

Normalized Buffers

一个数据包由原始数据组成,http和reassembly可以复制这类数据包的数据,它们清楚异常内容,组和数据包等。剩下的就是“normalized buffers”:

Suricata规则编写_第2张图片

因为数据被标准化不再是最开始的样子,它变成了一种解释(interpretation),标准化缓冲区包括:所有的http关键字,重组流(reassembled streams),TLS-,SSL-,SSH-,FTP-和dcerpc-buffers

有一些例外,例如关键字http_raw_uri,详情:http_uri and http_raw_uri

Meta Keywords

meta-setting对Suricata的检查没有影响,对Suricata报告事件的方式有影响

msg(message)

关键字msg给出关于规则的文本型信息和可能的警告

Example:

msg:"ATTACK-RESPONSES 403 Forbidden";

 

 

Tip:通常将signature的第一部分大写并显示signature的类

       通常msg作为signature的第一个关键字

注意:;.\,",这三个字符若出现在msg中,需进行转义

sid(signature ID)

signature的ID,数字组成,如:

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;)

 

 

 

 

Tip:通常sid作为signature的最后一个关键字,若有关键字rev则作为倒数第二个关键字

rev(revision)

sid总是和rev同时出现,rev代表signature的版本,如果一个signature被修改,rev的数会被signature的修改者增加

gid(group ID)

gid关键字可以为不同组的signature提供另外一个ID值,Suricata默认gid为1,它可以被修改,但是不是很常用,改变他没有什么技术含义,只能在alert中看到。

fast.log中的gid样例:[1:2008124:2]中,1代表gid,2008124代表sid,2代表rev

10/15/09-03:30:10.219671 [**] [1:2008124:2] ET TROJAN Likely Bot Nick in IRC (USA +..) [**] [Classification: A Network Trojan was Detected] [Priority: 3] {TCP} 192.168.1.42:1028 -> 72.184.196.31:6667
4.2.5. classtype

 

 

 

 

classtype

classtype关键字给出规则和警告的类别信息。它包括一个短名字,一个长名字和优先级。他可以告诉你一个规则只是包含信息还是有关黑客等。对于每个类别,classification.config有一个在规则中用到的优先级。

classtype定义样例:

config classification: web-application-attack,Web Application Attack,1
config classification: not-suspicious,Not Suspicious Traffic,3

 

 

 

在配置文件中定以后,我们可以在规则中用这些类别。一个有着web-application-attack的规则会被分配到1的优先级并且告警信息包含Web Application Attack

classtype Alert Priority
web-application-attack Web Application Attack 1
not-suspicious Not Suspicious Traffic 3

 

 

 

 

下面的例子是一个trojan-activity的例子

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;)

 

 

 

 

Tip:classtype在sid和rev关键字之前,在其他关键字之后。

reference

reference关键字可以指向关于signature的信息位置和关于signature尝试解决的问题地址。reference关键字可以再signature中出现多次,这个关键字是为signature编写者和分析signature为什么匹配到的人准备的,其格式如下:

reference: type, reference

 

 

一个典型的指向www.info.com的reference如下:

reference: url, www.info.com

 

 

不过,也有一些系统可以被当做reference来用,最常见的就是CVE数据库,它将威胁与数字结合,防止你为同一个漏洞多次分配url,例如:

reference: cve, CVE-2014-1234

 

 

这将引用http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-1234,所有reference的类型都会在reference.config中定义

下面这个例子包括reference

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;)

 

 

 

 

priority

priority关键字附带1到255的强制数值,其中1到4是最常用的。将检查有着较高优先级的signature,最高的优先级是1.通常signature在classtype中已经有了一个优先级。这个优先级可以被关键字priority关键字覆盖,格式如下:

priority:1;

 

 

metadata

metadata关键字允许一些其他的,非功能性的信息添加到signature中。虽然格式是自由格式的,但建议用键值对,因为Suricata可以将他们包含到警报当中,格式如下:

metadata: key value;
metadata: key value, key value

 

 

 

target

target关键字允许编写规则的人去指定警报的那一侧是攻击的目标,如果指定,警报事件将得到增强,包括源和目标信息。

target:[src_ip|dest_ip]

 

 

如果值是src_ip,那么生成事件中的源IP(JSON中的src_ip字段)是攻击目标,如果target是dest_ip,那么target是生成事件中的目的IP

你可能感兴趣的:(计算机网络)