Snort技术介绍

本章描述:

          这章表述了Snort的基本概览和它的框架

本章内容:

  • 了解Snort是什么
  • 讨论Snort的基本框架组件
  • 了解Snort动态插件功能(dynamic plug-in capabilities)

什么是Snort?


Snort是一个由Martin Roesch开发的应用程序,作为IDS/IPS现今非常流行,Snort还能做更多事情:

  • 数据包嗅探
  • 数据包记录
  • 入侵检测

此外,Snort支持很多类型的操作系统,包括许多版本的UNIX平台与Windows系统。另一个特性,Snort是完全开源的。这给了Snort比它的商业副本有很大的优势,因为用户可以看到它在做什么事情和适当的定制系统。在商业化IDS/IPS的世界,能有这样产品的内部可见性程度是不可能的。它免费使用和大量平台的支持,使Snort成为最流行的网络安全工具之一。

Snort 基础架构

Snort有四个主要组件

  • 嗅探器
  • 预处理器
  • 检测引擎
  • 输出和报警模块

在接下来的章节里,每一个组件都会用大量的篇幅来讨论。

数据包嗅探


数据包嗅探是在网线中去读取数据报文的动作。通常,设备网卡只关心传输到自己的地址的流量。然而,Snort的嗅探组件会设置接口进入到混杂模式(promiscuous mode),在该模式下,网卡能够读取网线上所有的流量,而不只是传输给自己的流量。

Snort的数据包嗅探器

Snort使用DAQ去收集网线上的数据包,在不同类型抓包库与Snort之间DAQ服务于抽象层,DAQ的好处在于,使用不同抓包库时不需要重新编译Snort。DAQ支持passive与inline两种操作。要选择DAQ模式,可以启动的时候通过命令行参数或者配置文件。默认收集数据包的方法,如果没有指定参数就是pcap。

DAQ Data AcQuisition Module 数据获取模块

运行模式包含:

  • PCAP - 默认DAQ
  • AFPacket - 功能类似pcap DAQ,但是有更好的性能,这个也允许inline操作
  • IPQ - 这是一个处理iptables数据包很老的方法,它替代了之前Snort版本的编译选项 --enable-inline
  • NFQ - 这是处理iptables数据的新的以及改善后的方法
  • IPFW - 被用于BSD系统,它替代了编译选项 --enable-ipfw

DAQ杂乱的提取网线上的数据,并且将它们传递给解码引擎。Libpcap 1.0.0或者更后的必须安装在DAQ之前。作为分开的组件,DAQ必须在SNORT之前编译。

数据包解码

为了让Snort知道什么在数据包里面,必须要表示为 数据包的每一个字段从二层协议开始到应用协议负载都被正确解析。Snort焦距于TCP/IP解码。其他网络协议只会在二层被解码,所以只能被标识,不会有更多的动作。

Snort存储在内存数据结构里解码后的数据包信息,并且分别传递到Snort架构的其他元素,预处理器、检测引擎、输出处理器。

预处理器


为了让数据包能以上下文关联的方式被检测到,对数据包还需要做更多的处理去揭露数据包的用途上下文。

比如:

  • 数据包是不是一个TCP通信的一部分?如果是,里面用了什么协议?
  • 数据包被分片了吗?如果是,在被检测之前能够正确重组吗?
  • 被标识属于特定协议的数据包,里面正在使用该协议的参数是否正确?

意思这些列子所描述的事情必须要完成,数据包才可以表示为上下文关联的方式。Snort预处理器操作这些任务,它们专门被设计来将网络流量表示为上下文,给到Snort架构的其他元素。

Snort标准发布版有几个量身定做的预处理器,下面的列表
提供了一些主要的抽样:

  • Protocol Decoders - 这些预处理器用来标准化TCP流,包括:telnet、ftp、smtp、rpc.
  • http_inspect - 这个预处理器用来标准化http流量
  • frag3 - 用来在检测之前重组数据包分片
  • stream5 - 用来重组TCP数据流,使TCP会话能被完成检测,而不是组成该数据流独立的数据包
  • DCE/RPC2 - 用来给DCE流量解码和解分片
  • sfPortscan - 端口扫描检测插件

预处理器在网络流量检测中起着至关重要的作用。 除了标准化流量与表示为上下文相关的数据发送到检测引擎
,预处理器也有能力报警,如果它检测到由配置定义的异常条件。

检测引擎


检测引擎接收解析过的、标准化的和流重组的网络流量,对规则库进行检测。检测引擎实际上有两个组件去执行检测的动作:

  • 规则构建器
  • 对构建规则的检测

在启动时,Snort规则构建器会遍历所有规则文件以查看规则和重组它们,对网络流量评估,就源IP、目的IP与源端口、目的端口而言使检测得到优化和冗余,不会在构建中重复。规则链被生成,更多细节将在后续章节讨论。

网络流量的检测发生在形成规则链构建的过程中,Snort规则的结构相当的简单,具有如下定义:

  • 规则头部 - 这部分提供有关数据包从哪里来、它将去哪里、要干什么事情等基本信息,如果匹配成功,规则里的协议就会匹配
  • 规则选项 - 这部分提供要特定检索的信息,用于在分组有效载荷或某些报头字段中触发匹配。例如,规则中的选项,在内容选项定义的特定字符串的出现可能会触发一次匹配

规则语法通过提供最相关的规则匹配信息来促进规则链中规则的匹配。 当信息匹配发生时,将根据匹配的规则链中的选项进一步检查数据包。 Snort规则定义了对通过规则匹配的事件采取的操作。 IDS模式下可用的操作如下所示:

  • Pass - 忽略 匹配到在规则描述中所有的参数的数据包
  • Alert - 生成报警和记录触发它的数据包
  • Log - 记录匹配规则参数的流量,但不报警

输出模块


输出模块处理写入和显示事件的任务,Snort生成的数据可以表示为标准输出、记录到日志文件或者数据库。输出模块多少有些唯一性,因为它能从各种源接收输入,如下:

  • 数据包解码器生产tcpdump风格的输出
  • 在检测和重组数据包和数据流中检测到异常情况,预处理器可以直接发送报警到输出模块
  • 当规则被匹配,检测引擎发送日志和报警数据到输出模块

当Snort作为嗅探器运行,输出模块接收从解码器解码后的数据包。没有配置文件启动的情况,任何时候Snort都运行在这个模式下。这个模式基本将数据以类tcpdump的样式写到屏幕或者日志文件。

在入侵检测模式下,输出模块可以直接以ASCII或者pcap格式发送日志和报警到文件,这些格式可以被许多应用程序识别,包括tcpdump、Wireshark和Snort等等,你也能直接输出到syslog或者数据库。还存在最后一个输出选项叫统一输出(unified output)。

统一输出是一种非常轻量级的二进制格式的输出。 这种类型的输出可以被称为Barnyard的应用程序读取,该应用程序采用统一输出,并将其转换为其他形式的输出,就像Snort的输出模块一样。 具有专门为操纵输出而构建的第二个进程可以减轻Snort的一些处理负担。 在此配置中实施Snort可以提高性能,对于在较高利用率网络环境中优化IDS / IPS可能至关重要。

动态插件


Snort从2.6版开始的其中一个功能是可以在Snort初始化时加载自定义模块。 模块可以是以下之一:

  • 规则
  • 预处理器
  • 检测引擎

动态模块是可以用C编写的组件,它利用了Snort 2.6中提供的相关API,这使得程序员可以直接访问已经执行的Snort引擎的函数。这使得安全分析人员能够比老套的规则语言编写更多Snort的特定检测功能。 通过在snort.conf文件添加配置指令,随着Snort初始化这些模块被独立加载。

本章总结


该模块介绍了Snort及其架构组件的快照。 在下面的部分中,将详细探讨这些组件。

results matching ""

    No results matching ""