简介

Snort 是一个开源入侵防御系统(IPS)。Snort IPS 使用一系列规则来帮助定义恶意网络活动,并利用这些规则来查找与之匹配的数据包,并为用户生成警报。

Snort 也可以在线部署来阻止这些数据包。Snort有三个主要用途。作为一个像tcpdump一样的数据包嗅探器,作为一个数据包记录器–这对网络流量调试很有用,或者它可以作为一个完整的网络入侵防御系统。Snort可以被下载和配置为个人和企业使用。


原理

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

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


工作过程

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时可根据企业网络规模的大小,采用三层结构分别部署或采用三层结构集成在一台机器上进行部署,也可采用服务器层与控制台集成的两层结构。


安装

Ubuntu16.04下安装snort

sudo apt-get install snort

安装必备组件

#sudo apt-get install -y build-essential libpcap-dev libpcre3-dev libdumbnet-dev bison flex zlib1g-dev liblzma-dev openssl libssl-dev

build-essential:提供用于编译软件的构建工具(GCC等)。

bison,flex:DAQ所需的解析器(DAQ将在下面安装)。

libpcap-dev:Snort所需的网络流量捕获库。

libpcre3-dev:支持Snort所需正则表达式的函数库。

libdumbnet-dev:libdnet库为几个低层网络例程提供了一个简化的可移植接口。许多安装Snort的指南都是从源代码安装此库的,尽管这不是必需的。

zlib1g-dev:Snort所需的压缩库。

liblzma-dev:提供对swf文件的解压缩(adobe flash)

openssl和libssl-dev:提供SHA和MD5文件签名

snort规则

snort规则划分

alert tcp any any -> 192.168.0.94/24 111 (content:"|00 01 86 a5|";msg:"mountd access";)
	规则头								(规则选项)

规则头基本格式

alert   tcp   any   any   ->   192.168.0.94/24  111
动作	  协议	源ip  源端口	数据流向	目的ip  		 目的端口

动作
动作描述一个数据包的"谁,在何处,什么"的问题,并指明规则被激发后,在事件中应当做什么。在编写规则时,可以从下面的关键字中选择:

alert :用选择的警告方法生成一个警告,然后记录这个数据包。
log :记录这个数据包。
pass :忽略此数据包。

协议
规则的下一部分是协议,比较常见的协议包括TCP/UDP/ICMP等,snort支持多种协议。

源IP
紧跟协议的部分是IP地址,它定义了数据包来自何处。可以用"any"关键字来定义所有的IP地址。可以结合操作符指定

源端口
指明数据包来自哪个端口,端口号也可以用"any"关键字,也可以使用": "指定一个端口范围。

方向操作符
方向操作符"->"用于定义规则所使用的通信方向。即指明通信进入或出自你计算机的什么地方。

目标IP
下一部分的目标地址。它定义了数据包要到何方,与原地址类似,也可以使用"any"关键字。

目标端口
紧跟目标IP地址的部分是目标端口号,即数据包设法连接的端口号,与源端口相同。

规则选项的基本格式

(content:"|00 01 86 a5|";msg:"mountd access";)
(关键词1: 参数1, 参数2; 关键词2: 参数1, 参数2;......)

规则选项可以分为四类

general: 基本信息,并不对流量产生任何行为。<msg、reference,gid,sid rev、classtype、priority、metadata;>
payload: 对数据流的有效载荷进行查找,可进行多数据关联查找。<content,protected_content、byte_[test/jump]、isdata Preprocessor,nocase、rawbytes、depth、offset、distance、within,http_[cookie/header/method/uri];
non-payload: 非数据载荷查找。<fragoffset,ttl,tos,id,ipopts,fragbits,dsize,flags,flowbits,seq,ack,windows,itype,icode,icmpid,icmp-seq,rpc,ip_proto,sameip,stream_reassemable,stream_size。
post-detection: 对检测出特定的规则进行关联触发。<logto,session,resp,react,tag,activates与activated_by,count,replace,detection_filter>

snort规则组织结构

在这里插入图片描述
snort的规则是采用多维链表的形式进行存储,各个维度包括action,protocol,五元组,option:


snort配置项

snort.conf 中的配置指令可以让用户配置snort的全局设定。(如日志文件的路径、规则的应用顺序等)

基本语法

config <指令名>: <参数值>

表中的N代表该指令不需要附加参数

在这里插入图片描述
在这里插入图片描述

配置文件其他关键要素

  • 预处理器配置
    preprocessor <name > [:<option>]

  • 输出模块配置
    output <name>[:<option>]

  • 规则和包含文件配置
    include path/filename

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐