
入侵检测系统分类Snort.ppt
35页SNORT原理简介与优化及GNORT初探刘斐然主要内容 Snort原理是什么? Snort在实际应用中的缺陷有哪些? 如何对Snort进行优化? Gnort初探入侵检测系统的基本结构入侵检测系统通常包括三功能部件: 信息收集,其来源如下: 系统或网络的日志文件 网络流量 系统目录或文件的异常变化 程序执行中的异常行为 信息分析 模式匹配 统计分析 完整性分析 结果处理 对异常进行记录/报警等入侵检测系统分类Snort-基于特征检测的NIDS在1998年,Martin Roesch先生用C语言开发了开放源代码(Open Source)的入侵检测系统Snort.直至今天,Snort已发展成为一个多平台(Multi-Platform),实时(Real-Time)流量分析,网络IP数据包记录等特性的强大的网络入侵检测/防御系统(Network Intrusion Detection/Prevention System),即NIDS/NIPS.Snort有三种工作模式:嗅探器、数据包记录器、网络入侵检测系统 嗅探器模式仅仅是从网络上读取数据包并作为连续不断的流显示在终端上 数据包记录器模式把数据包记录到硬盘上。
网路入侵检测模式是最复杂的,而且是可配置的我们可以让snort分析网络数据流以匹配用户定义的一些规则,并根据检测结果采取一定的动作Snort的结构组成 Snort主要包含以下模块:数据包捕获模块: 通过DAQ调用底层函数库,捕获来自网络的数据包解码模块 对捕获的数据包进行协议解码预处理模块 以插件形式存在,对IP分片进行重组,防止ARP欺骗等等规则匹配模块 根据设置的规则对数据包进行匹配输出模块 以插件形式存在,当匹配成功时进行记录或报警Snort原理分析-数据包解码在Snort内部用Packet数据结构表示一个数据包数据包解码模块负责根据捕获到的数据包初始化Packet数据结构该结构定义在decode.h中)数据包解码函数均定义在decode.c中,由grinder指针指向其入口函数解码流程如右图所示最后生成完整的Packet结构Snort原理分析-数据包预处理简介解码后的数据包还需经过预处理才能被主探测引擎进行规则匹配预处理器的主要用来应对一些IDS攻击手段其作用包括: 针对可以行为检查包或修改包,以便探测引擎能对其正确解释 负责对流量标准化,以便探测引擎能精确匹配特征目前已知的IDS逃避技术主要有: 多态URL编码; 多态shellcode; 会话分割; IP碎片;Snort原理分析-预处理器简介Snort主要包含以下预处理器:包重组预处理器: Frag3:IP分片重组和攻击监测。
Stream5:维持TCP流状态,进行会话重组协议规范化预处理器: HttpInspect:规范HTTP流,如将Unicode或hex翻译成snort可以识别的字符集 RpcDecode:规范RPC调用异常检测预处理器: ARPspoof:检测ARP欺骗 SfPortscan:检测端口扫描在Snort中,捕获的数据包要经过所有已经打开的预处理器预处理器是由插件来实现的,这样的好处为: 可以根据实际环境启动或停止一个预处理插件,提高Snort效率 可以灵活添加自己编写的预处理插件,预防新型的IDS逃避手段如何编写预处理插件在源码doc/README.PLUGINS中有初步介绍)Snort原理分析-预处理器初始化Snort预处理器初始化流程如下:首先调用RegisterPreprocessors函数,将所有预处理插件注册进全局preproc_config_funcs链表中,内容包括:关键字及相关预处理插件的初始化函数等调用ConfigurePreprocessors函数,根据配置文件和命令行参数遍历preproc_config_funcs链表,比对关键字如相同则运行预处理插件的初始化函数。
预处理插件的初始化函数通过调用AddFuncToPreprocList将其实际的预处理函数添加到preproc_eval_funcs链表中,插入时会根据预处理插件的priority进行排序当程序捕获到数据包时,首先通过grinder指向的函数进行解码然后执调用preproc_eval_funcs链中的预处理程序进行预处理Snort原理分析-规则简介Snort规则分为Rules Headers和Rules Options,格式为: rule headers ( rule options )规则头(Rules Headers) 包含结果处理模式,协议,来源与目地的IP地址,来源与目地的端口等规则选项(Rules Options) 包含匹配内容,匹配位置,报警信息,引用说明等等例:alert tcp $EXTERNAL_NET any - $HTTP_SERVERS $HTTP_PORTS (msg:WEB-PHP Opt-X header.php remote file include attempt; flow:to_server,established; content:/header.php; nocase; http_uri; content:systempath=;.)Snort原理分析-规则表现形式在Snort中,规则头由RuleTreeNode(RTN)结构表示,规则选项由OptTreeNode(OTN)表示。
RTN结构中主要包括:IpAddrSet *sip,*dip:源IP地址,目的IP地址PortObject *src_portobject,*dst_portobject:源端口,目的端口OptTreeNode *down:指向相关的OTNRuleFpList *rule_func:规则匹配函数OTN结构中主要包括:OptFpList *opt_func:规则匹配函数void *ds_listPLUGIN_MAX:插件需要的数据结构指针RuleTreeNode *proto_nodes:指向其关联的RTNSnort原理分析-RTN初始化RTN及OTN均由ParseRule负责初始化首先读入一行规则,传给ParseRule函数进行分析ParseRule函数会将规则头取出并进行拆分,然后执行如下函数对RTN进行初始化:ProcessIP函数:将源IP地址,目的IP地址写入RTN的*sip,*dip中ParsePortList函数:将源端口,目的端口写入RTN的*src_portobject,*dst_portobject中ProcessHeadNode函数:调用SetupRTNFuncList函数,将具体的规则匹配函数插入rule_func链表中,其函数根据标志位不同可选用如下几个:CheckSrcPortNotEq/CheckSrcPortEq/CheckDstPortNotEq/CheckDstPortEqualCheckSrcIP/CheckDstIPRuleListEnd:rule_func的链结尾函数匹配RTN时会依次执行rule_func链表中的函数进行匹配,如匹配不成功则返回0。
最终如果执行到RuleListEnd函数则表明匹配成功Snort原理分析-OTN初始化与检测RTN不同,系统检测OTN时会用到规则检测插件(例如针对TCP flags的匹配的检测是由TCPFlagCheck插件中的CheckTcpFlags函数来完成的),所以先介绍一下规则检测插件的初始化: 通过调用RegisterRuleOptions函数,将所有的规则检测插件添加到rule_opt_config_funcs链表中,包括关键字与具体的检测初始化函数OTN初始化是由ParseRuleOptions函数完成的其执行如下操作: 调用addRtnToOtn,将关联的RTN指针添加到OTN的proto_nodes中遍历rule_opt_config_funcs规则链,进行关键字匹配,如匹配成功则执行其对应的检测初始化函数 检测初始化函数负责将需要的数据指针添加到OTN的ds_list中,并将检测函数插入OTN的opt_func链表中最后将OptListEnd插入到opt_func链的末尾Snort原理分析-快速规则匹配初始化fpCreateFastPacketDetection:构建快速规则匹配结构: 第一层是由四个PORT_RULE_MAP构成,分别对应TCP,UDP,ICMP及其他IP协议。
第二层由PORT_GROUP结构构成,分别对应源端口、目的端口及通用端口三种 第三层由RULE_NODE结构构成,分别对应以下三类规则: uri-content:URI中的包含规则; Content:内容包含规则; non-content:非content规则Snort原理分析-规则匹配流程调用Detect(Packet * p)对数据包进行规则检测,首先判断是TCP,UDP或者ICMP协议,然后调用相关函数:fpEvalHeaderTcp,fpEvalHeaderUdp,fpEvalHeaderIcmp进行处理如均不是则调用fpEvalHeaderIp进行处理fpEvalHeaderXXX的处理过程为首先通过对应协议的PORT_RULE_MAP,根据源端口与目的端口号,找到相关的PORT_GROUP执行fpEvalHeaderSW(),通过规则类型从PORT_GROUP中找到RULE_NODE,然后对相应规则进行匹配具体如下: 对于url-content或content,执行多模式匹配函数mpseSearch()进行匹配; 对于非content规则,则逐一运行OTN中opt_func链中的所有规则匹配函数。
如均执行成功,则继续运行其指向RTN中的rule_func链中的匹配函数如均匹配成功,则最后会调用输出插件进行输出Snort目前存在的问题 snort是一款轻量级的网络入侵检测系统如果将其应用在大规模、大流量的网络中,snort的报警性能会非常低下可见snort以下两方面的效率还无法满足我们的需求:数据包捕获效率数据包分析处理效率 改进思路为:首先需保证snort可以捕获到网络中的所有数据包然后需要保证这些数据包可以及时得到处理高效的数据包捕获接口-PF_RINGPF_RING是一个第三方的内核数据包捕获接口,类似于libpcap它提供一种PF_RING类型的套接字,大大增加了数据包捕获的效率它包括三方面的内容: 网卡驱动程序 PF_RING-aware drivers User-space DNA (Direct NIC Access) drivers PF_RING内核模块 用户态函数库 Libpcap-ring pfring-daq-module传统数据包捕获流程传统的数据包捕获流程如下(NAPI polling): 网卡中断处理程序 网卡接收程序 分配skb内存 将其放入softnet_data队列中 置软中断位 do_softirq net_rx_action iprecv IP层检查数据有效性 TCP/UDP协议处理 唤醒用户层进程PF_RING数据包捕获流程 PF_RING有三种数据包捕获模式,由插入模块时的参数transparent_mode控制:用PF_RING优化SNORT 网卡要求: 1 Gigabit/sec:Intel 82575/82576/82580/I350-based(Linux driver igb ) 10 Gigabit/sec:Intel 82598/82599based(Linux driver ixgbe) 优化步骤: 安装PF_RING的kernel模块 安装PF_RING的用户态 库 安装Snort的DAQ 安装PF_RING的pfring-daq-module 安装snort 安装PF_RING-aware网卡驱动数据包捕获优化性能对比首先进行千兆网络中小数据包高频率的测试,单数据包大小选取6。
