

你新安装的Snort系统是不是在运行过程中很少告警?无论你是刚开始使用Snort系统还是你在一个新的平台上配置了Snort系统——一个很少有告警的系统总是让人担心。可能是Snort系统的告警条件设置严密(或者过于严密),或者你的入侵检测系统所在的网络段没有受到太多的网络攻击。幸好,有几个方法可以通过网络线路测试Snort系统是否在网络环境中正常运行。
首先,你可以通过命令行将Snort设置为嗅探模式(sniffer mode),该模式可以检查网卡是否工作正常、扩展端口是否打开、Snort系统是否在监视网络流量。如果你的系统中使用了多个网络接口卡(NIC),那你需要告诉Snort应该监视那一个。你可以在Linux/Unix系统中使用“ifconfig”命令或者在Windows系统中使用“snort -W”命令来查看网络接口卡的名称。然后使用“snort –vi(接口卡名称)”命令指定需要监视的网络接口卡。例如:在Linux系统中你可以使用命令“snort –vi eth1”或者在Windows系统中使用命令“snort –vi 2”。如果你的操作正确的话,你将会在屏幕上看到一连串的数据包头信息(类似于tcpdump/windump的功能)不停的更新根本就来不及细看。按“Ctrl-C”键停止捕获,然后查看数据包的统计信息如:捕获数据包的数目、按协议的详细分类以及分片的数据包等等。并且通过“-d”(查看包的数据信息)和“-q”(安静模式)功能选项可以看到显示信息的变化。
你也可以通过“ICMP Large ICMP Packet”规则来手动检查Snort。为了使用这种检测方法,你必须确保已经使能了“ICMP Large ICMP Packet”规则,并能从一个定义为$EXTERNAL_NET的网络发送大于800字节的网间控制报文协议数据包到一个定义为$HOME_NET的网络。如果这些条件都满足,下面的这些命令都会触发一个告警:Linux系统下“ping -s 1024 {目标主机}”或者Windows系统下“ping -l 1024 (目标主机)”。如果不会触发告警,那么Snort可能没有工作并且/或者捕获的数据包不够多。一个最可靠的解决方法是:在你的规则集文件(snort.conf)后面添加一些简单的规则:
.alert ip any any -> any any (msg:"Got an IP Packet"; classtype:not-suspicious;
sid:2000000; rev:1;)
.alert icmp any any -> any any (msg:"Got an ICMP Packet"; classtype:not-suspicious;
sid:2000001; rev:1;)
.alert icmp any any -> any any (msg:"ICMP Large ICMP Packet"; dsize:>800;
reference:arachnids,246; classtype:bad-unknown; sid:2000499; rev:4;)
前面两个规则分别在捕获任何IP数据包和ICMP数据包的时候产生一个告警。因为它们在遇到每一个数据包的时候都触发告警,所以在数据流量很大的网络段不适合使用这些规则!如果必要的话,请在一个小网络段或测试网络段使用这些规则。最后一个规则是对499号签名ID(标准规则)的拷贝进行修改以放宽产生告警的门限来满足我们的测试目的(注意:Snort.org组织将1-1,000,000的签名ID号留给“正式”规则使用,详情请查看Snort的用户使用手册)。正常情况下你应该避免放宽告警门限,因为这样会产生很多的误告警。
最后,Snort还有一个测试功能选项(“-T”),它可以轻松地检测到用户批准的配置变更。你可以输入命令“snort -c /etc/snort/snort.conf -T”,然后查看输出来判断变化的配置是否工作正常。如果工作正常,Snort将返回一个代码0,否则将返回一个别的代码(通常为1)。可以使用下面两条命令来示范一下:在Linux系统下snort -c /etc/snort/snort.conf -T和echo "Return code: $?",Windows系统下snort -c ./Snort.conf -T和echo Return code: %ERRORLEVEL%。由于通常情况下系统会运行几个Snort的拷贝,所以你可以让一个Snort实例进行监视,而在另一个上修改配置并进行测试,一旦配置测试完成以后,就可以停止监视Snort实例,然后立即重新启动Snort来执行改变的配置。
在通过网络线路测试Snort系统时还必须注意另一个问题:一些老式的规则使用传输控制协议报头标志来判断某个数据包是否属于一个已建立的传输控制协议会话连接。而新式的规则使用“established”关键字来判断(详情查阅“获取Snort规则的四个途径”)。不管是哪种规则,你都不可能仅仅使用Netcat从线路上提取期望的传输控制协议数据包中的有效载荷,并使用Snort去“检查”这些有效载荷——因为在相应的规则下,这些载荷必须作为已建立的传输控制协议会话的一部分,Snort才能够检查并触发告警。“established”关键字能够有效地减少误告警,但是在测试Snort的时候效果不好,这就是我们使用网间控制报文协议或上面的自定义规则的原因。