基础:
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