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:  

注意在该行结尾处没有分号。被包含的文件会把任何预先定义的变量值替换为自己的变量引用。参见变量(Variables)一节以获取关于在SNORT规则文件中定义和使用变量的更多信息。  

Variables   :  

变量可能在snort中定义。  

格式:  

var:  

例子:  

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   [:   ]  

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   Ci   )。例如: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.  

1、Alert-使用选择的报警方法生成一个警报,然后记录(log)这个包。  
2、Log-记录这个包。  
3、Pass-丢弃(忽略)这个包。  
4、activate-报警并且激活另一条dynamic规则。  
5、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