轉(zhuǎn)自:http://xiaix.me/suricata-gui-ze-bian-xie-1-gui-ze-de-jie-gou/
1.簡(jiǎn)介
Suricata 是一款高性能的網(wǎng)絡(luò)IDS、IPS和網(wǎng)絡(luò)安全監(jiān)控引擎。
最著名的 IDS/IPS 是 Snort,那為什么我們還要用 Suricata 呢?
最主要的原因是 Snort 只支持單線程,而 Suricata 支持多線程,另外 Suricata 內(nèi)置支持 IPv6,并且支持現(xiàn)有的 Snort 規(guī)則和簽名。
2. Suricata 規(guī)則
一條 Suricata 規(guī)則由三個(gè)部分組成:
- 操作(Action)
- 頭部(Header)
- 規(guī)則(Rule options)

2.1 操作(Action)
Action 顧名思義就是在匹配規(guī)則到時(shí)進(jìn)行什么樣的操作,其總共有四種可選的值,分別為:Pass,Drop,Reject 和 Alert。
Pass
如果匹配到了規(guī)則,則 Suricata 停止掃描數(shù)據(jù)包并跳過(guò)當(dāng)前所有規(guī)則(指的是當(dāng)前規(guī)則包內(nèi)的所有規(guī)則)。
Drop
這個(gè)值只能在 IPS/inline 模式下才可使用。
如果匹配到了規(guī)則,則 Suricata 也會(huì)立馬停止掃描數(shù)據(jù)包并將當(dāng)前數(shù)據(jù)包丟棄。
Reject
不同于 Drop 直接丟棄數(shù)據(jù)包,Reject 在匹配到規(guī)則時(shí)會(huì)主動(dòng)進(jìn)行拒絕數(shù)據(jù)包。當(dāng)數(shù)據(jù)包為 TCP 時(shí),會(huì)返回一個(gè) RST 數(shù)據(jù)包重置連接;為其他數(shù)據(jù)包時(shí),則會(huì)返回一個(gè) ICMP-error 數(shù)據(jù)包。
在拒絕了連接后 Suricata 也會(huì)產(chǎn)生相應(yīng)的警報(bào)。
這個(gè)我理解也是在IPS下才有。
Alert
當(dāng)匹配到規(guī)則時(shí),Suricata 不會(huì)對(duì)數(shù)據(jù)包進(jìn)行任何操作,會(huì)像對(duì)正常數(shù)據(jù)包一樣進(jìn)行放行,除了會(huì)記錄一條只有管理員能夠看到的警報(bào)。
以上四種操作也是有優(yōu)先級(jí)的,默認(rèn)的優(yōu)先級(jí)為:Pass > Drop > Reject > Alert。也就是規(guī)則在匹配時(shí)會(huì)優(yōu)先考慮包含 Pass 的規(guī)則,其次才是 Drop,再然后是 Reject,最后在考慮包含 Alert 的規(guī)則。
2.2 頭部
頭部中包含如下幾項(xiàng):
- 協(xié)議(Protocol)
- 源/目的地址(Source and destination)
- 端口號(hào)(Ports)
- 流向(Direction)
協(xié)議(Protocol)
這個(gè)字段用來(lái)告訴 Suricata 當(dāng)前規(guī)則所包含的協(xié)議。其取值可以為:tcp,udp,icmp,ip,http,ftp,tls(包含ssl),smb,dns等等。如下圖示例中紅色標(biāo)識(shí)所示:
頭部中包含如下幾項(xiàng):

源/目的地址(Source and destination)
源/目的地址可以設(shè)置為 IP 地址或者在配置文件(Suricata.yaml)里定義的變量,如:$HOME_NET和$EXTERNAL_NET。具體可以設(shè)置如下形式:
! 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 (配置文件中設(shè)置的 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 設(shè)置為 any,而 $EXTERNAL_NET 為 !$HOME_NET,那么這里就不能在使用! $EXTERNAL_NET 了,畢竟沒(méi)有 not any 不是嗎。
image.png
端口號(hào)(Ports)
不同的協(xié)議使用不同的端口號(hào),例如 HTTP 使用 80 端口,而 HTTPS 則使用 443。通常情況下端口號(hào)會(huì)設(shè)置為 any,這樣會(huì)影響所有的協(xié)議。如果有特殊需求可以按照如下方式單獨(dú)設(shè)置端口號(hào):
! 排除
: 范圍
[] 包含
, 分隔符
具體示例如下:
[80, 81, 82] (端口號(hào) 80, 81 和 82)
[80: 82] (范圍 80 到 82)
[1024: ] (從 1024 起到最大端口號(hào))
!80 (除了 80 以外的所有端口號(hào))
[80:100,!99] (從 80 到 100 除了 99 的端口)
[1:80,![2,4]]
[….[.....]]
image.png
流向(Direction)
流向告訴規(guī)則匹配哪些流量數(shù)據(jù),是匹配從外部網(wǎng)絡(luò)進(jìn)來(lái)的,還是匹配從內(nèi)部網(wǎng)絡(luò)出去的,亦或者兩種同時(shí)匹配。其中,每條規(guī)則都必須有一個(gè)向右的箭頭如下所示:
source -> destination
source <> destination (雙向匹配)
alert tcp 1.2.3.4 1024 - > 5.6.7.8 80
本例中,規(guī)則只會(huì)匹配從 1.2.3.4:1024 流向 5.6.7.8:80 的數(shù)據(jù),而對(duì)于相反方向的流量則會(huì)直接放行不進(jìn)行匹配。

2.3 規(guī)則
規(guī)則的每一條都遵循固定的格式:
name: settings;
注意:Suricata 是依據(jù) ; 來(lái)解析規(guī)則的,所以除了每條關(guān)鍵字末尾處千萬(wàn)別出現(xiàn);,不然解析會(huì)報(bào)錯(cuò),如果正則匹配中要用到記得前面加上轉(zhuǎn)義符。
每條規(guī)則也包含如下設(shè)置:
- 元信息(meta-information)
- 頭部(headers)
- 有效載荷(payloads)
- 流(flows)
受篇幅所知,本問(wèn)只介紹元信息部分,余下內(nèi)容后續(xù)文章繼續(xù)講解。
元信息(meta-information)
msg (message)
msg 關(guān)鍵字就是當(dāng)本條規(guī)則匹配中時(shí),顯示在日志中的提示內(nèi)容,格式如下:
msg: “..........”;
需要特別注意的是,msg 關(guān)鍵字必須為每條規(guī)則的第一個(gè)關(guān)鍵字,也就是說(shuō)必須出現(xiàn)在規(guī)則的最前面。
如下示例所示:
msg:"ATTACK-RESPONSES 403 Forbidden";
msg:"ET EXPLOIT SMB-DS DCERPC PnP bind attempt";
Sid (signature id)
表示sid 關(guān)鍵字識(shí)每條規(guī)則的 id,必須位數(shù)字且唯一。示例如下:
sid:2008124;
Rev (Revision)
rev 關(guān)鍵字標(biāo)識(shí)修訂版本號(hào),每次修改后加一。
需要注意的是,rev 關(guān)鍵字一般要緊隨在 sid 關(guān)鍵字之后,且 sid 和 rev 一般要為規(guī)則最后的關(guān)鍵字,也就是出現(xiàn)在規(guī)則最后的位置,當(dāng)然如果還有 gid 關(guān)鍵字的話,gid 會(huì)在最后面。示例如下:
Gid (group id)
gid 關(guān)鍵字表示每條規(guī)則分組的 id,功能類似與 sid,不過(guò)因?yàn)槭欠纸M的 id,所以值可以重復(fù),另外就是如果不指定的話,默認(rèn)所有規(guī)則的 gid 值都為 1。其實(shí)這個(gè)值也只有在日志中才可能出現(xiàn),如下所示:
Classtype
classtype 關(guān)鍵字表示對(duì)當(dāng)前規(guī)則的分類的情況,這個(gè)關(guān)鍵字一般是在
classification.conf
文件中指定由名稱,描述和優(yōu)先級(jí)組成,它可以用來(lái)顯示當(dāng)前規(guī)則只是一條信息或是遭受了黑客的攻擊。classtype 定義示例如下:
config classification: web-application-attack,Web Application Attack,1
config classification: not-suspicious,Not Suspicious Traffic,3
需要注意的是,classtype 關(guān)鍵字需要出現(xiàn)在 sid 和 rev 關(guān)鍵字之前,其他關(guān)鍵字之后。示例如下:
Reference
reference 字段表示當(dāng)前規(guī)則相關(guān)信息所在 url,可以同時(shí)指定多條 url,一般規(guī)則如下:
reference: url, www.info.nl
但也可以使用其他類型的引用,具體可選類型如下:
bugtraq http://www.securityfocus.com/bid
cve http://cve.mitre.org/cgi-bin/cvename.cgi?name=
nessus http://cgi.nessus.org/plugins/dump.php3?id=
mcafee http://vil.nai.com/vil/dispVirus.asp?virus_k=
url http://
以 CVE 為例,只需要填入 CVE 號(hào)
CVE-2016-6210
會(huì)自動(dòng)補(bǔ)全為
http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-6210
的網(wǎng)址。多條引用示例如下:
Priority
priority 關(guān)鍵字用于指定當(dāng)前規(guī)則的優(yōu)先級(jí),取值范圍從 1 到 255,取值越小優(yōu)先級(jí)越大,但常用值為 1-4。
這個(gè)關(guān)鍵字通常我都不會(huì)添加,因?yàn)槲覀冎乐暗?classtype 關(guān)鍵字已經(jīng)包含有優(yōu)先級(jí)了,規(guī)則會(huì)自動(dòng)繼承這個(gè)優(yōu)先級(jí),但如果有其他需求可以添加這個(gè)關(guān)鍵字覆蓋 classtype 關(guān)鍵字的優(yōu)先級(jí)。格式如下:
priority:1;
metadata
這個(gè)關(guān)鍵字 Suricata 會(huì)直接忽略,那為什么還會(huì)存在呢?都是為了兼容 snort 規(guī)則。
target
目標(biāo)關(guān)鍵字允許規(guī)則編寫(xiě)者指定警報(bào)的哪一側(cè)是攻擊的目標(biāo)。 如果指定,則提高警報(bào)事件以包含有關(guān)源和目標(biāo)的信息。
如果值是src_ip,則生成的事件(JSON中的src_ip字段)中的源IP是攻擊的目標(biāo)。 如果target設(shè)置為dest_ip,則目標(biāo)是生成的事件中的目標(biāo)IP。
參考:







