基礎:
snort使用一種簡單的,輕量級的規則描述語言,這種語言靈活而強大。在開發snort規則時要記住幾個簡單的原則。
第一,大多數snort規則都寫在一個單行上,或者在多行之間的行尾用/分隔。Snort規則被分紅兩個邏輯部分:規則頭和規則選項。規則頭包含規則的動做,協議,源和目標ip地址與網絡掩碼,以及源和目標端口信息;規則選項部分包含報警消息內容和要檢查的包的具體部分。
下面是一個規則範例:
alert tcp any any -> 192.168.1.0/24 111 (content:"|00 01 86 a5|"; msg: "mountd access";)
第一個括號前的部分是規則頭(rule header),包含的括號內的部分是規則選項(rule options)。規則選項部分中冒號前的單詞稱爲選項關鍵字(option keywords)。注意,不是全部規則都必須包含規則選項部分,選項部分只是爲了使對要收集或報警,或丟棄的包的定義更加嚴格。組成一個規則的全部元素對於指定的要採起的行動都必須是真的。當多個元素放在一塊兒時,能夠認爲它們組成了一個邏輯與(AND)語句。同時,snort規則庫文件中的不一樣規則能夠認爲組成了一個大的邏輯或(OR)語句。
規則高級概念:
Includes
include容許由命令行指定的規則文件包含其餘的規則文件。
格式:
include: <include file path/name>
注意在該行結尾處沒有分號。被包含的文件會把任何預先定義的變量值替換爲本身的變量引用。參見變量(Variables)一節以獲取關於在SNORT規則文件中定義和使用變量的更多信息。
Variables
變量可能在snort中定義。
格式:
var: <name> <value>
例子:
var MY_NET 192.168.1.0/24
alert tcp any any -> $MY_NET any (flags: S; msg: "SYN packet";)
規則變量名能夠用多種方法修改。能夠在"$"操做符以後定義變量。"?" 和 "-"可用於變量修改操做符。
$var - 定義變量。
$(var) - 用變量"var"的值替換。
$(var:-default) - 用變量"var"的值替換,若是"var"沒有定義用"default"替換。
$(var:?message) - 用變量"var"的值替換或打印出錯誤消息"message"而後退出。
例子:
var MY_NET $(MY_NET:-192.168.1.0/24)
log tcp any any -> $(MY_NET:?MY_NET is undefined!) 23
Config
Snort的不少配置和命令行選項均可以在配置文件中設置。
格式:
config <directive> [: <value>]
Directives
order 改變規則的順序( snort -o )
alertfile 設置報警輸出文件,例如:config alertfile: alerts
classification 建立規則分類。
decode_arp 開啓arp解碼功能。(snort -a)
dump_chars_only 開啓字符傾卸功能。(snort -C)
dump_payload 傾卸應用層數據。(snort -d)
decode_data_link 解碼第二層數據包頭。(snort -e)
bpf_file 指定BPF過濾器(snort -F)。例如:config bpf_file: filename.bpf
set_gid 改變GID (snort -g)。例如:config set_gid: snort_group
daemon 之後臺進程運行。(snort -D)
reference_net 設置本地網絡。 (snort -h). 例如:config reference_net: 192.168.1.0/24
interface 設置網絡接口(snort –i )。例如:config interface: xl0
alert_with_interface_name 報警時附加上接口信息。(snort -I)
logdir 設置記錄目錄 (snort -l)。例如:config logdir: /var/log/snort
umask 設置snort輸出文件的權限位。(snort -m). Example: config umask: 022
pkt_count 處理n個數據包後就退出。(snort -n). Example: config pkt_count: 13
nolog 關閉記錄功能,報警仍然有效。 (snort -N)
obfuscate 使IP地址混亂 (snort -O)
no_promisc 關閉混雜模式。(snort -p)
quiet 安靜模式,不顯示標誌和狀態報告。(snort -q)
checksum_mode 計算校驗和的協議類型。類型值:none, noip, notcp, noicmp, noudp, all
utc 在時間戳上用UTC時間代替本地時間。 (snort -U)
verbose 將詳細記錄信息打印到標準輸出。 (snort -v)
dump_payload_verbose 傾卸數據鏈路層的原始數據包 ( snort -X )
show_year 在時間戳上顯示年份。(snort -y)
stateful 爲stream4設置保證模式。
min_ttl 設置一個snort內部的ttl值以忽略全部的流量。
disable_decode_alerts 關閉解碼時發出的報警。
disable_tcpopt_experimental_alerts 關閉tcp實驗選項所發出的報警。
disable_tcpopt_obsolete_alerts關閉tcp過期選項所發出的報警。
disable_tcpopt_ttcp_alerts 關閉ttcp選項所發出的報警。
disable_tcpopt_alerts 關閉選項長度確認報警。
disable_ipopt_alerts 關閉IP選項長度確認報警。
detection 配置檢測引擎。( 例如:search-method lowmem )
reference 給snort加入一個新的參考系統。
規則頭
規則動做:
規則的頭包含了定義一個包的who,where和what信息,以及當知足規則定義的全部屬性的包出現時要採起的行動。規則的第一項是"規則動做"(rule action),"規則動做"告訴snort在發現匹配規則的包時要幹什麼。在snort中有五種動做:alert、log、pass、activate和dynamic.
一、Alert-使用選擇的報警方法生成一個警報,而後記錄(log)這個包。
二、Log-記錄這個包。
三、Pass-丟棄(忽略)這個包。
四、activate-報警而且激活另外一條dynamic規則。
五、dynamic-保持空閒直到被一條activate規則激活,被激活後就做爲一條log規則執行。
你能夠定義你本身的規則類型而且附加一條或者更多的輸出模塊給它,而後你就可使用這些規則類型做爲snort規則的一個動做。
下面這個例子建立一條規則,記錄到tcpdump。
ruletype suspicious
{
type log output
log_tcpdump: suspicious.log
}
下面這個例子建立一條規則,記錄到系統日誌和MySQL數據庫
ruletype redalert
{
type alert output
alert_syslog: LOG_AUTH LOG_ALERT
output database: log, mysql, user=snort dbname=snort host=localhost
}
協議
規則的下一部分是協議。Snort當前分析可疑包的ip協議有四種:tcp 、udp、icmp和ip。未來可能會更多,例如ARP、IGRP、GRE、OSPF、RIP、IPX等。
Ip地址
規則頭的下一個部分處理一個給定規則的ip地址和端口號信息。關鍵字"any"能夠被用來定義任何地址。Snort沒有提供根據ip地址查詢域名的機制。地址就是由直接的數字型ip地址和一個cidr塊組成的。Cidr塊指示做用在規則地址和須要檢查的進入的任何包的網絡掩碼。/24表示c類網絡,/16表示b類網絡,/32表示一個特定的機器的地址。例如,192.168.1.0/24表明從192.168.1.1到192.168.1.255的地址塊。在這個地址範圍的任何地址都匹配使用這個192.168.1.0/24標誌的規則。這種記法給咱們提供了一個很好的方法來表示一個很大的地址空間。
有一個操做符能夠應用在ip地址上,它是否認運算符(negation operator)。這個操做符告訴snort匹配除了列出的ip地址之外的全部ip地址。否認操做符用"!"表示。下面這條規則對任何來自本地網絡之外的流都進行報警。
alert tcp !192.168.1.0/24 any -> 192.168.1.0/24 111 (content: "|00 01 86 a5|"; msg: "external mountd access";)
這個規則的ip地址表明"任何源ip地址不是來自內部網絡而目標地址是內部網絡的tcp包"。
你也能夠指定ip地址列表,一個ip地址列表由逗號分割的ip地址和CIDR塊組成,而且要放在方括號內「[」,「]」。此時,ip列表能夠不包含空格在ip地址之間。下面是一個包含ip地址列表的規則的例子。
alert tcp ![192.168.1.0/24,10.1.1.0/24] any -> [192.168.1.0/24,10.1.1.0/24] 111 (content: "|00 01 86 a5|"; msg: "external mountd access";)
端口號
端口號能夠用幾種方法表示,包括"any"端口、靜態端口定義、範圍、以及經過否認操做符。"any"端口是一個通配符,表示任何端口。靜態端口定義表示一個單個端口號,例如111表示portmapper,23表示telnet,80表示http等等。端口範圍用範圍操做符":"表示。範圍操做符能夠有數種使用方法,以下所示:
log udp any any -> 192.168.1.0/24 1:1024
記錄來自任何端口的,目標端口範圍在1到1024的udp流
log tcp any any -> 192.168.1.0/24 :6000
記錄來自任何端口,目標端口小於等於6000的tcp流
log tcp any :1024 -> 192.168.1.0/24 500:
記錄來自任何小於等於1024的特權端口,目標端口大於等於500的tcp流
端口否認操做符用"!"表示。它能夠用於任何規則類型(除了any,這表示沒有,呵呵)。例如,因爲某個古怪的緣由你須要記錄除x windows端口之外的全部一切,你可使用相似下面的規則:
log tcp any any -> 192.168.1.0/24 !6000:6010
方向操做符
方向操做符"->"表示規則所施加的流的方向。方向操做符左邊的ip地址和端口號被認爲是流來自的源主機,方向操做符右邊的ip地址和端口信息是目標主機,還有一個雙向操做符"<>"。它告訴snort把地址/端口號對既做爲源,又做爲目標來考慮。這對於記錄/分析雙向對話很方便,例如telnet或者pop3會話。用來記錄一個telnet會話的兩側的流的範例以下:
log !192.168.1.0/24 any <> 192.168.1.0/24 23
Activate 和 dynamic 規則:
注:Activate 和 dynamic 規則將被tagging 所代替。在snort的未來版本,Activate 和 dynamic 規則將徹底被功能加強的tagging所代替。
Activate 和 dynamic 規則對給了snort更強大的能力。你如今能夠用一條規則來激活另外一條規則,當這條規則適用於一些數據包時。在一些狀況下這是很是有用的,例如你想設置一條規則:當一條規則結束後來完成記錄。Activate規則除了包含一個選擇域:activates外就和一條alert規則同樣。Dynamic規則除了包含一個不一樣的選擇域:activated_by 外就和log規則同樣,dynamic規則還包含一個count域。
Actevate規則除了相似一條alert規則外,當一個特定的網絡事件發生時還能告訴snort加載一條規則。Dynamic規則和log規則相似,但它是當一個activate規則發生後被動態加載的。把他們放在一塊兒以下圖所示:
activate tcp !$HOME_NET any -> $HOME_NET 143 (flags: PA; content: "|E8C0FFFFFF|/bin"; activates: 1; msg: "IMAP buffer overflow!";)
dynamic tcp !$HOME_NET any -> $HOME_NET 143 (activated_by: 1; count: 50;)
規則選項
規則選項組成了snort入侵檢測引擎的核心,既易用又強大還靈活。全部的snort規則選項用分號";"隔開。規則選項關鍵字和它們的參數用冒號":"分開。按照這種寫法,snort中有42個規則選項關鍵字。
msg - 在報警和包日誌中打印一個消息。
logto - 把包記錄到用戶指定的文件中而不是記錄到標準輸出。
ttl - 檢查ip頭的ttl的值。
tos 檢查IP頭中TOS字段的值。
id - 檢查ip頭的分片id值。
ipoption 查看IP選項字段的特定編碼。
fragbits 檢查IP頭的分段位。
dsize - 檢查包的淨荷尺寸的值 。
flags -檢查tcp flags的值。
seq - 檢查tcp順序號的值。
ack - 檢查tcp應答(acknowledgement)的值。
window 測試TCP窗口域的特殊值。
itype - 檢查icmp type的值。
icode - 檢查icmp code的值。
icmp_id - 檢查ICMP ECHO ID的值。
icmp_seq - 檢查ICMP ECHO 順序號的值。
content - 在包的淨荷中搜索指定的樣式。
content-list 在數據包載荷中搜索一個模式集合。
offset - content選項的修飾符,設定開始搜索的位置 。
depth - content選項的修飾符,設定搜索的最大深度。
nocase - 指定對content字符串大小寫不敏感。
session - 記錄指定會話的應用層信息的內容。
rpc - 監視特定應用/進程調用的RPC服務。
resp - 主動反應(切斷鏈接等)。
react - 響應動做(阻塞web站點)。
reference - 外部攻擊參考ids。
sid - snort規則id。
rev - 規則版本號。
classtype - 規則類別標識。
priority - 規則優先級標識號。
uricontent - 在數據包的URI部分搜索一個內容。
tag - 規則的高級記錄行爲。
ip_proto - IP頭的協議字段值。
sameip - 斷定源IP和目的IP是否相等。
stateless - 忽略劉狀態的有效性。
regex - 通配符模式匹配。
distance - 強迫關係模式匹配所跳過的距離。
within - 強迫關係模式匹配所在的範圍。
byte_test - 數字模式匹配。
byte_jump - 數字模式測試和偏移量調整。
msg
msg規則選項告訴記錄和報警引擎,記錄或報警一個包的內容的同時打印的消息。它是一個簡單的文本字符串,轉義符是""。mysql