经过前面的安装和配置之后,snort现以可以以IDS模式运行并执行入侵检测工作。但是检测的成效大多依赖于下载的规则库,而细心的我发现,下载的规则库虽然有200+M,但是仍有相当多的空文档。
除此之外还有DOS,DDOS,backdoor,dns,ftp,icmp等文件为空,不禁让我怀疑其规则库的可信赖性,当然其作为一个开源免费的模型,我们又能更多地要求他什么呢。所以指定符合本机机情的检测规则是当务之急。
规则编写
虽然理论上来说更改任意一个文件夹内的规则都可以达到目的,但是为了便于管理和查找,自定的规则还是写入/rules文件内的local.rules文件内,直接双击打开即可编写。
本次规则如下:
alert icmp any any -> $HOME_NET any (msg:"ICMP incmoing!!";classtype:not-suspicious;sid:1000001;rev:1;)
任意IP来源,任意端口的ICMP报文发送到本机的任意端口时,发出警报ICMP incoming!!
测试
sudo snort -de -l logs/ -c etc/snort.conf
以IDS模式打开snort
任意主机ping装有snort的主机
snort不显示任何内容,ping结束后退出即可
进入snort安装目录下的logs文件夹,可以看到生成了alert文件,内容记录如下:
编写规范
规则头
规则头包含一些信息,这些信息包括:哪些数据包、数据包的来源、什么类型的数据包,以及对匹配的数据包如何处理。每条规则的第一项就是规则行为(rule action)。规则行为告诉snort当发现匹配的数据包时,应该如何处理。在snort中,有五种默认的处理方式:alert、log、pass、activate和dynamic。
1).alert:使用选定的报警方法产生报警信息,并且记录数据包
2).log:记录数据包
3).pass:忽略数据包
4).activate:报警,接着打开其它的dynamic规则
5).dynamic:保持空闲状态,直到被activete规则激活,作为一条log规则
你也可以定义自己的规则类型,把它们和一个或者几个输出插件联系在一起。然后你就可以在snort规则中使用这些规则类型了。
详见参考连接规则编写规范
协议
每条规则的第二项就是协议项。当前,snort能够分析的协议是:TCP、UDP和ICMP。将来,可能提供对ARP、ICRP、GRE、OSPF、RIP、IPX等协议的支持。
IP地址
规则头下面的部分就是IP地址和端口信息。关键词any可以用来定义任意的IP地址。snort不支持对主机名的解析。所以地址只能使用数字/CIDR的形式。/24表示一个C类网络;/16表示一个B类网络;而/32表示一台特定的主机地址。例如:192.168.1.0/24表示从192.168.1.1到192.168.1.255的地址。
在规则中,可以使用使用否定操作符(negation operator)对IP地址进行操作。它告诉snort除了列出的IP地址外,匹配所有的IP地址。否定操作符使用!表示。例如,使用否定操作符可以很轻松地对表1的规则进行改写,使其对从外部网络向内的数据报警。
alert tcp !192.168.1.0/24 any -> 192.168.1.0/24 111(content:"|00 01 86 a5|";msg:“external mountd access”
端口号
在规则中,可以有几种方式来指定端口号,包括:any、静态端口号(static port)定义、端口范围,以及使用非操作定义。any表示任意合法的端口号;静态端口号表示单个的端口号,例如:111(portmapper)、23(telnet)、80(http)等。使用范围操作符:可以指定端口号范围。有几种方式来使用范围操作符:达到不同的目的,例如:
log udp any any -> 192.168.1.0/24 1:1024
记录来自任何端口,其目的端口号在1到1024之间的UDP数据包
总结
本文介绍了snort规则编写的方法,并进行了测试。
但目前该入侵检测系统只能针对已有规则下的攻击进行检测,且被攻击也只是在文档中记录,并不能及时有效地警示管理员,后续功能需要我们自行编写,比如将更新的警报发送到管理员邮箱等方法,而要想实现入侵防御的功能更是还需要主动防御或其他安全模块。