Snort

在1998年,Martin Roesch用C语言开发了开放源代码(Open Source)的入侵检测系统Snort。直至今天,Snort已发展成为一个具有多平台(Multi-Platform)、实时(Real-Time)流量分析、网络IP数据包(Pocket)记录等特性的强大的网络入侵检测/防御系统(Network Intrusion Detection/Prevention System),即NIDS/NIPS。Snort符合通用公共许可(GPL——GNU General Pubic License),在网上可以通过免费下载获得Snort,并且只需要几分钟就可以安装并开始使用。

Snort有三种工作模式:嗅探器、数据包记录器、网络入侵检测系统。嗅探器模式仅仅是从网络上读取数据包并作为连续不断的流显示在终端上。数据包记录器模式把数据包记录到硬盘上。网络入侵检测模式是最复杂的,而且是可配置的。我们可以让snort分析网络数据流以匹配用户定义的一些规则,并根据检测结果采取一定的动作。

Snort能够对网络上的数据包进行抓包分析,但区别于其它嗅探器的是,它能根据所定义的规则进行响应及处理。Snort 通过对获取的数据包,进行各规则的分析后,根据规则链,可采取Activation(报警并启动另外一个动态规则链)、Dynamic(由其它的规则包调用)、Alert(报警),Pass(忽略),Log(不报警但记录网络流量)五种响应的机制。

Snort有数据包嗅探,数据包分析,数据包检测,响应处理等多种功能,每个模块实现不同的功能,各模块都是用插件的方式和Snort相结合,功能扩展方便。例如,预处理插件的功能就是在规则匹配误用检测之前运行,完成TIP碎片重组,http解码,telnet解码等功能,处理插件完成检查协议各字段,关闭连接,攻击响应等功能,输出插件将得理后的各种情况以日志或警告的方式输出。

Snort通过在网络TCP/IP的5层结构的数据链路层进行抓取网络数据包,抓包时需将网卡设置为混杂模式,根据操作系统的不同采用libpcap或winpcap函数从网络中捕获数据包;然后将捕获的数据包送到包解码器进行解码。网络中的数据包有可能是以太网包、令牌环包、TCP/IP包、802.11包等格式。在这一过程包解码器将其解码成Snort认识的统一的格式;之后就将数据包送到预处理器进行处理,预处理包括能分片的数据包进行重新组装,处理一些明显的错误等问题。预处理的过程主要是通过插件来完成,比如Http预处理器完成对Http请求解码的规格化,Frag2事务处理器完成数据包的组装,Stream4预处理器用来使Snort状态化,端口扫描预处理器能检测端口扫描的能力等;对数据包进行了解码,过滤,预处理后,进入了Snort的最重要一环,进行规则的建立及根据规则进行检测。规则检测是Snort中最重要的部分,作用是检测数据包中是否包含有入侵行为。例如规则alert tcp any any ->202.12.1.0/24 80(msg:”misc large tcp packet”;dsize:>3000;)这条规则的意思是,当一个流入202.12.1.0这个网段的TCP包长度超过3000B时就发出警报。规则语法涉及到协议的类型、内容、长度、报头等各种要素。处理规则文件的时候,用三维链表来存规则信息以便和后面的数据包进行匹配,三维链表一旦构建好了,就通过某种方法查找三维链表并进行匹配和发生响应。规则检测的处理能力需要根据规则的数量,运行Snort机器的性能,网络负载等因素决定;最后一步就是输出模块,经过检测后的数据包需要以各种形式将结果进行输出,输出形式可以是输出到alert文件、其它日志文件、数据库UNIX域或Socket等。

Snort的部署非常灵活,很多操作系统上都可以运行,可以运行在window xp,windows2003,linux等操作系统上。用户在操作系统平台选择上应考虑其安全性,稳定性,同时还要考虑与其它应用程序的协同工作的要求。如果入侵检测系统本身都不稳定容易受到攻击,就不能很好的去检测其它安全攻击漏洞了。在Linux与Windows操作系统相比较之下,Linux更加健壮,安全和稳定。Snort的运行,主要是通过各插件协同工作才使其功能强大,所以在部署时选择合适的数据库,Web服务器,图形处理程序软件及版本也非常重要。Snort部署时一般是由传感器层、服务器层、管理员控制台层三层结构组成。传感器层层就是一个网络数据包的嗅探器层,收集网络数据包交给服务器层进行处理,管理员控制台层则主要是显示检测分析结果。部署Snort时可根据企业网络规模的大小,采用三层结构分别部署或采用三层结构集成在一台机器上进行部署,也可采用服务器层与控制台集成的两层结构。

Snort的有三种模式的运行方式:嗅探器模式,包记录器模式,和网络入侵检测系统模式。嗅探器模式仅仅是从捕获网络数据包显示在终端上,包记录器模式则是把捕获的数据包存储到磁盘,入侵检测模式则是最复杂的能对数据包进行分析、按规则进行检测、做出响应。

Snort入侵检测系统适应多种平台,源代码开放,使用免费,受众多用户喜爱,但也有不少缺点。Snort之所以说他是轻量型就是说他的功能还不够完善,比如与其它产品产生联动等方面还有待改进;Snort由各功能插件协同工作,安装复杂,各软件插件有时会因版本等问题影响程序运行;Snort对所有流量的数据根据规则进行匹配,有时会产生很多合法程序的误报。

Snort最重要的用途还是作为网络入侵检测系统(NIDS)。

使用简介

Snort并非复杂难以操作的软体。 Snort可以三个模式进行运作:

侦测模式(Sniffer Mode):此模式下,Snort将在现有的网域内撷取封包,并显示在荧幕上。

封包纪录模式(packet logger mode):此模式下,Snort将已撷取的封包存入储存媒体中(如硬碟)。

上线模式(inline mode):此模式下,Snort可对撷取到的封包做分析的动作,并根据一定的规则来判断是否有网路攻击行为的出现。

基本指令:侦测模式

若你想要在萤幕上显示网路封包的标头档(header)内容,请使用

./snort -v

如果想要在萤幕上显示正在传输的封包标头档内容,请使用

./snort -vd

如果除了以上显示的内容之外,欲另外显示数据链路层(Data link layer)的资料的话,请使用

./snort -vde

在记录封包之前,您必须先指定一个目录来储存该资料。举例而言,若您在您目前的目录下建立了一个名为log的目录,欲存纪录资料于该目录下的话,请使用

./snort -dev -l ./log

若想要以二进位码(binary code)的方式来储存封包资料的话,请使用

./snort -l ./log -b

若欲读取某已储存的封包记录档案(假设其档名为packet.log),请使用

./snort -dvrpacket.log

若欲读取该档案中特定网路协定的资讯(假设是tcp协定),请使用

./snort -dvr packet.log tcp

若欲使用入侵侦测模式,请使用

./snort -dev -l ./log -h 192.168.1.0/24 -c snort.conf

其中snort.conf是封包的签章档案

若不需要得知资料连结层的资讯,请使用

./snort -d -h 192.168.1.0/24 -l ./log -c snort.conf

以下是Snort在入侵侦测模式的指令选项:

-A fast快速警告模式

-A full完整警告模式(预设)

-A unsock将警告讯息送至UNIX的socket上,供其他装置检视

-A none关闭警告功能

-A console将警告讯息送至终端机(Console)

线上模式

封包的抓取不透过libcap,而是透过防火墙,并可告知防火墙是否让此封包通过。启用线上模式使用./snort -Qd -h 192.168.0.0/16 -l ./log -c snort.conf

防火墙的设定

* Linux

o iptables -t nat -A PREROUTING -j QUEUE

编辑Snort侦测规则

以下是一种编辑侦测规则(Snort rule)的例子:

alert tcp any any ->192.168.1.0/24 111

依次分为以下几个部份:

标头

标头的部份指的是此规则欲执行的动作。以上的例子为"alert",即警示。完整的标头选项列表如下:

alert产生警示

log纪录该封包

pass忽略该封包

activate产生警示,并开启另一个动态规则

dynamic被activate指令触发后所执行的规则

drop让iptable丢弃该类型封包并记录下来

reject让iptable丢弃该类型封包,并送出TCP重新启动(TCP Reset)的封包

sdrop让iptable丢弃该类型封包,但不记录

通讯协定

通讯协定指出执行该规则的协定为何。上述的例子是tcp协定。

目前snort支援四种通讯协定:

tcp, udp, icmp, ip

并计划在未来支援以下的协定:

ARP, IGRP, GRE, OSPF, RIP, IPX等等

进阶规则编辑

Includes: include允许指令的规则档包含其他的规则档。

include:

请注意,在该行结尾处没有分号。被包含的规则档会把任何预设的变数值替换为其本身的变数。

Variables :

在Snort中定义的变数。

var:

例子: var NET 192.168.1.0/24 alert tcp any any -> $NET any (flags: S; msg: "FIN packet";)

变数名称可以用多种方法修改。可以在"$"符号之后定义变数。 "?"和"-"可用于变数修改符号。 $var -定义变数。 $(var) -用变数"var"的值替换。 $(var:-default) -用变数"var"的值替换。若"var"没有定义,则使用"default"替换。 $(var:?messageXXX) -用变数"var"的值替换,或列印出错误讯息"messageXXX"。例子: var NET $(NET:-192.168.1.0/24) log tcp any any -> $(NET:?NET is undefined!) 23

Config

Snort的很多配置和命令行选项都可以在配置档中设置。

config [: ]

order改变规则顺序( snort -o )

alertfile建立警告输出档,例如:config alertfile: alertlog

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)

quiet安静模式,不显示状态报告。 (snort -q)

checksum_mode计算checksum的协定类型。类型值: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加入一个新的参考系统。

相关词汇