狠狠撸

狠狠撸Share a Scribd company logo
厂狈翱搁罢原理介绍与优化及
    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调用底层函数库,捕获来                      输出
    自网络的数据包
? 解码模块                              数据包规则匹配
  – 对捕获的数据包进行协议解码      Snort
? 预处理模块                              数据包预处理
  – 以插件形式存在,对IP分片进行
    重组,防止ARP欺骗等等                      数据包解码
? 规则匹配模块               DAQ(Data Acquisition library)
  – 根据设置的规则对数据包进行匹
    配                  PCAP    PFPACKET   NFQ   IPFW
? 输出模块
  – 以插件形式存在,当匹配成功时
    进行记录或报警
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:指向相关的OTN。
  –   RuleFpList *rule_func:规则匹配函数。

? OTN结构中主要包括:
  – OptFpList *opt_func:规则匹配函数。
  – void *ds_list[PLUGIN_MAX]:插件需要的数据结构指针。
  – RuleTreeNode **proto_nodes:指向其关联的RTN。
Snort原理分析--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/CheckDstPortEqual
     ? CheckSrcIP/CheckDstIP
     ? RuleListEnd: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原理分析--快速规则匹配初始化
? fpCreateFastPacketDetec
  tion:构建快速规则匹配
  结构:
   – 第一层是由四个
     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_RING
? PF_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控制:

                                                                   Packet Capture
 Mode     Standard driver            PF_RING-aware driver
                                                                    Acceleration
                                                                   Same as Vanilla
  0             Packets are received through Linux NAPI
                                                                        Linux
                                Packets are passed to NAPI (for
                                sending them to PF_RING-unaware
                                    applications) and copied
        Packets are received
  1                                 directly to PF_RING for           Limited
         through Linux NAPI
                                PF_RING-aware applications (i.e.
                                 PF_RING does not need NAPI for
                                       receiving packets)
          The driver sends
                                  The driver copies packets
           packets only to
                                directly to PF_RING only (i.e.
  2      PF_RING so PF_RING-                                          Extreme
                                  NAPI does not receive any
        unaware applications
                                            packet)
        do not see any packet
用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
  字节,分别测试发送1000到20000个数据包,测试结果如下:

           发包频率             未优化前snort报   PF_RING优化后
 发包数量            实际带宽(MB/s)
          (万次/秒)               警数         snort报警数
  1000     19.6     8.6        1000         1000
  1500      20       9         1316         1500

  2000      21      9.4        1316         2000

  4000      25       11        1317         4000

  8000      31      13.6       1316         8000

  10000     33       14        1316         10000

  20000    35.4      15        1316         20000
数据包捕获优化性能对比
? 然后进行千兆网络中大数据包高带宽的测试,数据包发送个数
  1000,分别测试包大小从6B至1K时的报警数量,测试结果如下:

             发包频率                         PF_RING优化
  数据包大小              实际带宽     未优化前snort
                                          后snort报警
   (Byte)   (万次/秒)   (MB/s)     报警数
                                              数
     10      20.4     9.76       1000       1000
     20      20.2     11.55      983        1000
     40      20.48    15.63      795        1000
     80      20.2     23.12      582        1000
    100      20.17    26.93      507        1000
    200      20.58    47.11      313        1000
    400      20.07    84.24      182        1000
    800      19.5    106.76      130        1000
    1000     18.65   114.93      125        1000
迈向万兆网络

? 用PF_RING优化过的snort,已经完全满足了千兆网络的
  要求。但是对于每秒几十Gbit的网络流量来说,千兆网络
  还远远不够。我们需要一种可以工作在万兆网络中的IDS
  系统。

? 首先需解决数据包捕获问题。目前支持万兆线速包捕获的
  方式有:
 – TNAPI(Threaded NAPI)
 – NIC(Direct NIC Access)
万兆网络数据包捕获--TNAPI
? 支持MSI-X 中断
  (Message Signaled
  Interrupts)的网卡可以
  将RX队列分解为多个,
  每个对应一个核。MSI-
  X使得设备可以最多分
  配2048个中断,而且每
  个都可以有独立的地址。
? 但是常规内核无法发挥
  其优势,原因为:
  – 操作系统合并多个RX到
    单个ethX接口,对于万
    兆网络是不可接受的
  – 多个线程将竞争同一个
    ethX
万兆网络数据包捕获--TNAPI
? TNAPI通过将内核RX
  队列直接暴露给用户
  态程序。使得:
  – 流量真正分布到多
    个核
  – 同时从每个RX队列
    轮询包
  – 通过PF_RING,应用
    层可以针对每个RX
    队列分配一个线程

? 系统结构如右图所示。
Snort multiprocessing with PF_RING+TNAPI

? 有了以上技术作为前提,我们设计出第一套针对万兆网络
  的IDS系统(处理性能将达到5Gbps以上):
  Snort multiprocessing with PF_RING+TNAPI
  系统采用PF_RING+TNAPI的抓包方式线速获取万兆网络
  的数据包,然后送给多个Snort进程进行处理。

? 该系统的优点为:不但解决了抓包效率的问题,还通过开
  启多个Snort进程解决了数据包处理效率的问题。
Snort multiprocessing with PF_RING+TNAPI

? 系统硬件推荐如下:(双路服务器)
 – 网卡:Intel 82598/82599万兆网卡 x2
 – CPU:Intel Xeon X5675 (6核心,12线程)x 2
 – 内存:24G

? 该系统软件构建过程如下:
 – 插入网卡驱动模块时,设置IntMode参数为3:
   insmod ./<driver name>.ko IntMode=3 (enables MSI-X)
 – 用ICC编译snort程序(ICC会对将程序针对intel平台进行优化)
 – 针对每块万兆网卡,启动12个snort进程:
   snort --daq-dir=/usr/local/lib/daq --daq pfring --daq-mode passive
   -i eth0@0 -c /etc/snort/snort.conf
   .......
万兆网络数据包捕获--DNA
? DNA (Direct NIC Access)是一种将NIC的内存直接映射到用户
  空间的技术。由NPU (Network Process Unit) 负责将数据包拷
  贝到ring中,大大节省了CPU资源。
Snort multiprocessing with PF_RING+DNA

? DNA 也可以将网卡RX队列分为多个,但是每个队列
  只能由一个用户态进程访问。其RX队列上限会被具
  体硬件所限制。(现代的NIC一般可分16个以上的
  RX队列)

? 安装方法如下:
 – 编译并插入网卡的DNA驱动。
 – 针对每块万兆网卡,启动12个snort进程:
   snort --daq-dir=/usr/local/lib/daq --daq pfring --daq-mode
   passive -i dna0@0 -c /etc/snort/snort.conf
Gnort--GPU介绍
? 目前,主流GPU的单精度浮点处理能力已经达到了同时期
  的CPU的10倍左右,而其外部的存储器带宽则是CPU的5
  倍左右。
? 近几年来GPU的性能每一年都可以翻一倍,大大超过了
  CPU遵循的摩尔定律。
? GPU在逻辑性处理上有很大不足,导致一般程序都需要
  CPU+GPU的异构并行方式在GPU上执行。
? 2007年6月,NVIDIA推出了CUDA(Compute Unified
  Device Architecture,统一计算设备架构)。CUDA采用类c语
  言进行开发。
Gnort--NIDS using GPU
? Gnort是一套采用CPU+GPU异构并行的NIDS系统。
? 其中CPU负责捕获数据包,并进行解码与预处理等工作。而GPU负责具
  体的规则检测。最终GPU将检测结果发回CPU做进一步处理。(输出)
? Gnort通过将数据包的模式匹配放到GPU上并行执行,大大缩短匹配时
  间。实际测试中,其效率较CPU至少提升了一倍。
AC模式匹配算法介绍
? AC算法思想:用多模式串建立一个
  确定性的树形有限状态机,以主串
  作为该有限状态机的输入,使状态
  机进行状态的转换,当到达某些特
  定的状态时,说明发生模式匹配。

? AC模式匹配算法分为预处理阶段与
  匹配阶段。在预处理阶段,AC自动
  机算法建立了三个函数,转向函数
  goto,失效函数failure和输出函
  数output,由此构造了一个树型有
  限自动机。

? AC模式匹配的时间复杂度为O(n)。

? 右图为模式串为:he/ she/ hers/
  his 时的三类函数。
础颁模式匹配算法在骋笔鲍上的实现
? 谢谢!

More Related Content

厂苍辞谤迟分析评估

  • 2. 主要内容 ? Snort原理是什么? ? Snort在实际应用中的缺陷有哪些? ? 如何对Snort进行优化? ? Gnort初探。
  • 3. 入侵检测系统的基本结构 入侵检测系统通常包括三功能 部件: ? 信息收集,其来源如下: – 系统或网络的日志文件 – 网络流量 – 系统目录或文件的异常变化 – 程序执行中的异常行为 ? 信息分析 – 模式匹配 – 统计分析 – 完整性分析 ? 结果处理 – 对异常进行记录/报警等
  • 5. Snort--基于特征检测的NIDS ? 在1998年,Martin Roesch先生用C语言开发了开放源代码(Open Source)的入侵检测系统Snort.直至今天,Snort已发展成为一个多平 台(Multi-Platform),实时(Real-Time)流量分析,网络IP数据包记录等 特性的强大的网络入侵检测/防御系统(Network Intrusion Detection/Prevention System),即NIDS/NIPS. ? Snort有三种工作模式:嗅探器、数据包记录器、网络入侵检测系 统。 – 嗅探器模式仅仅是从网络上读取数据包并作为连续不断的流显示在终端上。 – 数据包记录器模式把数据包记录到硬盘上。 – 网路入侵检测模式是最复杂的,而且是可配置的。我们可以让snort分析网 络数据流以匹配用户定义的一些规则,并根据检测结果采取一定的动作。
  • 6. Snort的结构组成 Snort主要包含以下模块: ? 数据包捕获模块: – 通过DAQ调用底层函数库,捕获来 输出 自网络的数据包 ? 解码模块 数据包规则匹配 – 对捕获的数据包进行协议解码 Snort ? 预处理模块 数据包预处理 – 以插件形式存在,对IP分片进行 重组,防止ARP欺骗等等 数据包解码 ? 规则匹配模块 DAQ(Data Acquisition library) – 根据设置的规则对数据包进行匹 配 PCAP PFPACKET NFQ IPFW ? 输出模块 – 以插件形式存在,当匹配成功时 进行记录或报警
  • 7. Snort原理分析--数据包解码 ? 在Snort内部用Packet 数据结构表示一个数 据包。数据包解码模 块负责根据捕获到的 数据包初始化Packet 数据结构。(该结构 定义在decode.h中) ? 数据包解码函数均定 义在decode.c中,由 grinder指针指向其入 口函数。解码流程如 右图所示。最后生成 完整的Packet结构。
  • 8. Snort原理分析--数据包预处理介绍 ? 解码后的数据包还需经过预处理才能被主探测引擎进行规则 匹配。预处理器的主要用来应对一些IDS攻击手段。其作用 包括: – 针对可以行为检查包或修改包,以便探测引擎能对其正确解释。 – 负责对流量标准化,以便探测引擎能精确匹配特征。 ? 目前已知的IDS逃避技术主要有: – 多态URL编码; – 多态shellcode; – 会话分割; – IP碎片;
  • 9. Snort原理分析--预处理器介绍 Snort主要包含以下预处理器: ? 包重组预处理器: – Frag3:IP分片重组和攻击监测。 – Stream5:维持TCP流状态,进行会话重组。 ? 协议规范化预处理器: – HttpInspect:规范HTTP流,如将Unicode或hex翻译成snort可以识别的 字符集。 – RpcDecode:规范RPC调用。 ? 异常检测预处理器: – ARPspoof:检测ARP欺骗。 – SfPortscan:检测端口扫描。 ? 在Snort中,捕获的数据包要经过所有已经打开的预处理器。预处理 器是由插件来实现的,这样的好处为: – 可以根据实际环境启动或停止一个预处理插件,提高Snort效率。 – 可以灵活添加自己编写的预处理插件,预防新型的IDS逃避手段。(如何编 写预处理插件在源码doc/README.PLUGINS中有初步介绍)
  • 10. Snort原理分析--预处理器初始化 Snort预处理器初始化流程如下: ? 首先调用RegisterPreprocessors函数,将所有预处理插件注 册进全局preproc_config_funcs链表中,内容包括:关键字 及相关预处理插件的初始化函数等。 ? 调用ConfigurePreprocessors函数,根据配置文件和命令行 参数遍历preproc_config_funcs链表,比对关键字。如相同 则运行预处理插件的初始化函数。 ? 预处理插件的初始化函数通过调用AddFuncToPreprocList将 其实际的预处理函数添加到preproc_eval_funcs链表中,插 入时会根据预处理插件的priority进行排序。 ? 当程序捕获到数据包时,首先通过grinder指向的函数进行解 码。然后执调用preproc_eval_funcs链中的预处理程序进行 预处理。
  • 11. 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=";.....)
  • 12. Snort原理分析--规则表现形式 ? 在Snort中,规则头由RuleTreeNode(RTN)结构表示,规则选项由 OptTreeNode(OTN)表示。 ? RTN结构中主要包括: – IpAddrSet *sip,*dip:源IP地址,目的IP地址。 – PortObject *src_portobject,*dst_portobject:源端口,目的端口。 – OptTreeNode *down:指向相关的OTN。 – RuleFpList *rule_func:规则匹配函数。 ? OTN结构中主要包括: – OptFpList *opt_func:规则匹配函数。 – void *ds_list[PLUGIN_MAX]:插件需要的数据结构指针。 – RuleTreeNode **proto_nodes:指向其关联的RTN。
  • 13. Snort原理分析--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/CheckDstPortEqual ? CheckSrcIP/CheckDstIP ? RuleListEnd:rule_func的链结尾函数 ? 匹配RTN时会依次执行rule_func链表中的函数进行匹配,如匹配不成 功则返回0。最终如果执行到RuleListEnd函数则表明匹配成功。
  • 14. 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链的末尾
  • 15. Snort原理分析--快速规则匹配初始化 ? fpCreateFastPacketDetec tion:构建快速规则匹配 结构: – 第一层是由四个 PORT_RULE_MAP构成,分 别对应TCP,UDP,ICMP及 其他IP协议。 – 第二层由PORT_GROUP结构 构成,分别对应源端口、 目的端口及通用端口三种 – 第三层由RULE_NODE结构 构成,分别对应以下三类 规则: ? uri-content:URI中的包 含规则; ? Content:内容包含规则; ? non-content:非 content规则。
  • 16. 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链中的匹配函数。 ? 如均匹配成功,则最后会调用输出插件进行输出。
  • 17. Snort目前存在的问题 ? snort是一款轻量级的网络入侵检测系统。如果将其应 用在大规模、大流量的网络中,snort的报警性能会非 常低下。可见snort以下两方面的效率还无法满足我们 的需求: –数据包捕获效率 –数据包分析处理效率 ? 改进思路为: –首先需保证snort可以捕获到网络中的所有数据包。 –然后需要保证这些数据包可以及时得到处理。
  • 18. 高效的数据包捕获接口--PF_RING ? PF_RING是一个第三方的内核数 据包捕获接口,类似于libpcap。 它提供一种PF_RING类型的套接 字,大大增加了数据包捕获的 效率。 ? 它包括三方面的内容: – 网卡驱动程序 ? PF_RING-aware drivers ? User-space DNA (Direct NIC Access) drivers – PF_RING内核模块 – 用户态函数库 ? Libpcap-ring ? pfring-daq-module
  • 19. 传统数据包捕获流程 ? 传统的数据包捕获流程如下(NAPI polling): – 网卡中断处理程序 – 网卡接收程序 – 分配skb内存 – 将其放入softnet_data队列中 – 置软中断位 – do_softirq – net_rx_action – iprecv – IP层检查数据有效性 – TCP/UDP协议处理 – 唤醒用户层进程
  • 20. PF_RING数据包捕获流程 ? PF_RING有三种数据包捕获模式,由插入模块时的参 数transparent_mode控制: Packet Capture Mode Standard driver PF_RING-aware driver Acceleration Same as Vanilla 0 Packets are received through Linux NAPI Linux Packets are passed to NAPI (for sending them to PF_RING-unaware applications) and copied Packets are received 1 directly to PF_RING for Limited through Linux NAPI PF_RING-aware applications (i.e. PF_RING does not need NAPI for receiving packets) The driver sends The driver copies packets packets only to directly to PF_RING only (i.e. 2 PF_RING so PF_RING- Extreme NAPI does not receive any unaware applications packet) do not see any packet
  • 21. 用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网卡驱动
  • 22. 数据包捕获优化性能对比 ? 首先进行千兆网络中小数据包高频率的测试,单数据包大小选取6 字节,分别测试发送1000到20000个数据包,测试结果如下: 发包频率 未优化前snort报 PF_RING优化后 发包数量 实际带宽(MB/s) (万次/秒) 警数 snort报警数 1000 19.6 8.6 1000 1000 1500 20 9 1316 1500 2000 21 9.4 1316 2000 4000 25 11 1317 4000 8000 31 13.6 1316 8000 10000 33 14 1316 10000 20000 35.4 15 1316 20000
  • 23. 数据包捕获优化性能对比 ? 然后进行千兆网络中大数据包高带宽的测试,数据包发送个数 1000,分别测试包大小从6B至1K时的报警数量,测试结果如下: 发包频率 PF_RING优化 数据包大小 实际带宽 未优化前snort 后snort报警 (Byte) (万次/秒) (MB/s) 报警数 数 10 20.4 9.76 1000 1000 20 20.2 11.55 983 1000 40 20.48 15.63 795 1000 80 20.2 23.12 582 1000 100 20.17 26.93 507 1000 200 20.58 47.11 313 1000 400 20.07 84.24 182 1000 800 19.5 106.76 130 1000 1000 18.65 114.93 125 1000
  • 24. 迈向万兆网络 ? 用PF_RING优化过的snort,已经完全满足了千兆网络的 要求。但是对于每秒几十Gbit的网络流量来说,千兆网络 还远远不够。我们需要一种可以工作在万兆网络中的IDS 系统。 ? 首先需解决数据包捕获问题。目前支持万兆线速包捕获的 方式有: – TNAPI(Threaded NAPI) – NIC(Direct NIC Access)
  • 25. 万兆网络数据包捕获--TNAPI ? 支持MSI-X 中断 (Message Signaled Interrupts)的网卡可以 将RX队列分解为多个, 每个对应一个核。MSI- X使得设备可以最多分 配2048个中断,而且每 个都可以有独立的地址。 ? 但是常规内核无法发挥 其优势,原因为: – 操作系统合并多个RX到 单个ethX接口,对于万 兆网络是不可接受的 – 多个线程将竞争同一个 ethX
  • 26. 万兆网络数据包捕获--TNAPI ? TNAPI通过将内核RX 队列直接暴露给用户 态程序。使得: – 流量真正分布到多 个核 – 同时从每个RX队列 轮询包 – 通过PF_RING,应用 层可以针对每个RX 队列分配一个线程 ? 系统结构如右图所示。
  • 27. Snort multiprocessing with PF_RING+TNAPI ? 有了以上技术作为前提,我们设计出第一套针对万兆网络 的IDS系统(处理性能将达到5Gbps以上): Snort multiprocessing with PF_RING+TNAPI 系统采用PF_RING+TNAPI的抓包方式线速获取万兆网络 的数据包,然后送给多个Snort进程进行处理。 ? 该系统的优点为:不但解决了抓包效率的问题,还通过开 启多个Snort进程解决了数据包处理效率的问题。
  • 28. Snort multiprocessing with PF_RING+TNAPI ? 系统硬件推荐如下:(双路服务器) – 网卡:Intel 82598/82599万兆网卡 x2 – CPU:Intel Xeon X5675 (6核心,12线程)x 2 – 内存:24G ? 该系统软件构建过程如下: – 插入网卡驱动模块时,设置IntMode参数为3: insmod ./<driver name>.ko IntMode=3 (enables MSI-X) – 用ICC编译snort程序(ICC会对将程序针对intel平台进行优化) – 针对每块万兆网卡,启动12个snort进程: snort --daq-dir=/usr/local/lib/daq --daq pfring --daq-mode passive -i eth0@0 -c /etc/snort/snort.conf .......
  • 29. 万兆网络数据包捕获--DNA ? DNA (Direct NIC Access)是一种将NIC的内存直接映射到用户 空间的技术。由NPU (Network Process Unit) 负责将数据包拷 贝到ring中,大大节省了CPU资源。
  • 30. Snort multiprocessing with PF_RING+DNA ? DNA 也可以将网卡RX队列分为多个,但是每个队列 只能由一个用户态进程访问。其RX队列上限会被具 体硬件所限制。(现代的NIC一般可分16个以上的 RX队列) ? 安装方法如下: – 编译并插入网卡的DNA驱动。 – 针对每块万兆网卡,启动12个snort进程: snort --daq-dir=/usr/local/lib/daq --daq pfring --daq-mode passive -i dna0@0 -c /etc/snort/snort.conf
  • 31. Gnort--GPU介绍 ? 目前,主流GPU的单精度浮点处理能力已经达到了同时期 的CPU的10倍左右,而其外部的存储器带宽则是CPU的5 倍左右。 ? 近几年来GPU的性能每一年都可以翻一倍,大大超过了 CPU遵循的摩尔定律。 ? GPU在逻辑性处理上有很大不足,导致一般程序都需要 CPU+GPU的异构并行方式在GPU上执行。 ? 2007年6月,NVIDIA推出了CUDA(Compute Unified Device Architecture,统一计算设备架构)。CUDA采用类c语 言进行开发。
  • 32. Gnort--NIDS using GPU ? Gnort是一套采用CPU+GPU异构并行的NIDS系统。 ? 其中CPU负责捕获数据包,并进行解码与预处理等工作。而GPU负责具 体的规则检测。最终GPU将检测结果发回CPU做进一步处理。(输出) ? Gnort通过将数据包的模式匹配放到GPU上并行执行,大大缩短匹配时 间。实际测试中,其效率较CPU至少提升了一倍。
  • 33. AC模式匹配算法介绍 ? AC算法思想:用多模式串建立一个 确定性的树形有限状态机,以主串 作为该有限状态机的输入,使状态 机进行状态的转换,当到达某些特 定的状态时,说明发生模式匹配。 ? AC模式匹配算法分为预处理阶段与 匹配阶段。在预处理阶段,AC自动 机算法建立了三个函数,转向函数 goto,失效函数failure和输出函 数output,由此构造了一个树型有 限自动机。 ? AC模式匹配的时间复杂度为O(n)。 ? 右图为模式串为:he/ she/ hers/ his 时的三类函数。