概述
snrot使用一种简单的轻量级的规则描述语言来描述它的规则配置信息,它灵活而强大。在版本1.8之前snort规则必须写在一个单行上,在现在的版本里可以用‘\’来进行折行。
Snort规则被分成两个逻辑部分:规则头和规则选项。规则头包含规则的动作,协议,源和目标ip地址与网络掩码,以及源和目标端口信息;规则选项部分包含报警消息内容和要检查的包的具体部分。下面是一个规则范例:
alert tcp any any -> 192.168.1.0/24 111 (content:"|00 01 86 a5|"; msg: "mountd access";)
例1
括号前的部分是规则头,括号内的部分是规则选项。规则选项部分中冒号前的单词称为选项关键字。注意:不是所有规则都必须包含规则选项部分,选项部分只是为了使对要收集或报警,或丢弃的包的定义更加严格。组成一个规则的所有元素对于指定的要采取的行动都必须是真的。当多个元素放在一起时,可以认为它们组成了一个逻辑与(AND)语句。同时,snort规则库文件中的不同规则可以认为组成了一个大的逻辑或(OR)语句。
我们先分别讨论规则头和选项部分。
规则头部分:
规则动作:
规则的头包含了定义一个包的who,where和what信息,以及当满足规则定义的所有属性的包出现时要采取的行动。规则的第一项是"规则动作""规则动作"告诉snort在发现满足规则标准的包时要干什么。在snort中有五种动作:alert,log和pass,activate和 dynamic。
1. Alert-使用选择的报警方法生成一个警报,然后记录(log)这个包
2. Log-记录这个包
3. Pass-丢弃(忽略)这个包
4. 报警然后打开另外一个dynamic规则
5. 等待一个activate来激活,在被激活后,向log规则一样记录数据包
协议:
规则的下一部分是协议。Snort当前分析可疑包的ip协议有三种:tcp ,udp和icmp。将来可能会更多,例如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地址被设置为任何连接的计算机,而目标地址被设置为192.168.1.0上的c类网络。
有一个操作符可以应用在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";)
例2
这个规则的ip地址代表“任何源ip地址不是来自内部网络而目标地址是内部网络的tcp包”
端口号:
端口号可以用几种方法表示,包括"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流
例3:端口范围
端口否定操作符用“!”表示。它可以用于任何规则类型(除了any)。例如,由于某个古怪的原因你需要记录除x windows端口以外的所有一切,你可以使用
如下的规则:
log tcp any any -> 192.168.1.0/24 !6000:6010
例4:端口否定操作符范例
方向操作符:
方向操作符“->”表示规则所施加的流的方向。方向操作符左边的ip地址和端口号被认为是流来自的源主机,方向操作符右边的ip地址和端口信息是目标主机,还有一个双向操作符“<>”。它告诉snort把地址/端口号对既作为源,又作为目标来考虑。这对于记录/分析双向对话很方便,例如telnet或者pop3会话。用来记录一个telnet会话的两侧的流的范例如下:
log !192.168.1.0/24 any <> 192.168.1.0/24 23
例5:方向操作符示例
activate/dynamic规则 :
activate/dynamic规则对扩展了snort功能。使用activate/dynamic规则对,你能够使用一条规则激活另一条规则。当一条特定的规则启动,如果你想要snort接着对符合条件的数据包进行记录时,使用activate/dynamic规则对非常方便。除了一个必需的选项activates外,激活规则(activate rule)非常类似于报警规则(alert rule)。动态规则(dynamic rule)和日志规则(log rule)也很相似,不过它需要一个选项:activated_by。动态规则还需要另一个选项:count。当一个激活规则启动,它就打开由activate/activated_by选项之后的数字指示的动态规则,记录count个数据包。
下面是一条activate/dynamic规则对的规则:
activate tcp !$HOME_NET any -> $HOME_NET 143 (flags:PA;content:"|E8C0FFFFFF| in|;activates:1;<msg:"IMAP buffer overflow!";)
例6
这个规则使snort在检测到IMAP缓冲区溢出时发出报警,并且记录后续的50个从$HOME_NET之外,发往$HOME_NET的143号端口的数据 包。如果缓冲区溢出成功,那么接下来50个发送到这个网络同一个服务端口(这个例子中是143号端口)的数据包中,会有很重要的数据,这些数据对以后的分析很有用处。
下面介绍规则选项部分:
规则选项部分:
规则选项组成了snort入侵检测引擎的核心,既易用又强大还灵活。所有的snort规则选项用分号“;”隔开。规则选项关键字和它们的参数用冒号“:”分开。按照这种写法,snort中有一下一些规则选项关键字。
1、 msg - 在报警和包日志中打印一个消息
2、 logto - 把包记录到用户指定的文件中而不是记录到标准输出
3、 ttl - 检查ip头的ttl的值
4、 tos- 检查ip头的tos域的值
5、 id - 检查ip头的分片id值
6、 ipoption- 检查ip头的option域
7、 fragbits- 检查ip头的分片标志位
8、 dsize - 检查包的数据部分大小
9、 content - 在包的数据部分中搜索指定的样式
10、 offset - content选项的修饰符,设定开始搜索的位置
11、 depth - content选项的修饰符,设定搜索的最大深度
12、 nocase - 指定对content字符串大小写不敏感
13、 content-list – 在数据包中搜索多种可能匹配
14、 flags -检查tcp flags的值
15、 seq - 检查tcp顺序号的值
16、 ack - 检查tcp应答(acknowledgement)的值
17、 itype - 检查icmp type的值
18、 icode - 检查icmp code的值
19、 session - 记录指定会话的应用层信息的内容
20、 icmp_id - 检查ICMP ECHO ID的值
21、 icmp_seq - 检查ICMP ECHO 顺序号的值
22、 ipoption - 监视IP option的特定代码
23、 rpc - 监视特定应用/进程调用的RPC服务
24、 resp - 主动反应(切断连接等)
25、 reference- 外部参考id
26、 sid- snort的规则id
27、 rev- 规则的修正号
28、 classtype- 规则的分类号
29、 priority- 规则的优先级
30、 uricontent- 在数据包的URI部分搜索指定的匹配
31、 tag- 高级记录动作
32、 ip_proto- ip头的协议值
33、 sameip- 源地址和目标地址相同
34、 stateless- 无状态连接
35、 regex- 通配符模式匹配
msg:
msg规则选项告诉记录和报警引擎记录或报警一个包的内容的同时打印的消息。它是一个简单的文本字符串,转义符是“\”。
格式:msg:“<text>”;
logto:
logto选项告诉snort把触发该规则的所有的包记录到一个指定的输出日志文件中。这在把来自诸如nmap活动,http cgi扫描等等的数据组合到一起时很方便。需要指出的是当snort工作在二进制记录模式下时这个选项不起作用。
格式:logto: “<filename>”;
ttl:
这个规则选项用于指定一个要检查的存活期的值。只有确切地匹配时它所进行的检查才成功。这个选项关键字用于检测traceroute。
格式:ttl: “<number>”;
tos:
这个规则选项用于指定要检查指定的tos值。只有确切地匹配时它所进行的检查才成功。
格式:tos:“<number>”
id:
这个选项关键字用于检测ip头的分片id的值。有些黑客工具(以及别的程序)为了各种目的设置这个域的值,例如一些黑客常使用31337。用一个简单的规则检查这个值就可以对付他们。
格式:id:“<number>”;
ipoption:
如果ip数据包中包含选项域的话,系统将检查选项中指定的参数,有效的参数有:
rr-路由记录
eol -列表结束
nop- 无操作(end of list)
ts - 时间戳
sec- ip安全选项
lsrr- 宽松源路由
ssrr- 严格源路由
satid- 流标识
格式:ipopts:<option>;
fragbits:
使用这个规则选项可以观察IP包头的分片位和保留位。它们在IP包头的标识域,共有3位,分别是:保留为(reserved bit,RB)、还有分组片位(more fragments,MF)、不可分片(dont fragment,DF)。这些位可以以各种方式组合检查,使用下面的值指定:
R:保留位
D:DF位
M:MF位
你也可以使用修饰符号对特定的位进行逻辑组合:
+--ALL标志,指定的位加上任何其它的位为真
*--ANY标志,指定的任何位为真
!--NOT标志,指定的位不为真
格式: fragbits: <bit values>;
alert tcp !$HOME_NET any -> $HOME_NET any (fragbits:R+;msg:"Reserverd IP bit set!";)
例7
dsize:
选项用于检查包的数据区的大小。它可以设置成任意值,可以使用大于/小于符号来指定范围。例如,如果你知道某个特定的服务有一个特定大小的缓冲区,你可以设定这个选项来监视缓冲区溢出的企图。它在检查缓冲区溢出时比检查数据区内容的方法要快得多。
格式:dsize: [>|<] (><号是可选的)。
content:
content关键字是snort中比较重要的一个。它允许用户设置规则在包的数据区中搜索指定的内容并根据数据触发响应。当进行content选项模式匹配时,Boyer-Moore模式匹配函数被调用,并且对包的内容进行检查(很花费计算能力)。如果包的数据区中包含的数据确切地匹配了参数的数据,这个检查成功,该规则选项检查的其他部分被执行。注意这个检查是大小写敏感的。Content关键字的选项数据比较复杂;它可以包含混合的文本和二进制数据。二进制数据一般包含在管道符号中(“|”),表示为字节码(bytecode)。字节码把二进制数据表示为16进制数字,是描述复杂二进制数据的好方法。content选项也可以使用“!”符号来标识。下面的例子中包含了一个混合数据的snort规则:
alert tcp any any -> 192.168.1.0/24 143 (content: "|90C8 C0FF FFFF|/bin/sh";
msg: "IMAP buffer overflow!";)
例8
格式:content: “<匹配串>”;
offset:
offset规则选项被用作使用content规则选项关键字的规则的修饰符。这个关键字修饰符指定模式匹配函数从数据包开始处开始搜索的偏移量。它对于cgi扫描检测规则很有用,cgi扫描的内容搜索字符串不会在数据区的前4个字节中出现。小心不要把这个偏移量设置的太严格了,会有可能漏掉攻击!这个规则选项关键字必须和content规则选项一切使用。
格式:offset:<number>;
depth:
depth也是一个content规则选项修饰符。它设置了内容模式匹配函数从他搜索的区域的其始位置搜索的最大深度。它对于限制模式匹配函数超出搜索域指定范围而造成无效搜索很有用。(也就是说,如果你在一个web包中搜索"cgi-bin/phf",你可能不需要浪费时间搜索超过数据区的头20个字节)组合content,offset,和depth的搜索规则的范例参看例八:
格式:depth:<number> ;
alert tcp any any -> 192.168.1.0/24 80 (content: "cgi-bin/phf"; offset: 3;
depth: 22; msg: "CGI-PHF access";)
例9
nocase:
nocase选项用于取消content规则中的大小写敏感性。它在规则中指定后,任何与包数据区进行比较的ascii字符都被即作为大写又作为小写对待。
格式:nocase;
alert tcp any any -> 192.168.1.0/24 21 (content: "USER root"; nocase; msg:
"FTP root user access attempt";)
例10
content-list:
使用content-list关键词可以指定更多的正文字符串,突破了content规则选项只能指定单一字符串的限制。表18是一个conternt-list文件。每个要搜索的字符串占一行。这个规则选项是使用react关键词的基础。
#adult sites
porn
adults
hard core
www.pornsite.com
# ...
content-list文件
格式: content-list:"<file_name>";
flags:
这个规则检查tcp标志。在snort中有8个标志变量:
1、 F - FIN (LSB in TCP Flags byte)
2、 S - SYN
3、 R - RST
4、 P - PSH
5、 A - ACK
6、 U - URG
7、 2 - Reserved bit 2
8、 1 - Reserved bit 1 (MSB in TCP Flags byte)
9、 0-没有tcp标志被设置
保留位可以用于检测不正常的行为,例如ip栈探测或者其他可疑活动。对于这个检查所有指定的flags都被处理,这个规则要成功,它们必须都是up的。例如,例十显示了一个syn-fin扫描检测规则。
格式中也可以使用逻辑操作符对指定的标志位进行操作:
+:ALL,指定的标志位和其它任意的标志位为真
*:ANY,指定的标志位中任意的标志位为真
!:NOT,除了指定标志位外,任意的标志位为真
格式: flags: ;
alert any any -> 192.168.1.0/24 any (flags: SF; msg: "Possible SYN FIN scan";)
例11-tcp flags指定范例
seq:
这个规则选项引用tcp顺序号(sequence number)。基本上,它探测一个包是否有一个静态的顺序号集,因此很少用。它是为了完整性而包含进来的。
格式:seq:<number> ;
ack:
ack规则选项关键字引用tcp头的确认(acknowledge)部分。这个规则的一个实用的目的是:检查nmap tcp ping,nmap tcp ping把这个域设置为0,然后发送一个tcp ack flag置位的包来确定一个网络主机是否活着。这个规则探测到这种活动,如例11:
格式:ack:<number> ;
alert any any -> 192.168.1.0/24 any (flags: A; ack: 0; msg: "NMAP TCP ping";)
例12-tcp ack域的用法
Itype :
这条规则测试ICMP的type字段的值。它被设置为使用这个字段的数字值。要得到所有可能取值的列表,可以参见Snort包中自带的decode.h文件,任何ICMP的参考资料中也可以得到。应该注意的是,type字段的取值可以超过正常范围,这样可以检查用于拒绝服务或flooding攻击的非法type值的ICMP包。
格式:itype: ;
Icode :
Icode规则选项关键字和itype规则非常接近,在这里指定一个数值,Snort会探测使用该值作为code值的ICMP包。超出正常范围的数值可用于探测可疑的流量。
格式:icode: ;
Session:
Session关键字是1.3.1.1版本之后新引入的,用于从TCP会话中抽取用户数据。要检查用户在telnet,rlogin,ftp或web sessions中的用户输入,这个规则选项特别有用。Session规则选项有两个可用的关键字作为参数:printableall。Printable关键字仅仅打印用户可以理解或者可以键入的数据。All关键字使用16进制值来表示不可打印的字符。该功能会显著地降低Snort的性能,所以不能用于重载环境。它适合于对二进制(tcpdump格式)log文件进行后处理。
格式:session: [printable|all];
Icmp_id :
Icmp_id选项检查ICMP ECHO数据包中ICMP ID数值是否是指定值。许多秘密通道(covert channel)程序使用静态ICMP字段通讯,所以该选项在检查这种流量时非常有用。这个特别的插件用于增强由Max Vision编写的stacheldraht探测规则,但是在探测一些潜在攻击时确实有效。
格式:icmp_id: ;
Icmp_seq :
Icmp_seq选项检查ICMP ECHO数据包中ICMP sequence字段数值是否是指定值。许多秘密通道(covert channel)程序使用静态ICMP字段通讯,所以该选项在检查这种流量时非常有用。这个特别的插件用于增强由Max
Vision编写的stacheldraht探测规则,但是在探测一些潜在攻击时确实有效。
格式:icmp_seq: ;
Ipoption:
如果数据包中使用了IP选项,Ipoption选项会查找使用中的某个特别IP选项,比如源路由。这个选项的合法参数如下:
rr - Record route(记录路由)
eol - End of list (列表结尾)
nop - No op (无所作为)
ts - Time Stamp (时间戳)
sec - IP security option (IP安全选项)
lsrr - Loose source routing (松散源路由)
ssrr - Strict source routing (严格源路由)
satid - Stream identifier (流标示符)
松散和严格源路由是IP选项中最经常被检查的内容,但是它们并没有被用在任何广泛使用
的Internet应用中。每一个特定的规则只能用这个选项一次。
格式:ipoption: ;
Rpc:
这个选项查看RPC请求,并自动将应用(Application),过程(procedure)和程序版本(program version)译码,如果所有三个值都匹配的话,该规则就显示成功。这个选项的格式为"应用,过程,版本"。在过程和版本域中可以使用通配符"*"。
格式:rpc:<number,[number|*],[number|*]>;
alert tcp any any -> 192.168.1.0/24 111 (rpc: 100000,*,3; msg:"RPC getport
(TCP)";)
alert udp any any -> 192.168.1.0/24 111 (rpc: 100000,*,3; msg:"RPC getport
(UDP)";)
alert udp any any -> 192.168.1.0/24 111 (rpc: 100083,*,*; msg:"RPC ttdb";)
alert udp any any -> 192.168.1.0/24 111 (rpc: 100232,10,*; msg:"RPC sadmin";)
例13-多种RPC调用告警
Resp :
Resp关键字可以对匹配一条Snort规则的流量进行灵活的反应(flexible reponse -FlexResp)。FlexResp代码允许Snort主动地关闭恶意的连接。该模块合法的参数如下:
rst_snd - 向发送方发送TCP-RST数据包
rst_rcv - 向接受方发送TCP-RST数据包
rst_all - 向收发双方发送TCP_RST数据包
icmp_net - 向发送方发送ICMP_NET_UNREACH
icmp_host - 向发送方发送ICMP_HOST_UNREACH
icmp_port - 向发送方发送ICMP_PORT_UNREACH
icmp_all - 向发送方发送上述所有的ICMP数据包
在向目标主机发送多种会应数据包时,这些选项组合使用。多个参数之间使用逗号分隔。
格式:resp:<resp_modifier[,resp_modifier…]> ;
alert tcp any any -> 192.168.1.0/24 1524 (flags: S; resp: rst_all; msg: "Root
shell backdoor attempt";)
alert udp any any -> 192.168.1.0/24 31 (resp: icmp_port,icmp_host; msg:
"Hacker's Paradise access attempt";)
例14 - FlexResp使用示例
react :
react关键词是基于FlexResp(flexible response)的,它使snort对匹配某个规则的数据包作出反应。基本的反应就是阻塞用户要访问的站点,例如色情站点。snort的FlexResp插件能够主动关闭恶意连接,如果连接使用的是http或者代理服务器端口,FlexResp插件就会向浏览器发出一条HTML/javascript警告信息。这个规则选项可以使用下面几个参数:
block:关闭连接并发出注意信息
warn:发出警告信息
这两个参数是基本参数,它们可以和下面的可选参数组合使用:
msg:定义要包含在警告信息中的文本
proxy:<number>:使用代理服务器端口发送警告信息
可选参数使用逗号分开,react关键词应该放在选项的最后。例如:
alert tcp any any <> 192.168.1.0/24 80 (content-list:"adults";msg:"Not for children!";react:block,msg;)
alert tcp any any <> 192.168.1.0/24 any (content-list:"adults";msg:"Adults list access attempt";react:block;)
例15 react规则
格式:
react:<react_basic_modifier[,react_additionall_modifier...]>;
reference:
这个选项允许,规则包含外部的攻击标识系统,当前支持以下几种类型:
系统标识 URL
Bugtraq http://www.securityfocus.com/bid/
CVE http://cve.mitre.org/cgi-bin/cvename.cgi?name=
Arachnids (currently down) http://www.whitehats.com/info/IDS
McAfee http://vil.nai.com/vil/dispVirus.asp?virus_k=
url http://
格式:reference:<系统标识>,<id>;
sid:
这个选项用来唯一标识snort规则,sid的范围有如下的设定:
<100 当前保留
100—1,000,000 snort 使用
>1,000,000 用户可自由使用
格式:sid:<snort 规则 id>
classtype:
这个选项对攻击行为进行归类,归类可以和优先级一起使用,使某种类型的攻击行为可得到优先的处理。
格式:classtype:<类型名>
priority:
这个选项用来限定指定规则的优先级。
格式:priority:<priority integer>
uricontent:
这个选项使只在请求数据包的URI部分搜索指定的模式串。
格式:uricontent:[!]“<模式串>”
tag:
这个选项使系统不仅记录触发规则的数据包,还将记录触发规则的数据包源地址所发送的数据包。
格式: tag:<类型>,<数量>,<间隔>,<方向>
其中类型包括:
session:记录触发这个规则的回话中所有数据包
host:记录触发这个规则的源地址的所有数据包
数量是指//////////////////////////
ip_proto:
这个选项检查ip头的协议域。
格式: ip_proto:[!]<name or number>
same ip:
这个选项检查源地址和目标地址是否相同
格式: sameip;
fragoffset:
这个选项检查ip头的分片选项匹配某个特定的数值
格式: fragoffset:[<|>] <number>
预处理器(preprocessors)
预处理器综述 :
从snort-1.5开始加入了对预处理器的支持。有了这种支持,用户和程序员能够比较容易地编写模块化的插件,扩展snort的功能。预处理器在调用检测引擎之前,在数据包被解码之后运行。通过这种机制,snort可以以一种out of band的方式对数据包进行修改或者分析。
预处理器可以使用preprocessor关键词来加载和配置,格式如下:
preprocessor <name>: <options>
例如: preprocessor minfrag: 128
可用的预处理器模块 :
minfrag :
这个预处理器测试分片包的大小是否为一个特定的值。数据包分片,通常是源/目的地址之间的路由器完成的。一般来说,商业网络设备产生的分片不会小于512个字节,基于这种情况,我们可以对很小的分片进行监视,很小的分片包一般是人为产生的,主要为了使用很小的碎片隐藏数据。
格式: minfreg:<大小阀值)
HTTP decode预处理插件 :
HTTP解码预处理模块用来处理HTTP URI字符串,把它们转换为清晰的ASCII字符串。这样就可以对抗evasice web URL扫描程序和能够避开字符串内容分析的恶意攻击者。这个预处理模块使用WEB端口号作为其参数,每个端口号使用空格分开。
格式: http_decode:<端口号列表>
例如:
preprocessor http_decode: 80 8080
端口扫描检测模块 :
snort端口扫描检测预处理模块是Patrick Mullen开发的,从他的个人主页可以得到更多信息。
snort端口扫描检测预处理模块主要做如下工作:
1).把由单个源IP地址发起的端口扫描从开始到结束的全过程记录到标准日志设备。
2).如果指定了一个日志文件,就把被扫描的IP地址和端口号和扫描类型都记录到这个日志文件。
这个模块使用的参数包括:
1).监视的网络: 以IP地址/子网掩码的格式指定要进行端口扫描监视的网络。
2).端口数: 在检测周期(detection period)内访问的端口数目。
3).检测周期(detection period): 达到某个设定的端口访问量需要的时间,以秒计。
4).日志目录/文件: 保存警告信息的目录/文件。警告信息也可以写到默认警告文件中。
格式:
portscan:<要监视的网络> <端口数> <检测周期> <日志目录/文件>
preprocessor portscan:192.168.1.0/24 5 7 /var/log/portscan.log
portscan ignorehosts
Patrick Mullen对端口扫描检测系统进行了改进,形成了另一个模块--portscan ignorehosts。有些服务器程序容易和端口扫描检测模块造成冲突,例如NTP、NFS和DNS, 如果你运行这些服务器程序,可以告诉端口扫描检测模块忽略对由特定主机发起的TCP SYN和UDP端口扫描的检测。这个模块使用的参数是一个要忽略的IP地址/CIDR的列表。
格式: portscan-ignorehosts:<主机列表>
preprocessor portscan-ignorehosts:192.168.1.5/32 192.168.3.0/24
frag2模块 :
它使snort能够消除IP碎片包,给黑客使用IP碎片包绕过系统的检测增加了难度。
格式: preprocessor frag2: [memcap <xxx>], [timeout <xx>], [min_ttl <xx>],
[detect_state_problems], [ttl_limit <xx>]
timeout <秒数>
在状态表中保留一个不活动流的秒数。缺省为30秒。
memcap<字节数>
设定memory cap字节数
detect_state_problems
如果分组过大则报警
min_ttl
设定frag2接受的最小ttl值
ttl_limit
stream4模块 :
stream4插件为snort提供了TCP数据包重组的功能。在配置的端口上,stream4插件能够对TCP数据包的细小片段进行重组成为完整的TCP数据包,然后snort可以对其可疑行为进行检查。这个插件有好多参数:
noinspect:禁止检测
keepstats:将会话的概要信息记录到日志目录下的“session.log”文件中
超时(timeout): 在一个TCP数据包送达之前,保存一个TCP数据流缓冲的最长时间。
端口(port): 要监视的服务器端口。我们不想监视所有的TCP端口,这也不太现实。
最大字节数(maxbytes): 重组包的最大长度。
memcap<bytes>:设定memory cat的字节数
detect_scans:打开端口扫描监测
detect_state_problems:检测不正常的流数据包
disable_evasion_alerts:禁止tcp重传报警
min_ttl:设定重组接受的最小ttl
格式: stream4:timeout <timeout>,ports <ports>,maxbytes <maxbytes>
TCP数据包重组插件配置
spade:the Statisical Packet Anomaly Dection Engine
如果需要了解更多关于spade的信息,请参考snort源代码中的README.Spake文件,或者http://www.silicondefense.com/spice/。
使用这个模块使snort能够在你的网络上进行统计异常检测(statistical anomaly dection),这是一个全新的检测引擎。如果你对此感兴趣,请参考源代码中的有关文档和SiliconDefense站点的有关文档。
输出模块:
输出模块综述:
snort输出模块是从1.6版加入的新特征,使snort的输出更为灵活。snort调用其报警或者日志子系统时,就会调用指定的输出模块。设置输出模块的规则和设置预处理模块的非常相似。
在snort配置文件中可以指定多个输出插件。如果对同一种类型(报警、日志)指定了几个输出插件,那么当事件发生时,snort就会顺序调用这些插件。使用标准日志和报警系统,默认情况下,输出模块就会将数据发送到/var/log/snort目录,或者用户使用-l命令行开关指定的目录。在规则文件中,输出模块使用output关键词指定:
格式: output name:<选项>
output alert_syslog: LOG_AUTH LOG_ALERT
可用的输出模块 :
alert_syslog :
使用这个输出模块,snort把报警信息发送到syslog,与-s命令行开关非常类似。这个输出模块允许用户在规则文件中指定logging facility和优先级,给用户以更大的灵活性。
有效的关键词:
1).选项:
LOG_CONS
LOG_NDELAY
LOG_PERROR
LOG_PID
2).facility
LOG_AUTH
LOG_AUTHPRIV
LOG_DAEMON
LOG_LOCAL0
LOG_LOCAL1
LOG_LOCAL3
LOG_LOCAL4
LOG_LOCAL5
LOG_LOCAL6
LOG_LOCAL7
LOG_USER
3).优先级
LOG_EMERG
LOG_ALERT
LOG_ERR
LOG_WARNING
LOG_NOTICE
LOG_INFO
LOG_DEBUG
格式: alert_syslog:<facility> <优先级> <选项>
alert_fast :
使用快速单行格式(quick on line format)把snort报警信息输出到指定的输出文件。这种报警方式比完全(full)报警模式速度快,因为使用这种报警模式不需要把全部的数据包头都输出到指定的文件。
格式: alert_fast: <输出文件>
alert_full:
把全部的数据包头都输出到snort报警信息。这种报警机制一般较满,因为程序需要对整个数据包进行分析。报警信息可以输出到默认的日志目录/var/log/snort,也可以使用命令行指定日志目录。
格式: alert_full:<输出文件>
alert_smb :
snort使用这个插件把WinPopup报警信息输出到由NETBIOS命名的主机,主机名由参数指定的文件给出。注意我们不鼓励使用这种报警方式,因为samba客户程序smbclient以root权限运行。接收报警信息工作站的名字列表由保存在一个文件中,每行是一台主机的NETBIOS名字。
格式: alert_smb:<文件>
alert_unixsock :
设置一个UNIX域套接字(UNIX domain socket),把报警信息发送到这个套接字。外部程序/进程可以在这个套接字上监听,实时接收snort报警信息和数据包数据。这个接口目前尚处于实验状态。
格式: alert_unixsock
log_tcpdump :
log_tcpdump输出模块使用tcpdump格式的文件记录数据包日志。这种日志文件格式便于使用很多外部的工具对数据进行分析,只要这些工具软件支持tcpdump格式的文件。这个模块只有一个参数,就是输出文件的名字。
格式: log_tcpdump:<输出文件名>
示例: output log_tcpdump:snort.log
数据库输出模块 :
snort的数据库输出模块是JedPickel开发的,用来将snort产生的数据送到各种SQL数据库系统。如果要获得安装和配置这个模块更为详尽的信息,可以参考ncident.org web page。这个插件使用的参数是记录snort日志的数据库名和参数表。参数表使用这种格式:parameter=argument。有如下参数可以使用:
1).host: 数据库所在的主机。如果指定了一个非零字符串,snort就使用TCP/IP协议连接以此命名的主机。如果没有主机名,snort就使用一个本地UNIX-domain套接字连接本地主机。
2).port: 数据库所在服务器的端口号,或者一个UNIX-domain套接字文件。
3).dbname: 数据库名字。
4).user: 数据库用户名。
5).passwd: 密码。
6).sensor_name: 指定这个snort触发器的名字,如果没有指定就自动产生。
7).encoding: 因为数据包的负载和选项都是二进制数据,所以没有一种简单和可移植的方式将snort的数据保存在数据库。所以在snort数据库输出插件中提供了一些选项,让你自己决定使用那种编码。下面是这几种编码的优点和缺点:
hex: 默认编码选项,使用16进制字符串代表二进制数据。
存储空间: 两倍于二进制数据
搜索性: 极好
可读性: 极差
base64: 使用base64字符串代表二进制数据。
存储空间: 大约是直接存储二进制数据的1.3倍
搜索性: 可能无须后续处理。
可读性: 不可读需要后续处理。
ascii:: 使用ASCII字符串代替二进制数据。非ASCII字符使用.
代替。如果你选择这个选项,那么IP和TCP包头的选项会仍然使用hex
表示。
存储空间: 比直接存储二进制数据稍大。
搜索性: 非常便于二进制数据中搜索文本字符串。
可读性: 很好。
8).detail: 设置你要保存多少细节数据,有如下选项:
full: 保存引起报警的数据包的所有细节,包括IP/TCP包头和负载数据。
fast: 只记录少量的数据。如果选择这种记录方式,不利于以后对
数据的分析,但在某些情况下还有其用处。使用这种方式,将记录数据包的
以下域:时间戳(timestamp)、签名(signature)、源地址、目的地址、
源端口、目的端口、TCP标志和协议。
还需要定义日志方法和数据库类型。有两种日志方法:log和alert。如果使用log,snort就会调用log输出,将日志数据记录到数据库;如果设置为alert,snort就会调用alert输出,在数据库中记录报警信息。
当前版本中,snort可以使用四种数据库:MySQL、PostgreSQL、Oracle以及和unixODBC兼容的数据库。可以使用你喜欢的数据库。
格式: database:<log|alert>,<数据库类型>,<参数表>
示例:output database:log,mysql,dbname=snort user=snort host=localhost password=xyz
如何建立好的snort规则
在开发高效、高速的snort规则时,有几个概念要铭记于心。
1.关键词content指定的内容是大小写敏感的,除非你使用nocase选项
不要忘记content规则选项指定的内容是大小写敏感的,许多程序一般使用大写表示命令。FTP就是一个很好的例子。请比较下面两条规则:
alert tcp any any -> 192.168.1.0/24 21 (content:"user root";msg:"FTP root login";)
alert tcp any any -> 192.168.1.0/24 21 (content:"USER root";msg:"FTP root login";)
第二条规则可以使snort捕获大多数使用root用户名的自动登录企图,而在数据包中从来就没有小写的user。
2.提高snort对含有content规则选项的规则的检测速度
snort检测引擎对各个规则选项的测试顺序与其在各条规则中所处的位置无关。在各个规则选项中,检测引擎最后测试的总是content规则选项。因此,在开发规则时,要尽量使用快速的选项筛选掉根本不必对其内容进行检查的包。例如,如果实现了一个TCP会话过程,那么在会话过程的大部分时间内,双方传输的数据包的TCP标志ACK、PSH都被置位。而测试包头的TCP标志比对数据包的内容进行模式匹配需要的计算量要小的多。所以,在开发相关的检测规则时,需要设置flags规则选项对PSH和ACK没有置位的数据包进行过滤。而这样做,增加的额外计算量微乎其微。例如:
alert tcp any any -> 192.168.1.0/24 80 (content:"cgi-bin/phf";flags:PA;msg:"CGI-PHF probe";)
参考文件:http:// www.snort.org/docs/writing_rules/index.htm