原文作者: Nalneesh Gaur
尽管有许多IT界的专家怀疑入侵检测系统存在的必要性,但是现在到了为你的企业建立入侵检测系统的时候了。也许还有许多人认为对付恶意的攻击防火墙已经足够了,但在IT界,安全问题目前已经受到了如此广泛的关注,已经到了有必要采用入侵检测系统的地步了。Snort是一种入侵检测系统,它小巧免费,具有很好的配置性和可移植性,是基于网络的入侵检测系统,也可以称之为NIDS。除此之外,它还可以用来截获网络中的数据包并做为数据包的日志。
Snort经常被称为轻量级的入侵检测系统。Snort被标以轻量级的称号是因为它首先是设计给小网络段使用的。基于规则的体系结构使Snort非常灵活,它的设计者将它设计的很容易插入和扩充新的规则,这样它就能够对付那些新出现的威胁。本文详细讨论了Snort的安装及其体系结构和规则,以及如何运行它。
一、安装
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的体系结构。
二、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
表2 一个规则表的例子
该规则要求,记录下网络外部主机所做的下列行为:
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。
[**] 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: 20
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) [**]
表2. 常见的告警信息
总结
首先是高级的黑客,接下来只需用简单的脚本语句直到目前公开发行的拒绝服务攻击软件, 当今的IT体系结构及商业财产经常受到未授权访问的威胁。在90年代初期,防火墙是避免公司财产受到攻击的首选机制。当今越来越多的安全体系结构包括了入侵检测系统。Snort在商业的入侵检测系统以外提供了一个划算的选择。
在编译安装之后,Snort可以做为sniffer,包记录器(packet logger)和基于网络的入侵检测系统。它配置简单并提供了多种模式的告警和日志输出。由Snort团体开发的插件模块更进一步增强了Snort的功能。如果你已经安装并运行了Snort,通过观察日志和告警信息,你会洞悉到由Snort捕获的各种类型的通信数据。