尽管有许多IT界的专家怀疑入侵检测系统存在的必要性,但是现在到了为你的企业建立入侵检测系统的 时候了。也许还有许多人认为对付恶意的攻击防火墙已经足够了,但在IT界,安全问题目前已经受到了如此广 泛的关注,已经到了有必要采用入侵检测系统的地步了。Snort是一种入侵检测系统,它小巧免费,具有很好的 配置性和可移植性,是基于网络的入侵检测系统,也可以称之为NIDS。除此之外,它还可以用来截获网络中的 数据包并做为数据包的日志。
Snort经常被称为轻量级的入侵检测系统。Snort被标以轻量级的称号是因为它首先是设计给小网络段使 用的。基于规则的体系结构使Snort非常灵活,它的设计者将它设计的很容易插入和扩充新的规则,这样它就能 够对付那些新出现的威胁。本文详细讨论了Snort的安装及其体系结构和规则,以及如何运行它。
1.安装
Snort是由Martin Roesch编写的,你可以从http://www.snort.org/下载。在本 文完成时,它的最新版本是1.7。该网站除了提供源码下载外还将提供适用于常用平台的二进制版本。但在下载 和安装Snort之前,请先安装libpcap的0.5以上版本,libpcap的最新版本是0.6.2。它支持夸平台捕获数据包并 可以对其进行分析。Libpcap还有支持一些BSD平台的版本。你可以从http://www.tcpdumpl.org下载到最新版本 的libcap。
安装Snort很简单。如同安装其它典型的UNIX工具一样,安装步骤包括./configure,接 下来是make。我常常喜欢查看配置的选项,通过./configure –help就可以看到所有的选项了。最后用make install将会安装所有的Snort文件。此时,你还没有完全做好准备运行Snort,在运行Snort之前,你得先创建 它的规则文件。在写规则文件之前,我们还是先来看看Snort的体系结构。
2.Snort的体系结构
Snort的体系结构由三个主要的部分组成。在图1中显示的是这些部分的简化表示。对它们的描述如下:
1、包解码:Snort的包解码支持以太网和SLIP及PPP媒体介质。包解码所做的所有工作就是为探测引擎 准备数据。
2、探测引擎:探测引擎是Snort的心脏。它主要负责的工作是:按照启动时加载的规则,对每个数据包 进行分析。探测引擎将Snort规则分解为链表头和链表选项进行引用。链表头由诸如源/目标ip地址及端口号这 些普通信息标识。链表选项定义一些更详细的信息如TCP标志、ICMP代码类型、特定的内容类型、负载容量等。 探测引擎按照Snort规则文件中定义的规则依次的分析每个数据包。与数据包中数据匹配的第一条规则触发在规 则定义中指定的动作。凡是与规则不匹配的数据包都被丢弃。探测引擎中的关键部分是plugin模块如端口扫描 模块等,它增加的一些分析能力增强了Snort的功能。
3、日志记录/告警系统:告警和日志是两个分离的子系统。日志允许你将包解码收集到的信息以可读的 格式或以tcpdump格式记录下来。你可以配置告警系统,使其将告警信息发送到syslog、flat文件、Unix套接字 或数据库中。在进行测试或在入侵学习过程当中,你还可以关掉告警。缺省情况下,所有的日志将会写到 /var/log/Snort文件夹中,告警文件将会写到/var/log/Snort/alerts文件中。
3.Snort规则
Snort规则文件是一个ASCII文本文件,可以用常用的的文本编辑器对其进行编辑。规则文件的内容由以 下几部分组成:
变量定义:在这里定义的变量可以在创建Snort规则时使用。
Snort规则:在入侵检测时起作用的规则,这些规则应包括了总体的入侵检测策略。在本文的后面给出了一 个Snort规则。
预处理器:即插件,用来扩展Snort的功能。如用portscan来检测端口扫描。
包含文件Include Files:可以包括其它Snort规则文件。
输出模块:Snort管理员通过它来指定记录日志和告警的输出。当Snort调用告警及日志子系统时会执行输 出模块。
Snort规则逻辑上可以分为两个部分:规则的头部和规则选项部分。对Snort规则的描述必须在一行之内 完成,另外它必须包含IP地址,以便在不能按照主机名进行查找使用。图2显示了Snort规则的头及选项的细节 。
图2. 规则表的结构组成
在Snort的主页中,读者对Snort的规则细节中最感兴趣的链接是“Writing Snort Rules"。另外, Snort的发行版本中提供的RULES.SAMPLE是一个非常不错的文档。你可以参照它为你的工作环境构建Snort规则 。在写规则前,建议你先写出网络入侵检测策略。这包括先定义出进行日志记录、忽略或发出告警信息的事件 。下面给出一个非常简单的规则:
##
#Define our network and other network
#
var OURNET 208.177.13.0/24
var OTHERNET !$OURNET
var NIDSHOST 208.177.13.251
var PORTS 10
var SECS 3
##
# Log rules
##
log tcp $OTHERNET any -> $OURNET 23
log tcp $OTHERNET any -> $OURNET 21
log tcp $OTHERNET any -> $OURNET 79
##
#Alert Rules
##
alert udp any any -> $OURNET 53 (msg:"UDP IDS/DNS-version-query";
content:"version";)
alert tcp any any -> $OURNET 53 (msg:"TCP IDS/DNS-version-query";
content:"version";)
alert tcp any any -> $OURNET 80 (msg:"PHF attempt";
content:"/cgi-bin/phf";)
##
# Load portscan pre-processor for portscan alerts
##
preprocessor portscan: $OTHERNET $PORTS $SECS
/var/log/snort/pscan_alerts
preprocessor portscan-ignorehosts: $OURNET
##
# Pass Rules (Ignore)
##
pass tcp $OURNET any -> $OTHERNET 80
pass udp any 1024: <> any 1024:
pass tcp any 22 -> $NIDSHOST 22
该规则要求,记录下网络外部主机所做的下列行为:
Telnet、FTP通信、finger。
对以下行为发出告警:
从本网以外的机器中发出的端口扫描行为,并将告警信息写入到/var/log/snort/pscan_alerts文件中 ;
所有的PHF请求
DNS版本查询
忽略以下信息:
对1024以上UDP端口的访问;
从本网内发出的WEB浏览通信及网络入侵检测系统间的ssh通信;
4.运行Snort
Snort可以以包窃听器方式、包日志记录器和入侵检测系统三种方式运行。如果以包窃听器的方式运行 ,TCP/UDP/ICMP的头信息及应用数据在标准输出设备中输出:
# Snort -vd
当Snort作为包记录器使用时,它将应用及协议的头信息记录到/var/log/today.log中:
# Snort -dev -l /var/log/today.log
做为一个网络入侵检测系统,Snort在le0接口进行监听,配置文件为/etc/Snort.rules,并以后台进程 的方式运行:
# Snort -D -i le0 -c /etc/Snort.rules
Snort并不会按着规则在配置文件中出现的次序来对其进行评估,在默认的情况下它是按照 Alert,Pass,Log的次序对规则进行评估的。用命令行标志-o可以改变评估的次序为Pass,Alert,Log。-A选项指 定了告警模式,共有四种方式可供选择:full,fast,none和unsock。Full,none,fast这几种方式的含义很明白 ,unsock选项可以使Snort将告警信息通过UNIX的套接字发往一个负责处理告警信息的主机,在该主机上有一个 程序在套接字上进行监听。有关该选项的细节可以通过snort的man获得更多的内容。通过Snort的告警方式,你 可以在告警信息中对当前的情况进行详细的描述。
必须要对snort的配置进行验证,验证的方法是 再检查一遍入侵检测规则。对于入侵检测的策略,你可以进行一些指定的测试并观察日志和告警。对于我们上 面列出的策略,我们可以运行Telnet,FTP和finger。你可以使用诸如scanner之类的工具,如一些可以很容易得 到的扫描器,如nmap都是不错的。商业用途的扫描器如network Associates发行的Cybercop和Internet Security System的ISS可以帮助你自动的完成这些过程。Netcat是另外一个功能强大的工具,你可以从 http://www.atstake.com/research%20tools/下载。总之,你可以用几个简单的脚本语句对你的系统进行攻击 。但是你一定要小心,运行这些脚本意味着你信任这些脚本。下面显示了几个简单的告警。其中包括三个常见 的攻击:IIS Unicode攻击,SYN/Fin扫描和portscan。
表2. 常见的告警信息
[**] spp_http_decode: IIS Unicode attack detected [**]
03/07-11:10:40.910903 192.168.0.1:3607 ->192.168.1.2:80
TCP TTL:249 TOS:0x0 ID:22898 IpLen:20 DgmLen:1022 DF
***AP*** Seq: 0x552997B8 Ack: 0xE39D7CB1 Win: 0x4470 TcpLen:20
[**] IDS198/SYN FIN Scan [**]
03/13-01:38:45.254726 192.168.1.3:53 -> 192.168.0.1:53
TCP TTL:23 TOS:0x0 ID:39426 IpLen:20 DgmLen:40
******SF Seq: 0x4D622A79 Ack: 0x7EEF29AF Win: 0x404 TcpLen:
03/15-19:36:23.468056
[**] spp_portscan: PORTSCAN DETECTED from 192.168.2.25 (THRESHOLD 3
connections exceeded in 4 seconds) [**]
03/15-19:36:39.561360
[**] spp_portscan: portscan status from 192.168.3.25: 5 connections
across 1
hosts: TCP(0),UDP(5) [**]