规则格式
Suricata规则包括以下三部分:
- action,action决定当signature匹配的时候会发生什么
- 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;) |
红色对应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,客户端向服务端发送信息,并且服务端应答
规则:
alert tcp 1.2.3.4 1024 -> 5.6.7.8 80 |
这样只有第一个数据包可以被匹配到,对于反向的流量会直接放行
Rule options
规则其余部分由选项组成,由括号括起分号隔开。一些选项可以设置(如msg)由选项的关键字规定,后面加“:”,一些不可以设置,只有关键字(如nocase)
<keyword>:<settings>; <keyword>; |
规则选项由特定的顺序,变换顺序就会改变规则的含义
注意:在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”:
因为数据被标准化不再是最开始的样子,它变成了一种解释(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