来源:A Survey on Network Security Monitoring Implementations
摘要:
网络监控是一项困难而艰巨的任务,是网络管理员工作的重要组成部分。网络管理员一直在努力保持他们的网络的平稳运行。如果一个网络即使在一段时间内关闭,公司内部的生产力也会下降,公共服务部门提供基本服务的能力也会受到影响。存在不同的网络安全方法。本文对当前网络监控方法的具体软件实现进行了概述。此外,它还对这些实现进行了比较。
1、背景
监视可以帮助网络和系统管理员在影响业务连续性之前识别可能的问题,并在网络中出现问题时找到问题的根本原因。无论是小于50个节点的小型企业,还是大于1000个节点的大型企业,持续监控都有助于开发和维护高性能的网络,而不需要停机。
为了使网络监控成为对网络的有益补充,监控设计应遵循基本原则。监控系统应该是全面的,涉及企业的各个方面,如网络和连接性、系统和安全性。如果系统提供了对网络的所有内容的单一窗格视图,包括报告、问题检测、解决方案和网络维护,那么它也会更好。此外,每个监控系统都应该提供能够满足不同级别的用户(网络和系统管理员)以及管理的报告。最重要的是,监控系统不应该过于复杂而难以理解和使用,也不应该缺乏基本的报告和深入的功能。
网络监控是一项困难而艰巨的任务,是网络管理员工作的重要组成部分。网络管理员一直在努力保持他们的网络的平稳运行。如果一个网络即使在一段时间内关闭,公司内部的生产力也会下降,公共服务部门提供基本服务的能力也会受到影响。为了保持主动而不是被动,管理员需要监控整个网络中的流量和性能,并验证网络中不会发生安全漏洞。
2、网络安全监控的实现
本节将当前的网络安全监视实现分为包捕获代表、深度包检查代表和基于流的观察代表。它还提供了关于开发新网络流量分析方法的特定工具的有用性的信息。
2.1.1 Tcpdump
Tcpdump是一个用于包捕获分析的命令行工具。Tcpdump可以使用libpcap库和PCAP格式捕获的包跟踪来分析实时流量。包可以在捕获前后进行过滤。在捕获之前使用BPF (Berkeley数据包过滤器)进行过滤。捕获后的过滤可以使用tcpdump的过滤器实现,本节后面将对此进行描述。数据以文本格式打印出来。输出显示带有包含源和目标地址、使用的L4协议和L4协议标志的信息的各个数据包。图1显示了两个包的输出。
可以使用表达式过滤要显示的数据包。过滤器可用于源和目标地址、端口、L3和L4协议以及L4协议标志。地址可以用单个地址的格式或CIDR表示法表示。表达式中的多个规则可以使用布尔运算符组合。图1中的示例使用了三个过滤器。src主机10.0.2.15只选择源自IP地址10.0.2.15的数据包。dst端口22只选择发送到端口22的数据包。最后,tcp[13] = 2选择包,其中第14字节的十进制值为2。过滤器是用and条件组成的,这意味着只有满足所有条件的数据包才能通过过滤器。
Tcpdump需要root权限才能打开网络接口。使用SUID或Linux功能可以不使用完整根的操作。授予tcpdump可执行cap net raw和cap net admin功能允许tcpdump作为常规用户运行。
2.1.2 Wireshark
Wireshark是一个用于包捕获分析的图形化工具。虽然Wireshark和tcpdump是同一体系结构方法的实现,但是它们的基本思想不同。Tcpdump尽可能接近原始数据,而Wireshark则力求提供相同数据的更高层表示。
Wireshark可以使用libpcap库分析实时流量,并以PCAP格式捕获数据包跟踪。捕获的信息包可以在传输期间和之后进行过滤。可以使用过滤器表达式实现捕获后的过滤。在捕获期间,可以使用BPF进行过滤。
数据显示为排列在可滚动彩色列表和可扩展框中的文本。Wireshark的主窗口有两个框架。上部框架显示捕获包的列表,并显示它们的基本属性。行可以根据每个包所属的协议进行着色。当用户在上部框架中选择包时,这个特定的数据包将显示在较低的帧中。下框架的表示包括几个可以展开和折叠的盒子。这些框包含包的各种属性,以及包在ISO OSI层数据中的数据表示(包是包的一部分)。另外,来自其他数据包的相关数据可以显示在那里,比如HTTP TCP流。
可以使用窗口顶部的文本框中输入的表达式对显示在上部框架中的数据包进行过滤。表达式词汇比tcpdump更丰富。图2显示了Wireshark的架构。
Wireshark使用一个单独的程序来捕获流量,dumpcap。原因是允许分离特权[25]。Wireshark可以作为常规用户运行,只有dumpcap才需要获得特殊权限。Dumpcap需要root特权才能打开网络接口。没有root权限的用户可以使用SUID或Linux功能进行操作。授予dumpcap可执行cap net raw和cap net admin功能后,就可以在没有SUID的情况下作为常规用户运行dumpcap。
2.2深度分组检查代表
2.2.1 Snort
Snort是一种使用模式匹配进行深度数据包检查的入侵检测系统。模式匹配以规则的形式实现。规则是描述感兴趣的网络流量数据的结构化文本文件。通常,规则用于在发生与安全相关的事件(如恶意软件活动、攻击或违反安全策略)时生成警报。规则包含指定何时触发规则的信息。这些信息的一个重要部分是在网络流量中搜索的一个或多个模式。模式可以是字符或字节序列或正则表达式。图3显示了Snort规则结构。
Snort规则具有特定的结构。圆括号前规则的开头描述了规则引用的网络流。这被称为规则头。规则头指定规则应该执行的操作(例如警报)、L3协议和源/目标IP地址和要匹配的端口。变量可以用来代替IP地址。括号内的其余规则称为规则选项。规则选项指定规则匹配的内容和规则的其他属性、名称、分类类型等等。规则的最重要部分是内容关键字,指定在包的有效负载中找到的模式。可以使用修饰符进一步更改content关键字的功能。例如,修饰符偏移量、距离、深度,以及在包的哪些区域匹配规则的控制范围内
Snort有三个特殊关键字:字节测试(byte_test)、字节跳转(byte_jump)和字节提取(byte_extract),它们允许基于单个数据包中的数据调整模式匹配。前两个关键字在它们的条件为真时表现为匹配的模式。字节测试执行算术(<≤=,>,≥)和位(或)比较的字节序列。字节跳转在下一个模式之前放置一个空间,它的大小是从有效负载的字节值推断出来的。如果跳转是可能的,字节跳转也表现为匹配。该行为可用于根据有效负载中的特定数据对数据包进行匹配。字节提取将指定的字节转换为可在规则后面使用的数值变量。这些关键字不允许更复杂的解码或处理。
Snort的体系结构允许实现所谓的预处理器。预处理程序在规则评估之前读取数据包,按照Snort的配置指定的顺序。这允许实现附加的规则关键字。此外,预处理程序允许实现比模式匹配更复杂的功能,例如数据解码和异常检测。例如,Normalizer预处理程序将等效的值转换为统一的格式,其目标是使IDS规避变得更加困难。图4中描述了Snort的架构,包括预处理器。
有几个用于异常检测的预处理程序。Frag3和stream5预处理器集成在正式的Snort分发版中并检测协议异常。SPADE[18]、PHAD[28]和snortad[2]是检测流量异常的第三方预处理程序。Snort预处理器通常在c中实现,它们允许实现与基于事件的体系结构中实现的概念类似的概念。
Snort需要root权限才能打开网络接口。可以配置Snort,在非根用户打开网络接口后将其特权删除。
Snort是一个单线程应用程序。多线程Snort设置的工作方式如下:被监视的流量按流划分为多个部分;流量的每个部分都被提供给一个Snort实例。
2.2.2 Suricata
Suricata是一种利用模式匹配进行深度分组检测的入侵检测系统。图5显示了Suricata规则结构,规则头和规则选项与Snort规则结构相同。
Suricata使用与Snort相似的规则,与Snort的规则相匹配。Snort和Suricata的规则结构都是相同的。两者之间的区别在于可以指定的关键字和协议。Suricata允许在支持Snort、http、ftp、tls、smb和dns的L3协议之上指定几个L7协议。有些关键字的行为与Snort不同,例如快速模式:与Snort不同,只有关键字对处理没有影响。有些关键字仅由Suricata支持,例如用于匹配IP声誉数据的iprep关键字和仅用于分析dns响应体的dns查询关键字。
Suricata的体系结构与Snort的体系结构有所不同。在Suricata中,与Snort体系结构中的预处理器部分对应的部分分为解码和检测两部分。我们通过研究源代码发现了这一点。解码模块向Suricata中包的内部表示添加信息。检测模块依赖于这种内部表示,并为规则提供关键字。Suricata架构的概述如图6所示。
每个数据包首先在解码函数中处理,然后在检测模块中处理。解码函数读取包并将解码后的数据保存到包的内部表示中。解码函数每次在包上被调用一次。通过实现一个新的解码函数并将其放入解码管道,可以扩展解码功能。解码管道从捕获包的来源开始,然后对L2进行解码,然后对更高层上的协议进行解码。
解码后,数据包通过检测。检测受规则控制,并依赖于解码步骤。规则与内部包表示相匹配。匹配过程被分成几个检测模块,在所有的检测模块中进行匹配。与解码不同,检测是并行的,一个包可以同时在多个检测模块中处理。通过实现新的检测模块并将其注册到检测方法表中,可以扩展检测功能。
Suricata是用C编写的,而Suricata的模块必须用C编写。C语言需要比Bro语言更丰富的编程知识。因此,这个属性使得Suricata不是最好的原型工具。Suricata是多线程的。尽管Suricata的速度不如单cpu计算机上的Snort快,但它可以在使用数十个cpu[24]的计算机上扩展。多线程方法与Snort不同。多线程Snort设置将被监视的流量按流划分为多个部分,每个部分由一个单独的Snort实例处理。另一方面,Suricata不需要流量平衡,因为它管理多线程本身。这种方法使它更加用户友好。
2.2.3 Bro
Bro是一个使用基于事件的分析执行深度包检查的网络安全监视器。与Snort和Suricata不同,Bro主要不受规则驱动。相反,它实现了turing - complete脚本环境。基于规则的检测和任意的检测算法都可以在这个环境中实现。Bro检测规则由脚本描述。图7显示了Bro架构。
Bro的脚本环境使用Bro编程语言。它是一种解释的、类型化的语言。它的特殊之处在于领域特定的类型。例如,addr类型包含一个IP地址。结构化类型的变量是引用类型变量。这使得处理大型集合或表变得高效,因为只有引用被复制,而不是数据本身。有两种类型的集合,集合和表格。循环通过集合以迭代的形式可用。Bro编程语言缺乏其他形式的循环控制,可能会阻止过于复杂的算法。这是实时处理时对网络流量监控的合理要求。这正是Bro最重要的目标,允许实时网络流量分析,并将已处理的结果保存到日志文件中。
Bro的默认安装包含许多实现各种流量分析的脚本。默认的Bro设置监视的一些项是:双向流、DHCP租赁、DNS查询和响应、通过未加密协议传输的文件的MD5和SHA1散列、HTTP请求和用户代理、端口扫描、SMTP通信的电子邮件头、成功和失败的SSH连接、SSL证书、SYSLOG消息、通信隧道。
由于预安装脚本通常以事件的形式公开API,因此用户脚本可以使用它们,扩展默认功能。
Bro的核心在C中实现,处理网络流量,执行DPI并生成关于流量中发生的事件。核心生成的事件列在bif文件中。生成了许多事件,从L2到L7。例如一个新的ARP包、封闭的TCP连接、HTTP请求等。换句话说,这种类型的DPI执行网络事件的语义匹配,而不是简单的模式匹配,而不是Snort和Suricata。大多数事件提供上下文,通常以有关相关连接的信息的形式提供。然后由Bro脚本处理这些事件。
Bro脚本使用所谓的事件处理程序侦听事件。人们对事件的反应各不相同。一方面,最简单的处理将事件信息保存到日志文件中。另一方面,一些脚本实现相当复杂的处理,并生成其他类型的事件。这进一步扩展了Bro的DPI能力。脚本可以处理由核心和其他脚本生成的事件。图8显示了一个非常短的模块,它只在Bro启动时将“Hello world!”写入标准输出。
脚本引擎托管脚本,并将脚本生成的事件和内核发送给监听这些事件的脚本。它还允许对操作系统本地的应用程序进行文件访问和执行等操作。高级脚本可以使用此功能。文件访问可用于从外部来源(如黑名单)获取信息。执行工具可以用于许多目的。一个例子是通过电子邮件向票据管理软件报告问题。sendmail的可执行程序可以被这样的脚本使用。另一个例子是通过执行一个程序来自动触发一个远程触发的黑洞。
Bro脚本是在所谓的模块中组织的。模块可以完全在一个文件中实现,也可以分解成几个文件。在两个不同的模块中,两个名称相同的标识符不会相互冲突。可以使用名称name of module::name of identifier进行跨模块引用。
模块可以定义类型、变量、函数和事件处理程序。这些实体可以是模块的本地实体,也可以是其他模块的全局可访问实体。
可以使用enum、set、table、vector和record定义自定义类型。在Bro中的Enum与其他语言中的Enum类似。Set的功能类似于c#中的HashSet<T>,尽管语法不同。表类似于c#中的Dictionary<Tkey,Tvalue>,与c#中有区别,c#只允许一个键,而Bro允许多个键。向量是一个用计数索引的表。Count在Bro中是int的名称。记录是类似于c#类只包含字段。Bro record和c#类都是引用类型,这意味着其实例的赋值只复制引用(指针),而不是整个实例。这可以与c# struct(一种值类型)进行比较,这意味着其实例的赋值复制了整个实例。
Bro可以作为单线程应用程序运行,也可以作为多线程分布式应用程序运行。单线程模式被称为独立的,而多线程的模式称为集群。如果将Bro用作概念验证方法的开发平台,那么独立模式通常比集群模式更合适。集群模式的开发比独立模式更困难,因为脚本必须使用其他功能。
2.3基于流的观测代表
基于流的观测体系结构包含两个主要部分;流导出器和流收集器。本节介绍流导出器和流收集器的代表性实现。
2.3.1流导出器
nProbe是一个开源流量的商业出口商。数据可以以NetFlow v5、NetFlow v9和IPFIX格式导出。nProbe有一个应用程序可视性(nDPI)能力,用于检测特定于应用程序的协议。此信息以NetFlow v9或IPFIX格式保存在自定义列中。获取nProbe源代码是很困难的。
YAF是一个开源流导出器。数据以IPFIX格式导出。基于p0f软件的被动OS指纹识别功能可以编译为YAF。YAF支持实现DPI的模块。但是,YAF不提供DPI默认设置。
QoF是YAF的一个分支。它删除了所有有效载荷检查能力,而将重点放在被动性能测量上。
ip -netflow是用于流导出的iptables插件。数据可以以NetFlow v5、NetFlow v9和IPFIX格式导出。除了标准的网络流之外,没有特殊的功能。对于高吞吐量网络也没有明显的关注。ipt-netflow是开源的。
pmacct是一个开源流导出器和流收集器。数据可以在NetFlow v5、NetFlow v9、sFlow v5和IPFIX格式中导出。支持高吞吐量网络使用PF环。pmacct中没有与dpi相关的功能。
softflowd是一个对NetFlow v1、v5和v9格式执行导出的开源流导出程序。除了常规的NetFlow数据导出之外,没有明显的努力提供任何内容。
2.3.2流收集器
nProbe不仅是一个流输出器,它还是一个流收集器。可用的存储后端有MySQL、SQLite、文本文件和二进制文件。之所以创建nProbe flow收集器,是因为它的作者认为当时其他收集器太麻烦,无法使用。
IPFIXcol是专为高吞吐量网络设计的IPFIX收集器。IPFIXcol声称自己很灵活。存储后端可以使用输出插件进行定制。IPFIXcol还允许实现所谓的IPFIX中介器,用于在数据到达收集器之前处理收集到的数据。
flowd是一个NetFlow v1、v5、v7和v9收集器。它是在UNIX哲学下创建的,只做一件事。收集的数据以二进制格式保存。flowd提供了用于读取二进制数据的Perl和Python接口。flowd使用组件的特权分离来争取安全。flowd是开源的,并且是免费的。
nfdump由几个工具组成。nfcapd工具监听NetFlow v5、v7、v9流,并将它们保存到nfcap文件中。nfdump工具可以用来分析nfcap文件。nfdump使用类似于tcpdump的过滤器语法。nfdump是开源的,并且是免费的。
pmacct作为一个收集器有几个可用的存储后端。它可以使用MySQL、PostgreSQL、SQLite、MongoDB、BerkeleyDB和平面文件。在其他格式中,它可以收集NetFlow v1-v9和IPFIX。
SiLK是NetFlow v5、v9和IPFIX数据的收集器。它是为高吞吐量网络设计的。SiLK由用于过滤、分析和处理流数据的多种工具和插件组成。
3、比较
对于适合于DPI的网络流量监视器的选择,对每个被提及的流量监视器都进行了以下标准的评估:
•原型:网络流量监控是否适合创建方法原型?
•开发人员友好性:网络流量监控是否允许以一种易于使用的方式开发新的流量分析方法?
•可扩展性:是否有可能以合理的方式扩展网络流量监视器的现有功能?API使用什么编程语言?
本文对各个网络流量监测仪的描述表明了对这些标准的回答。表1显示了总结。
4、结论
网络监控有几种不同的方法。每种方法都适合于不同的目的。Wireshark适合手工分析,主要是小型捕获文件;Tcpdump是面向包的,在使用L3/L4属性(如IP地址、TCP标志、有效负载字节等)过滤单个数据包的情况下非常有效,对于流重组或L7协议分析来说,它并不适用。当目标是匹配网络数据中的模式时,Snort和Suricata工作得很好;Bro允许开发高级检测方法。
Bro是开发新检测或处理技术的最佳软件/环境。它可用于高吞吐量网络的连续监控;脚本环境可以在专门用于网络数据处理的内存安全语言中扩展;与其他工具一样,它不受限于属于网络监控的单一范式。与wireshark、tshark、snort和suricata等更知名的工具相比,不熟悉是一个缺点。