alert tcp 202.110.8.1 any -> 122.111.90.8 80 (msg:」Web Access」; sid:1)
javascript
這條規則看字面意思就很容易理解。Snort就是利用規則來匹配數據包進行實時流量分析,網絡數據包記錄的網絡入侵檢測/防護系統(Network Intrusion Detection/Prevention System),也就是NIDS/NIPS。php
建議將Snort的目錄結構配置成以下:html
/etc/snort ├── barnyard2.conf barnyard2日誌分析工具配置文件 ├── snort.conf snort配置文件(關鍵) ├── threshold.conf 事件過濾配置文件 ├── classification.config 規則分類配置文件(classtype) ├── reference.config 外部參考配置文件(reference) ├── gen-msg.map generate id 和 msg 對應關係map ├── sid-msg.map snort id 和 msg對應關係map ├── unicode.map 預處理器http_inspect編碼翻譯文件 ├── preproc_rules 預處理器及解碼器規則集 │ ├── decoder.rules │ ├── preprocessor.rules │ └── sensitive-data.rules ├── rules Snort規則集(關鍵) │ ├── web-iis.rules │ ├── web-php.rules More… ├── so_rules Share Object規則集 │ ├── browser-ie.rules │ ├── browser-other.rules More…
此文件是配置snort的核心文件,包括如下幾部分: 1) Set the network variables. 設置各種網絡地址,規則中易於使用 2) Configure the decoder 設置解碼器 3) Configure the base detection engine 設置基礎檢測引擎 4) Configure dynamic loaded libraries 設置動態連接庫 5) Configure preprocessors 設置預處理器 6) Configure output plugins 設置輸出插件 7) Customize your rule set 設置自定義規則 8) Customize preprocessor and decoder rule set設置預處理、解碼器規則 9) Customize shared object rule set 設置共享對象規則集
下面分別詳細介紹這四大模塊。java
因爲解碼模塊和預處理模塊功能相似,都是在規則檢測引擎以前對數據包的處理,因此兩個模塊一併介紹。 解碼模塊主要是將從監控網絡當中抓取的原始網絡數據包,按照各個網絡協議棧從下至上進行解碼,並將解碼數據保存到各個對應的數據結構當中,最後交由預處理模塊進行處理。mysql
解碼後的數據包通過預處理以後才能被主探測引擎進行規則匹配。預處理器的主要用來應對一些IDS攻擊手段。其做用包括:git
1)針對可疑行爲檢查包或修改包,以便探測引擎能對其正確解釋。 2)負責對流量標準化,以便探測引擎能精確匹配特徵。github
目前已知的IDS逃避技術主要有:web
1)– 多態URL編碼; 2)– 多態shellcode; 3)– 會話分割; 4)– IP碎片;正則表達式
Snort主要包含如下三類預處理器(舉例說明):算法
1)包重組預處理器:
2)協議規範化預處理器:
3)異常檢測預處理器:
配置分兩個步驟,都是在snort.conf中配置。
1.snort.conf的2)和5)中配置解碼器或者預處理參數。
2.snort.conf的8)中啓用檢測規則。
1.配置解碼器
config disable_decode_alerts 關閉decode告警。 config enable_decode_oversized_alerts 若是一個包(IP,UDP,TCP)長度長於length字段,則告警。 # Stop generic decode events
格式爲config docoder [option]
,使用#
做爲註釋
2.啓用解碼器檢測規則
include $PREPROC_RULE_PATH/decoder.rules
snort.conf文件中使用include關鍵詞包含配置文件和規則文件。
3.在decoder.rules中咱們找到了檢測IP長度異常的規則。
alert ( msg:"DECODE_IPV4_DGRAM_GT_IPHDR"; sid:6; gid:116; rev:1; metadata:rule-type decode;classtype:protocol-command-decode; )
1.下面是http_inspect默認的配置
preprocessor http_inspect: global iis_unicode_map unicode.map 1252 compress_depth 65535 decompress_depth 65535 #unicode.map是http_inspect解碼unicode時的解碼文件。 preprocessor http_inspect_server: server default \ http_methods { GET POST PUT SEARCH MKCOL ...} \ ... enable_cookie #將http請求或響應中的cookie提取到緩存,用於後面規則匹配。 normalize javascript #對標籤中的js腳本解碼。 ...
2.啓用預處理器規則
#include $PREPROC_RULE_PATH/preprocessor.rules
下面是一條解碼器規則:
alert ( msg:"DECODE_TCP_INVALID_OFFSET"; sid:46; gid:116; rev:1; metadata:rule-type decode; reference:cve,2004-0816; classtype:bad-unknown; )
發現這條規則和以前看到的不同,它沒有源/目的IP,端口等信息,說明這條規則是由解碼器自動觸發的,用戶不須要干預。 通常咱們也不須要去修改解碼器或者預處理器的規則,只須要去snort.conf中添加、配置或者刪除插件便可。
規則結構 alert tcp 202.110.8.1 any -> 122.111.90.8 80 (msg:」Web Access」; sid:1) |---||---||---||---||---||---||---||---||---||--規則頭---||---||---||---||---||---||---||---||--||---||---||---||-規則選項---||---||---||---||-|
動做:
在snort中有五種動做:alert、log、pass、activate和dynamic.
1)Alert: 生成一個告警,而後記錄(log)這個包。 2)Log: 記錄這個包。 3)Pass: 丟棄這個包。 4)Activate: alert而且激活另外一條dynamic規則。 5)Dynamic:保持空閒直到被一條activate規則激活,被激活後就做爲一條log規則執行。
協議:
Snort當前可分析的協議有四種:TCP,UDP,ICMP和IP。未來可能會更多,例如:ARP、IGRP、GRE、OSPF、RIP、IPX等。
IP地址:
1)地址就是由直接的ip地址或一個CIDR塊組成的。也能夠指定ip地址列表,一個ip地址列表由逗號分割的ip地址和CIDR塊組成,而且要放在方括號內 [,]。 2)否認操做符用!
表示。 3)關鍵字「any」能夠被用來定義任何地址。
例如:
alert tcp ![192.168.1.0/24,10.1.1.0/16] any -> 192.168.2.1 80(msg:」notice!」;content|xxxx|;)
方向操做符:
方向操做符->
表示規則所施加的流的方向。方向操做符左邊的ip地址和端口號被認爲是流來自的源主機,方向操做符右邊的ip地址和端口信息是目標主機,還有一個雙向操做符<>
。
端口號:
1)端口號能夠用幾種方法表示,包括any端口、靜態端口定義、範圍、以及經過否認操做符。 2)靜態端口定義表示一個單個端口號,例如111表示portmapper,23表示telnet,80表示http等等。 3)端口範圍用範圍操做符「:」表示.好比,80:
, :1024
,80:1024
規則選項分爲四大類:
1)General rule option 通用規則選項 2)Payload detection rule option 負載檢測規則選項 3)Non-Payload detection rule option 非負載檢測規則選項 4)Post detection rule option 後檢測規則選項
sid
snort id ,這個關鍵字被用來識別snort規則的惟一性(說的其實嚴禁,後面會有補充)。sid 的範圍是以下分配的:
msg
標示一個消息,可是規則中的msg不起做用,sid和msg的對應關係查閱sid-msg.map。
sid-msg.map
格式:sid || msg
例子:384 || PROTOCOL-ICMP PING
在/etc/snort/rules/protocol-icmp.ruls中咱們找到了這條規則: alert icmp $EXTERNAL_NET any -> $HOME_NET any (msg:"PROTOCOL-ICMP PING"; icode:0; itype:8; metadata:ruleset community; classtype:misc-activity; sid:384; rev:8;)
此文件做用是將sid與msg的一一對應,不然,在告警中會出現下圖中第一條的現象。
此文件用於自定義規則中sid與msg的對應和在snort自有規則中自定義告警信息。 上圖中Snort Alert[1:1000015:0]
其中內容對應爲Snort alert[gid:sid:rev]
。這說明一個規則須要這三個因素才能肯定,以前說只有sid惟一標示一條規則是不嚴謹的。
gid
generate id,做用是爲了說明這條規則是snort的哪部分觸發的。好比是由解碼器、預處理器仍是Snort自有規則等。 查看/usr/local/share/doc/snort/generators文件(此文件不是配置文件): rules_subsystem 1 # Snort Rules Engine rpc_decode 106 # RPC Preprocessor(預處理器) stream4 111 # Stream4 preprocessor(預處理器) ftp 125 # FTP decoder(解碼器) ... ...
decoder和preprocessor的gid就不一一列舉,能夠看到Snort Rule Engine的gid爲1,自定義規則和snort自有規則(也就是/etc/snort/rules目錄下的規則)gid默認是1。可是這裏咱們獲知decoder和preprocessor也是有sid的。 舉例說明:
/etc/snort/rules/protocol-icmp.rules中的一條規則:
alert icmp $EXTERNAL_NET any -> $HOME_NET any (msg:「PROTOCOL-ICMP Traceroute」; icode:0; itype:30; metadata:ruleset community; classtype:misc-activity; sid:456; rev:8;)
gid默認爲1
/etc/snort/preproc_rules/decoder.rules中的一條規則:
alert ( msg:"DECODE_IP6_EXCESS_EXT_HDR"; sid:456; gid:116; rev:1; metadata:rule-type decode; classtype:misc-activity; )
能夠看到兩條規則的sid是相同的,因此還須要gid來區分。
gen-msg.map
這個文件和sid-msg.map做用相似,在邏輯上應該是包含了sid-msg.map(sid-msg.map至關於默認gid爲1)
格式:generatorid || alertid(sid) || MSG
例子:
1 || 1 || snort general alert 129 || 2 || stream5: Data on SYN packet 116 || 271 || snort_decoder: WARNING: IPv6 header claims to not be IPv6 116 || 456 || snort_decoder: WARNING: too many IPV6 extension headers #例子 ...
拿gid中第二條規則舉例,若是此條規則被觸發,則會報snort_decoder: WARNING: too many IPV6 extension headers
告警,而不是DECODE_IP6_EXCESS_EXT_HDR
。因此規則中的msg僅僅起到標示做用,告警msg須要在sid-msg.map和gen-msg.map這兩個文件中對應查找。
rev
這個關鍵字是被用來識別規則修改的版本,須要和sid,gid配合使用。 這樣就介紹完了gid,sid,rev三個肯定規則惟一的元素。
reference
外部攻擊參考,這個關鍵字容許規則包含一個外面的攻擊識別系統。這個插件目前支持幾種特定的系統,這些插件被輸出插件用來提供一個關於產生報警的額外信息的鏈接。
reference.config
格式:config reference: system URL
例子: config reference: cve http://cve.mitre.org/cgi-bin/cvename.cgi?name=
定義了一些外部安全網站的網址。好比規則中定義reference: cve,1001,那麼就像在上面的網址後面添加了1001,http://cve.mitre.org/cgi-bin/cvename.cgi?name=1001
,最後點擊告警中的[cve],就會跳轉到相應的網址。注:reference也須要在sid-msg.map中與sid對應,不然不起做用,類比msg。
classtype
規則類別標識。這個關鍵字把報警分紅不一樣的攻擊類。經過使用這個關鍵字和使用優先級,用戶能夠指定規則類中每一個類型所具備的優先級。
priority
設置classtype的優先級。classtype和priority是配合使用的,classification.config文件將其聯繫起來。
classification.config
格式: config classification:shortname,short description,priority
例子: config classification: attempted-admin,Attempted Administrator Privilege Gain,1
寫在此文件中的都是默認值,priority關鍵詞能夠在規則中重寫優先級。 例子: alert tcp any any -> any 80 (msg:"EXPLOIT ntpdx overflow"; dsize:>128; classtype:attempted-admin; priority:10 );
metadata
能夠在規則中添加自定義的信息,通常以鍵值對的形式出現。
通用規則選項只是對一條規則進行標示,分類等操做,並無進行實際的過濾檢測。
content
content是Snort重要的關鍵詞之一。它規定在數據包的負載中搜索指定的樣式。它的選項數據能夠包含混合的文本和二進制數據。二進制數據通常包含在管道符號中「|」,表示爲字節碼(bytecode),也就是將二進制數據的十六進制形式。
alert tcp any any -> any 139 (content:"|5c 00|P|00|I|00|P|00|E|00 5c|";) alert tcp any any -> any 80 (content:!「GET」;)
content還有不少修飾符:
Nocase content字符串大小寫不敏感 rawbytes 直接匹配原始數據包 Depth 匹配的深度 Offset 開始匹配的偏移量 Distance 兩次content匹配的間距 Within 兩次content匹配之間至多的間距 http_cookie 匹配cookie http_raw_cookie 匹配未經normalize的cookie http_header 匹配header http_raw_header 匹配未經normalize的header http_method 匹配method http_url 匹配url http_raw_url 匹配日在未經normalize的url中 http_stat_code 匹配狀態碼中匹配 http_stat_msg 匹配狀態信息 http_encode 匹配編碼格式
http開頭的修飾符須要配合前面介紹過的預處理器http_inspect一塊兒使用。
pcre
容許用戶使用與PERL語言相兼容的正則表達式。
格式 pcre:[!]"(/<regex>/|m<delim><regex><delim>)[ismxAEGRUBPHMCOIDKY]
例子:alert tcp any any -> any 80 (content:「/foo.php?id="; pcre:"/\/foo.php?id=[0-9]{1,10}/iU";)
正則的細節查閱snort_manual。
protected_content
將content中的查詢內容使用hash算法加密,保護規則的私密性。 protected_content:[!]"<content hash>", length:orig_len[, hash:md5|sha256|sha512];
rawbytes
忽略解碼器及預處理器的操做,直接匹配原始網絡包。
上面只列舉出了一些經常使用的payload detection rule option,更多的關鍵詞查閱snort_manual。
Fragoffset IP 偏移量 Ttl IP 生存時間 Tos IP 服務類型 Id IP 標識 Ipopts IP 可選項 Fragbits IP 標誌 Dsize 數據包負載量 Flags TCP flags Seq TCP seq Ack TCP ack Window TCP window Icmp_id ICMP ID
此類規則選項都是對數據包幀結構中特殊字段的匹配。
Logto 輸出日誌路徑 Session 從TCP會話中獲取用戶數據 Resp 經過發送響應結束惡意的請求 React 不只僅記錄觸發規則的特定數據包 Tag 不只僅記錄觸發規則的特定數據包 Activates activate動做 Activates_by dynamic動做 Count dynamic規則被觸發後能夠匹配的包的數目 Replace 替換content內容 Detection-filter 檢測過濾
1.在/etc/rules目錄下的*.rules文件中寫規則。 2.snort.conf 7)中include對應規則。
include $RULE_PATH/local.rules #include $RULE_PATH/app-detect.rules #include $RULE_PATH/attack-responses.rules #include $RULE_PATH/backdoor.rules #include $RULE_PATH/bad-traffic.rules #include $RULE_PATH/blacklist.rules
snort.conf 6):Configure output plugins 設置日誌路徑 config logdir:/var/log/snort
設置輸出格式爲unified2: output unified2: filename snort.log, limit 128
barnyard2.conf
barnyard2的做用是將unified2格式的數據存入數據庫 設置與snort日誌關聯 config waldo_file:/var/log/snort/barnyard.waldo
設置數據庫 output database: log, mysql, user=snort password=123456 dbname=snort host=localhost
ER圖
schema
vseq:數據庫模式ID ctime:數據庫建立時間
信息表,和其餘數據庫內容上沒有聯繫
sensor
sid:傳感器代號 hostname:傳感器所屬的用戶名稱 Interface:傳感器對應的網絡接口 filter:對應傳感器的過濾原則 detail:表示傳感器監測模式,記錄模式詳細程度的級別 encoding:包含數據存在形式 last_cid: 對應每一個sid即傳感器捕獲告警的最後一個值
detail
0-fast快速檢測 1-full全面檢測
傳感器sensor的檢測級別。
encoding
0- Hex 1- base64 2- asci
數據包中數據的存在形式。
event
sid:sensor id,傳感器id。 cid;event id 事件id。sid和cid共同做爲主碼,其中cid是在sid的基礎上進行排序的。每一個sid對應本身的cid排序。 signature:對應signature表格中的sig_id選項,代表這條告警事件所屬的規則形式的告警對應哪一類rules。 timestamp:對應告警事件發生的系統時間。
最核心的一張表,告警的每一條數據都會存儲在event表中,一條event數據就表明一個包。
signature
sig_id: 總數表明發生告警種類的總數。是告警種類的主碼。惟一標識一條規則。 sig_name:告警名稱。對應每條alert語句的Msg。 sig_class_id:對應sig_class表格中的sig_class_id.表明告警種類的大類信息。 sig_priority:告警的優先級 sig_rev:版本號 sig_sid:snort id sig_gid:generate id
存儲snort規則的一張表,能夠看到sig_sid,sig_gid,sig_rev分別對應規則中的sid,gid,rev。注意規則中的snort id和數據庫中的 sensor id注意區分。
sig_reference
sig_id:對應的告警種類。 ref_id:對應reference表格中的主碼 ref_seq:參考序列號
提供報警種類信息signature的參考信息。將signature與reference聯繫起來的表格。
reference
Ref_id:主碼 Ref_system_id:對應reference_system表格 Ref_tag:規則中 cve,bugtraq 後面的參數
reference_system
ref_system_id:主碼 ref_system_name:reference system的名字,如cve,url等。
sig_class
sig_class_id:分類編號 sig_class_name:分類名稱
signature告警種類的分類信息。
iphdr
tcphdr
udphdr
icmphdr
data
data_payload:數據包有效載荷
規則中協議爲tcp時,data_payload中是tcp後面的內容
規則中協議爲icmp時,data_payload中是icmp協議中的data字段值
opt
IP和OPT的option。
參考文獻: