来源:《NEMEA: A Framework for Network Traffic Analysis》,2016
摘要:由于网络攻击变得更加复杂,使用传统的分析工具很难发现它们。对于某些类型的攻击,需要分析应用层(L7)信息以检测它们。然而,缺少能够进行L7处理和操作的现有工具。因此,我们提出了一种基于流程的模块化网络测量分析(NEMEA)系统来克服这种情况。NEMEA是针对一个流的概念设计的,即数据在内存中以最小的数据存储的方式不断地进行分析。NEMEA是作为一个开源项目而开发的,并且可以在全世界范围内公开使用。它是为实验和操作使用而设计的。它能够处理离线的流量跟踪和实时网络流。该系统非常灵活,可以通过新模块轻松扩展。这些模块是在一个NEMEA框架中开发的,它是项目的一个关键组件。因此,NEMEA代表了一种新的交通分析方法的研究和开发的统一平台。它涵盖了不限于分析和检测的几个重要主题。最初,NEMEA是为了捷克国家研究和教育网络运营商而开发的。因此,它的重点是处理高速网络流量,并以100 Gbps的速度运行。
1、背景
监控计算机网络是每个网络运营商的重要任务。监视系统可以提供关于网络基础设施的状态和利用的有价值的信息。由于计算机网络的重要性、用户的安全以及他们的数据,必须牢记网络安全。由于通过现代网络基础设施传输的大量数据,监视系统通常将有关流量的信息聚合为更小的流记录。这些传统包括网络地址、端口、时间戳和大小信息。该数据可用于记录、统计分析以提高态势感知或异常检测。在[1], [2]中可以找到基于流的网络监视概念的概述。
由于网络攻击变得越来越复杂和隐蔽,在正常的良性流量中有时很难识别它们。基于传统流量记录的恶意流量检测方法有几种。这些记录甚至可以用于检测应用程序层(L7)(如SSH bruteforce[3])中的一些攻击。然而,对于某些类型的恶意流量,传统的流记录是不够的,需要L7头信息来进行可靠的检测。然而,在当前流分析工具中,L7信息并没有得到很好的支持。
为了克服现有工具的不足,我们开发了一个新的在线流量分析和异常检测平台,能够进行L7数据处理——网络测量分析(NEMEA)。图1显示了一个典型的流量监测基础结构,其流量分析由NEMEA完成。该网络由监视探针(流导出器)监控,它将流数据以流记录的形式发送到中央收集器。这些探针包含从L7协议解析所选信息的插件,并通过该信息扩展流记录。IPFIX协议用于传输这些数据。在CESNET2网络(捷克NREN)的部署中,我们使用基于硬件加速的特殊设备的FlowMon[4]探测,以处理无采样的主干通信(高达100 Gbps)。但是,任何能够解析L7协议的流导出器都可以使用。收集器通常存储已收到的流记录,在我们的情况下,收集器(IPFIXcol[5])将它们重新发送给NEMEA系统。与收集器的获取的数据包是分析数据的来源。分析的结果是各种检测机制产生的流量和警报的统计数据。
NEMEA于2013年在我们的技术报告[6]中首次引入,但从那时起,它仍在不断完善。本文介绍了NEMEA的主要特征。该系统由独立互联模块组成,具有可扩展性,可在分布式环境中运行。每个模块都有自己的任务,例如异常检测、过滤或统计计算。每个模块都是使用一组创建通用框架的库构建的。所有东西都是作为一个开源项目开发的,并且可以在github.com上找到。https://github.com/CESNET/NEMEA
2、相关工作
本部分描述了相关的交流量监控和分析系统。分析和异常检测通常使用入侵检测系统(IDS)或入侵防御系统(IPS)进行。这种系统基于数据包或网络流来分析网络。最流行的基于包的系统是Bro[7]和[8]。它们处理每个包并使用模式匹配(可能通过脚本增强)来搜索可疑的流量,并在预定义的规则匹配时执行操作。由于这些系统对包进行操作,因此它们可以看到比基于流的系统更详细的信息。相反,基于流的系统通常会分析较高抽象级别的数据,从而能够检测不同类型的事件。而且,由于它们处理的数据不那么详细,所以它们通常具有更好的性能。这两种方法在许多情况下可以相互补充。
Nfdump[9]是一组用于存储和处理流记录的工具。它从网络接收数据,并将它们存储到与时间窗口对应的文件中,通常为5分钟。Nfsen[10]是nfdump的图形前端,它以图形和报告的形式可视化存储数据。它还允许对数据进行手工分析,并且可以配置为根据简单规则自动生成警报。更高级的数据分析可以使用插件来完成。这种方法的缺点是数据必须存储到磁盘上,然后由所有插件读取。这通常是大型网络中的性能瓶颈。此外,fdump不支持由L7信息扩展的流记录。
CERT的网络态势感知(NetSA)组建立了[11]基于SiLK[12]的分析管道[0]。SiLK是一组工具,可以用灵活的数据格式操作记录,其中包含来自流记录的信息。分析管道根据一个配置文件处理数据,该配置文件描述了三个阶段的操作序列——过滤、评估或统计计算,以及警报。每个阶段都有一组预定义的选项。通过将它们组合到一个管道中,可以组装一个复杂的查询。从简单的模块构建复杂的分析任务是一种非常类似于NEMEA的方法。最新版本的分析管道还增加了对L7数据的支持。然而,与NEMEA相比,管道构建块的功能和它们可能的交互非常有限。
3、NEMEA系统
3.1概述
NEMEA系统被设计成一个异构的模块化系统。模块是由单向接口相互连接以进行通信的独立过程。接口以信息流的形式传输数据—流记录、一些分析的结果等。图2示出了一个NEMEA系统实例的简单实例。每个模块基本上都是一个执行特定任务的程序,比如流数据预处理、过滤、异常检测、日志记录和报告结果。
NEMEA系统的每个实例都可以通过不同的模块组合起来,以不同的方式相互连接。NEMEA系统的不同部署可以使用完全不同的模块配置,从而执行不同的任务。因此,NEMEA是非常灵活的。在一个典型的配置中,模块被连接到树或有向无环图,其中一个模块作为整个系统的主要输入。该模块收集或创建流记录,并将它们发送到处理它们的其他模块。在系统的另一端,通常有一些模块用于将结果记录到日志文件、数据库或通过电子邮件发送警报。在我们的部署中,我们将IPFIXcol收集器的一个插件作为系统的输入—收集器从我们的监视探针接收和解析IPFIX数据,插件将它们转换为NEMEA使用的格式,并将它们转发给NEMEA模块。如图1所示。但是,对于较小的部署或测试,可以使用NEMEA模块流量器作为输入。它可以从网络接口或PCAP文件中读取数据包,生成流记录并将它们直接发送到NEMEA系统的其余部分,因此不需要外部的导出和收集器。
NEMEA不仅易于重新配置,还可以通过新功能轻松地扩展。NEMEA框架被设计成允许快速和容易地实现新模块。虽然NEMEA可以用于生产环境分析实时流量,但它也被设计为网络安全和监控领域研究人员的共同平台。它允许快速原型化新的流量分析方法,在离线和在线数据上测试它们,并将它们与现有方法进行比较。因此,虽然我们已经为常见任务提供了一些模块和一些恶意流量的检测器,但我们希望将来会有更多的社区发展起来。NEMEA系统使用的框架是用C语言开发的,并支持在C、c++或Python中实现NEMEA模块(稍后可能会添加更多的语言)。该系统应该在任何unix操作系统上运行。
3.2框架
图3显示了NEMEA系统的简化体系结构。有一组运行的模块(通过接口相互连接,这里没有显示)。模块的集合可以由一个叫做主管的工具来控制和监控。所有的模块都是建立在NEMEA框架上的程序。模块使用在NEMEA框架的共享库中实现的功能。
图3右侧是模块的正常内部组织。每个模块都实现了一种用于流量分析或检测的算法或方法,它使用NEMEA框架的特性来与其他模块通信,并访问数据记录中包含的信息。
框架的最重要部分是TRAP库(流量分析平台),它实现了每个NEMEA模块所需要的通信接口和其他基本功能。另一个库——UniRec——实现了一种数据格式,用于二进制表示流记录和其他信息。UniRec是用于模块通信的默认数据格式。在这两个库周围有一个Python包装器,它为用Python编写的模块提供API。NEMEA框架的最后一部分是公共库,它提供了网络数据分析算法中常用的一些函数和数据结构,比如各种哈希函数、哈希表、Bloom filter、前缀树或B+树。
NEMEA系统遵循数据处理的流化概念。这意味着它被设计成在不需要数据存储的情况下实时或接近实时地处理数据。从硬盘驱动器写入和读取流数据常常是流数据分析在其他系统中的性能瓶颈。在NEMEA中,所有数据都保存在操作内存中(除非某些模块有意将它们存储到磁盘或数据库),允许使用单个服务器对数据进行实时处理。但是,如果需要,NEMEA可以被分配到更多的服务器,因为每个模块可以单独运行,并通过网络与其他模块通信。
3.3通信接口
通信接口陷阱通信接口(IFC)允许模块之间进行通信。IFCs是单向的,每一个都表示模块的输入或输出。每个模块可以使用多个输入和输出IFCs。一个模块(发送方)的输出IFC可以连接到其他模块(接收器)的一个或多个输入IFCs。所有连接到同一发件人的接收器得到相同的数据。
数据通过IFC作为潜在的无限短消息流(最多64kb)来发送。一个消息可能是一个流记录,一个检测算法的结果(警报),从某个时间窗口的流记录计算的统计数据或其他任何东西。稍后将描述消息的格式。
IFCs实际上是几种不同的进程间通信的基本方法的抽象。这两种主要基于UNIX域插口和TCP套接字。前者用于在同一系统上的模块之间进行通信,后者用于在网络上进行通信。还有两种特殊类型的IFCs -文件和blackhole。文件类型允许将一串数据存储到一个文件中(当用作输出IFC时),并在以后重放它(当用作输入IFC时)。blackhole类型仅可用于输出IFC。它只是丢弃发送给它的所有消息。
重点是模块内部的数据处理算法完全是从模块的IFCs类型和参数中提取出来的。它只是调用函数来接收来自或发送到指定接口的数据。要使用的接口类型,以及指定应该连接到哪里的参数(socket名称、IP地址和端口、文件名),在模块启动时作为命令行参数传递。这些参数是由TRAP库处理的,因此模块的开发人员不必关心它。该库还处理可能发生的大部分IFC相关错误,例如,如果与其他模块的连接中断(例如,因为其他模块被重新启动),库会自动尝试重新连接。
一般来说,NEMEA的设计方式是一个模块的开发人员只能专注于数据处理算法,而将所有的集成工作都留给了TRAP库。它大大缩短了开发、测试和部署新的流量分析方法所需的时间。它还向经验较少的程序员开放了系统,例如,研究人员关注的是流量分析方法,而不是编程。
3.4数据格式
数据通过IFCs以三种受支持的格式之一(非结构化数据、JSON和NEMEA自己的二进制格式UniRec)交换。前两个数据很少使用,流数据以及其他大多数数据记录都以UniRec格式传输。
UniRec是一种高效的二进制格式存储和传输简单数据记录,类似于简单的C结构。除了C结构之外,它还支持可变长度的字段。UniRec本身是一个通用的数据结构,一个特定的格式由模板给出,即一组记录中的字段。
相对于其他格式,如IPFIX、JSON或其二进制等价物BSON或MessagePack, UniRec有两个关键的区别。首先,它被设计为允许快速访问记录字段。在可以访问字段之前,必须解析其他格式,而UniRec字段可以直接读取,访问速度几乎等于普通的C结构。但是与C结构相反,UniRec模板可以在运行时定义。第二,所有发送到IFC的记录都有相同的模板。在大多数用例中,这不是一个问题(当它是,JSON可以被替代使用),并且它极大地简化了数据处理。
数据格式兼容性由IFCs自动检查。每个输出IFC指定它能够发送的数据格式,而每个输入IFC指定一组必需的字段。这些格式可以在运行时指定,这增加了系统的灵活性。当两个IFCs将要连接时,它们的格式会被检查。如果输出IFC包含输入IFC所需的所有字段,则建立连接并开始数据传输。否则,连接将被拒绝。
因此,如果处理HTTP流量的模块需要带有URL字段的流数据,而用户试图将其连接到IFC只提供没有L7数据的基本流程,则连接失败。
这种机制不仅对错误检查有用。例如,它允许创建一个通用的日志模块,该模块可以自动识别所接收的数据。使用此信息,模块知道如何解释消息以及如何记录消息。
我们想明确指出,NEMEA原生支持L7信息扩展的流记录。UniRec是一种通用格式,其记录可以包含任何字段,因此,即使在运行时,也可以通过任何新的信息元素自然地扩展流记录。通常,系统允许在运行时添加或删除模块,而不会中断其他模块。该属性对于复杂配置的NEMEA系统的生产部署非常重要。
3.5中央配置和监控
NEMEA系统的模块可以像其他任何一组UNIX进程一样手动运行。然而,该系统还可以由一个名为nemea-supervisor的工具集中控制和监控,这通常是一个更好的选择,特别是对于由大量模块组成的实例。nemeasvisor可以作为一个系统守护进程或在交互模式下运行。它还通过标准的NETCONF协议支持配置[13]。Nemea-supervisor根据XML配置文件处理模块。该文件定义了模块、它们的参数和一个分组到概要文件——可以在一起启动或停止的模块组,例如一个实验。可以在运行时使用提供的瘦客户机或任何NETCONF客户机更改配置。
作为一个监视工具,nemeasupervisor周期性地检索每个模块的状态信息,并对配置执行必要的操作,以保持模块运行或停止。除了模块的状态之外,nemea-supervisor还阅读了一些关于模块(CPU和内存使用)的资源消耗以及它们的接口的统计信息。每个模块的IFC都会自动更新接收或发送消息的计数器,通过在每个模块中打开的特殊服务IFC来读取计数器。所有关于模块的统计数据可以定期导出到Munin系统[14]。
3.6系统性能
NEMEA系统的总体性能主要依赖于一组部署的模块和它们的资源需求。然而,IFCs的最大吞吐量有一个限制。IFC使用缓冲区来优化数据传输的利用率,以提高吞吐量。
可以发送的每秒消息的最大数量取决于消息的大小。图4显示了在同一台机器上测量一对测试模块(一个发送方和一个接收方)之间的MPS和消息大小之间的关系,而消息是在内存中生成的。图中的绿色栏显示可以通过IFC发送/接收的MPS数量。最高数量的MPS(超过700万/秒)被测量为66 B消息大小,这是我们使用的基本流量记录的大小。由于这条消息的大小开销很大,所以每秒字节的传输速度(图中紫色的线)是最小的(超过480 MB/s)。L7信息除了基本的流信息外,还会消耗额外的内存。对于最大的测量消息(65 KB消息),MPS的数量很低(5.3万MPS),但是传输速度大约是3.5 GB/s。
NEMEA的主要原则是一次运行多个模块。但是,运行的模块越多,每个模块的资源就越少。图5显示了运行多对模块时IFCs的吞吐量。所有的模块都发送了一个固定大小的消息(选择了66个B)。紫色条表示单个接收器接收到的平均MPS数,绿色条表示来自所有接收器的MPS之和。对于两个模块(一对),总数等于一个接收器的MPS。
一个完整系统的实际性能严重依赖于特定的实例化模块和它们实现的算法的复杂性。然而,正如在Sec. V中所显示的那样,使用单个服务器处理来自一个中型NREN的流数据并不是一个问题。
4、实际用例
NEMEA已经包含了许多用于不同目的的模块,主要用于检测各种恶意流量。本节描述模块所涵盖的主要主题。他们中的大多数目前在CESNET2网络中使用。
4.1使用L4级进行检测
网络扫描属于互联网上最常见的活动。它通常是无害的,但是它可以被攻击者用来收集信息。有用于扫描检测的NEMEA模块(在[15]中对端口扫描进行了分析)。
拒绝服务(DoS)和分布式DoS (DDoS)属于最强大的攻击类型。根据各种报告(例如,[16]),DoS/DDoS攻击的数量增加,攻击者可以生成的流量增加。发现和减轻这些攻击是一项具有挑战性的任务,因为要可靠和及时地识别恶意和良性的流量是非常困难的。NEMEA系统试图通过提供基于不同分析方法的几个检测模块来进入这个主题。例如,我们实现了基于MULTOPS树的检测方法[17]。还有一个专门的NEMEA模块用于检测扩增攻击。
4.2使用L7进行检测
会话初始化协议(SIP)可以作为电话服务的现代继任者的IP (VoIP)的信号传输协议。在特定的情况下,一个配置错误的SIP Private Branch Exchange (PBX)可以通过使用正确的前缀来调用PSTN电话号码。试图猜测前缀并对其进行调用的攻击是非常常见的,如果成功的话,它们可能会给脆弱的PBX所有者带来巨大的财务损失。在[18]中提出了一种通过选择SIP报头扩展的流记录来检测此类攻击的NEMEA模块。
DNS协议通常不受安全策略和防火墙设置的限制,因为它属于不可缺少的服务。它有时可以用来绕过网络连接限制,或者通过将数据封装到DNS消息中,从而创建一个通信通道,从而避开安全的网络。基于DNS消息的统计分析,有一个用于检测此类隧道的NEMEA模块[19]。
心脏出血是2014年在OpenSSL库中发现的一个关键错误。它给攻击者提供了一个机会,让攻击者可以远程读取使用OpenSSL脆弱版本的服务器的随机内存块。在该漏洞发布后的几天内,开发了一个用于心脏出血检测的NEMEA模块。它分析了从SSL协议头中提取的信息,这些信息是由一个特殊的流出口器插件提取的。在运行的头两个月里,该模块在我们的网络中发现了超过1000个脆弱的主机,它们被从外部攻击(或探测)。在[20]中详细描述了检测机制。
NEMEA可以用来检测被恶意软件感染的设备。论文[21]提出,有了恶意软件的样本,就可以检索到与网络连接的受感染设备的有价值的信息。一个通用的过滤器模块可以用来发现与可疑服务器的通信。在这种情况下,使用域名称和HTTP url的扩展流记录是过滤器的输入。过滤条件可以包含可疑地址、域名和url。每个匹配的连接都被立即报告,因为它的源可能被恶意软件感染。
4.3警告处理
检测模块生成有关检测到的安全事件(警报)的记录。为了从与警报处理相关的任务(如日志记录或报告)中提取检测器,NEMEA提供了一种以统一的方式处理警报的方法。这是由一组名为“报道”的模块组成的,这些模块将警报从检测器转换为统一格式,然后它们可以:将警报输入文件,将警报存储到数据库中,发送包含警报信息的电子邮件,向Warden3系统发送警报。
由于这些模块是作为Python脚本实现的,所以很容易扩展它们以支持任何输出数据格式或向任何其他系统导出警报。
4.4离线测试
NEMEA不需要仅仅在生产部署处理实时数据中使用。它还可以离线工作并处理存储数据。有一些模块用于读取nfdump格式的文件流数据、IPFIXcol或CSV文件使用的fastbit数据库。还可以存储和重放由UniRec格式直接生成的任何NEMEA模块生成的数据流。
这允许重复将相同的数据发送到一组处理模块中,这对于测试模块(以及处理方法)以及研究(例如使用相同的输入数据的不同方法或参数设置)都很有用。
一个有趣的用例也有可能使用合并模块混合两个或更多的数据流。例如,从正常流量中获得的流记录可以与攻击模拟器生成的流合并,或者与先前存储的攻击的跟踪相合并。因此,攻击轨迹可以混合到正常的流量中,以测试检测模块的能力,如图6所示。
5、实际的部署和结果
NEMEA系统的实例自2014年初开始在CESNET部署。它接收并分析了部署在CESNET2网络周边的探针的流量数据,这10条线路的容量从10Gbps到100Gbps,连接CESNET2到其他主干网络。数据不以任何方式取样。平均而言,在高峰时间,探测器每秒产生12万条流量记录。
在撰写本文时(2016年6月),我们的NEMEA系统实例由28个模块组成。所有的模块都运行在一个服务器上,有6个CPU核心和12GB的内存,并且能够处理所有传入的数据,而不会有任何损失。事实上,在正常情况下,服务器资源(CPU和内存)的利用率不超过40%。
该系统能够检测端口扫描、DDoS攻击(简单的SYN洪水以及DNS和NTP扩增攻击)、对SSH的字典攻击,以及监视多个恶意IP地址和url的连接。而且,关于流量的各种统计信息都是经过计算和存储的。最后,其中一个模块对流数据进行动态匿名化,并将它们重新发送到具有较少限制访问的服务器。这是用于开发和测试新模块的网络安全学生和其他学术人员由于隐私问题无法获得真实数据的访问。
平均每天,NEMEA系统检测并报告CESNET2网络中的以下事件:
•110,000水平端口scans4(每分钟76次)。
•12,000字典或bruteforce试图登录到SSH(8.3 /分钟)。
•2400个DDoS攻击(主要是DNS和NTP放大)。
DDoS攻击的数量可能看起来非常高。这在一定程度上是由于一个单一的攻击可能由两个模块报告,并且由于检测方法的属性,可能会多次报告长时间的攻击。因此,它是由探测器产生的许多警报而不是实际的攻击数量。然而,即使警报被聚合,攻击的数量仍然是数百个。这是因为今天大多数DDoS攻击都使用了数千个DNS或NTP服务器来对攻击流量进行反射和放大。如果只有一个服务器的流量通过了CESNET2网络,那么就可以检测到攻击。事实上,我们经常在同一时间观察单个服务器的多个单独的攻击。
我们也有几个模块用于分析我们扩展的流量记录中的L7数据,例如对VoIP服务器的攻击检测器或DNS隧道的检测器。它们仍然被认为是实验性的,并没有在主要的NEMEA实例上运行,但是例如,如果它从所有的探测中获取数据,VoIP探测器每天报告大约1100次攻击。
我们还经常使用L7数据,根据当前安全管理的需要,在HTTP或DNS请求中对URL进行特别过滤。这意味着需要特别添加模块来过滤和记录感兴趣的流量。例如,我们最近获得了一个新的恶意软件的样本,并与我们的取证实验室合作进行了分析[22]。这导致了一个IP地址和用于控制僵尸网络的url的列表。在我们的NEMEA系统中,立即添加了一组过滤器模块,这些模块寻找l7扩展流数据中的IP地址和url。在两周内,它在我们的网络中发现了11个受感染的设备。检测工作持续进行,并在接近实时的情况下发出警报。
6、结论
基于流的测量和分析成为网络监控的标准方法。传统的流量记录只提供传输层(L4)的可见性。然而,对于某些类型的问题的检测,应用层(L7)信息是必要的。虽然存在能够解析L7信息的出口商,但是很难用现有的工具来处理它们。因此,我们为l7扩展流数据的分析创建了一个新的平台- NEMEA。
NEMEA用于实验和操作使用。它最重要的特性之一是L7处理能力。与此同时,它是一个灵活的模块化系统,允许研究人员和网络运营商通过实现新的NEMEA模块来扩展其功能。它还可以被看作是开发流量分析算法的一个通用平台,它允许在离线跟踪和实时数据上轻松测试它们,与其他算法进行比较,并最终在操作上部署它们。NEMEA的模块化也使得系统可伸缩,可以处理大量的流记录。如果一台机器没有足够的资源,就有可能分配计算,即在多个主机上启动NEMEA模块。
在本文中,我们展示了一个复杂的部署,将NEMEA系统与一组高性能的导出器和一个开源的收集器IPFIXcol结合起来。然而,由于NEMEA包含它自己的最小化的输出,它也可以在较小的网络上独立使用。
在CESNET2网络上的部署已经证明,NEMEA可以成功地用于监视大型网络并检测各种恶意流量。成千上万的事件被发现多亏了NEMEA。