Snort 工作流程分为以下四个主要部分:
1、包捕获/解码引擎:首先,利用libpcap从网卡捕获网络上的数据包,然后数据包经过解码引擎填入到链路层协议的包结构体中,以便对高层次的协议进行解码,如TCP和UDP端口。
2、预处理器插件:接着,数据包被送到各种各样的预处理器中,在检测引擎处理之前进行检查和操作。每个预处理器检查数据包是否应该注意、报警或者修改某些东西。
3、规则解析和检测引擎:然后,包被送到检测引擎。检测引擎通过各种规则文件中的不同选项来对每个包的特征和包信息进行单一、简单的检测。检测引擎插件对包提供额外的检测功能。规则中的每个关键字选项对应于检测引擎插件,能够提供不同的检测功能。
4、输出插件:Snort通过检测引擎、预处理器和解码引擎输出报警。
详细工作流程:
一、包捕获/解码引擎:
1、数据包捕获:
Snort通过两种机制来满足网络流量的需要:将网卡设置为混杂模式;利用libpcap从网卡捕获网络数据包。
网卡的默认工作方式是忽略所有不是自己的MAC地址为目的地址的流量。通过将网卡设置成混杂模式,可以监听网络中的所有流量。
数据包捕获函数库是一个独立的软件工具,数据包捕获库函数能直接从网卡获取数据包。Snort就是通过调用该库函数从网络设备上捕获数据包。它工作在OSI模型的数据链路层。在不同的平台上使用Snort系统,需要安装不同版本的Libpcap,比如在Linux和Unix系统下需要安装Libpcap,而在Windows系列系统下,就需要安装Winpcap。
2、包解码:
对已经到达网卡并且被lipcap库函数捕获的数据包,Snort需调用解码引擎对数据链路层的原始数据包进行解码。Snort能够识别以太网、802.11(无线局域网协议)、令牌环以及诸如IP、TCP和UDP等高层协议。Snort将捕获的数据包解析后,存储在内存中指针指向的数据结构中。
二、预处理器:
Snort卓越的速度源于简单的规则匹配,如果只对每个包进行数字和字符串的匹配,处理性能就能适应快速的高负载网络。这种检测系统的缺点是,如果攻击模式很常见,就会产生很多误报。如果模式过于特殊,又会产生漏报。造成这些缺陷的原因是特征语言的表达能力有限或IDS对协议的分析不够,一些IDS通过复杂的方法解决这一问题。它们有些使用协议异常检测来对不符合协议规范的包报警,有些则保持连接状态,并只对处于以连接TCP会话中的包报警。
Snort则通过预处理器来实现这些功能,Snort有多个预处理器,包括frag2,stream4,http_decode,Telnet_negotiation,portscan,rpc_decode等常用的预处理器。这些预处理器的主要功能为:1)包重组;2) 协议解码;3) 异常检测;。
1、包重组:
基于特征的检测将包数据和定义良好的模式进行匹配。但是不能对跨包的数据进行检测。通过frag2插件将分片重组到一个完整包中,可以确保攻击者不能用IP分片来躲避检测。通过stream4插件进行流重组,我们可以用单包特征机制在TCP会话中跨越多个包进行模式匹配。最后,通过stream4的状态维护功能,特征匹配可以具备一些智能,来判断哪些包应该丢弃,哪些包处于链接中。用一句话总结,包重组预处理器帮助Snort检测匹配数据分布在多个包中的攻击。
2、协议解码:
基于规则的检测提供简单的串/位匹配的功能,但无法检测HTTP协议中不同形式的URL,除非使用无限大的规则集。 http_de-code预处理器帮助Snort在规则匹配前规范化URL。简单的规则匹配还可能因为数据中间插入的协议信息而失败。Telnet_negoti-ation和rpc_decode预处理器去除数据中不应该进行模式匹配的部分,rpc_decode预处理合并RPC消息分片,Telnet_negotiation预处理器去除Telnet的协议协商过程。用一句话总结,协议解码预处理对协议数据进行处理,使串匹配功能在更明确的数据上工作。
3、异常检测:
基于规则的检测由于其简单性而工作可靠。它的过程精确,可以很容易地调整配置减少误报,也容易进行优化。但是,有些攻击无法通过这种模式来检测。Snort发展了协议异常检测:portscan预处理器允许Snort跟踪在一个时间段内接收的扫描类型的包,对超过阈值的情况进行报警;BackOrifice预处理器使Snort不用巨大的规则集就可以检测加密的BackOrifice流量。
三、规则解析和检测引擎:
Snort规则是基于文本的,它通常存在于Snort程序目录中或者子目录中。在启动的时候,Snort读取所有的规则文件,并且建立一个三维的链表。Snort使用列表匹配包和检测。
1、规则解析:
Snort规则是Snort入侵检测系统的重要组成部分。规则集是snort的攻击特库,每条规则都对应一条攻击特征,snort通过它来识别攻击行为。
每一条规包括两个部分:规则头部(RuleHeader)和规则选项(RuleOption)。规则头包含规则的行为、协议、源地址、目的地址、子网掩码、源和目的端口信息。规则选项包含报警信息以及规则触发时提供给管理员的参考信息。例如: alerttcpanyany->202.203.112.0/24any(content:“proxy-connection”;msg:“proxyuse”;) 这条规则述信息是:对任何访问202.203.112网段,tcp报文中含有proxy-connection的流量报警。在这个例子中,左括号前面是规则头。圆括号内的内容是规则选项,在规则选项中,content后面的内容为关键字,及需要匹配的字符串,msg后面的内容为规则触发时将显示的信息。Snort的规则定义中可以没有规则体,它们只是用来更好地定义所要进行的某种处理(记录、报警、忽略等)的数据包类型。只有当规则中的每一个元素都为真时,才能触发对应的规则动作。
2、检测引擎:
Snort把具有相同条件的规则链接到一个集合中,用RTN结构来描述;规则选项对应于规则选项结点OTN(OptionalTreeNode),包含一些特定的检测标志、报警信息、匹配内容等条件,每个选项的匹配子函数(插件)放到FUNC链表中。只有当规则的各个条件都为真时才触发相应的操作。
Snort解析规则时,分别生成TCP、UDP、ICMP和IP这4个不同的规则树,每一个规则树包含独立的三维链表:RTN(规则头),OTN(规则选项)和FUNC(指向匹配子函数的指针)。 当Snort捕获一个数据报时,首先对其解码,然后进行预处理,再利用规则树对数据报进行匹配。在规则树匹配过程中:根据该数据报的IP协议决定与哪个规则树进行匹配;然后与RTN结点依次进行匹配,当与某个规则头相匹配时,接着向下与OTN结点进行匹配。每个OTN结点都包含了一条规则的全部选项,它包含的一组函数指针就是用来实现对这些条件的匹配操作。当检测得知数据报与某个OTN结点的所有条件相符合时,即判断此数据报为攻击报文。
为提高规则匹配的速度,Snort采用了Boyer-Moore字符串匹配算法、二维列表递归检索(RTN和OTN)以及函数指针列表(称为“三维列表”)等方法。
三、输出插件:
抓包引擎从网络获取数据包并发送给分析模块,如果包触发了报警或日志事件,那么数据就发送给相应的输出插件。输出插件在预处理器和抓包引擎执行完之后调用Snort报警和日志子系统时执行。
Snort输出插件的功能可以分为7个部分:版权和头信息;头文件、依赖关系和全局变量;关键字注册;参数分析和函数列表链;数据处理,格式化和存储;处理预处理器参数;清理和退出。下面详细描述插件的各功能。
1、版权和头信息现存的每一个输出插件都含有鲜明的版权信息,版权信息可以由插件开发者自主添加。插件的头详细描述了插件的用途,需要的参数、结果以及其他注释。
2、头文件,依赖关系和全局变量就绝大部分应用而言,文件以及它们之间的依赖关系对程序至关重要,而且要自释其意。全局变量在整个插件的任何部分都可以使用。
3、关键字注册输出插件通过配置文件和命令行引用和调用。用户必须为插件定义关键字并把该关键字连接到Snort,以便分析该关键字时作相应的特殊处理。
4、参数分析和函数列表链大部分插件在声明时需要传递参数,因此有必要写一些代码来处理这些数据。例如,当使用日志功能时,可能需要指定一个用于存储日志的日志文件名。除了分析参数,插件还必须链接Snort主引擎内的函数。
5、数据处理、格式化和存储数据处理、格式化和存储是插件最主要的功能,可以这么说,如果没有数据处理、格式化和存储这些功能,输出插件就不完整,没有用。
6、处理预处理器参数在有预处理器参数存在时,必须写数据处理代码来处理这些参数,这样在分析开始之前,Snort和输出插件就能区分预处理器单元。
7、清理和退出,在绝大多数情况下,需要在插件中包含清理内存、应用连接以及打开套接字的退出处理代码,这样可以提高Snort的执行效率。 Snort能够使用输出插件来汇报和表示数据,Snort支持多种日志格式,包括直接的文本头、PCAP、UNIXsyslog、XML文本数据库和多种关系数据库,这些输出插件使得报警和日志以更加灵活的格式和表现形式呈现给管理员。如果没有输出插件来处理、存储和格式化数据,包分析和流量分析是没有任何意义的。