体系结构热点:基于FPGA的网络入侵检测(IDS)卸载技术

网络入侵检测系统(IDS)是安全云计算的关键,但随着网络带宽的增加,它们也受到CPU计算能力的严重限制。因此,硬件卸载对于IDS服务器来说至关重要,以支持不断增长的数据包处理吞吐量需求。作者调研发现,绝大部分传统的将FPGA应用在IDS/IPS处理的工作,集中在将特定功能,例如正则表达式匹配,卸载到FPGA上。传统的卸载无法在单个服务器占用的空间内实现100Gbps的处理,这是因为Snort 3.0的平均运行速度为400mbps/核,即使假设正则表达式的搜索速度无线快,也需要250核才能达到上线路速率的数量级。

因此,Carnegie Mellon University的Zhao等人研究团队提出了在IDS/IPS处理中采用FPGA优先架构——Pigasus。在Pigasus中,IDS/IPS的大部分数据包处理是通过板载100Gbps SmartNIC FPGA上的高度并行数据路径执行的。Pigasus FPGA直接在FPGA上执行TCP重组,因此它可以立即在有效载荷数据上应用精确的字符串匹配算法,以确定哪些“可疑”数据包需要进入“完全匹配”模式,需要额外的字符串匹配和正则表达式匹配。与经典的FPGA卸载范例相反,Pigasus FPGA只将最后的匹配阶段留给CPU来检查字节流摘要上的少量签名。通过在FPGA上处理大多数良性流量,Pigasus在通常情况下可以达到100Gbps和3µs延迟。

基于大规模IDS部署的经验,阿里云实验室的Chen等人发现现有的硬件卸载解决方案存在根本的局限性,这些局限性阻碍了它们在生产环境中的大规模部署。 基于此,Chen的研究团队提出了一种基于FPGA的入侵检测卸载系统Fidas,该系统通过全面卸载主NIC、规则模式匹配和流量分类,避免了现有硬件解决方案的局限性。Fidas中的模式匹配模块使用了一种基于多级滤波器的方法来进行有效的正则表达式处理,而流速分类模块则采用了一种新颖的双堆栈内存方案来识别体积攻击下的热流。我们的评估表明,Fidas在模式匹配和流量分类方面实现了最先进的吞吐量,同时为其他安全相关功能腾出了处理器。Fidas部署在生产数据中心,并经过了性能、成本效益和DevOps灵活性的实战测试。

本文后续内容将主要介绍这两种方案的数据包过滤架构:

OSDI’20

Achieving 100Gbps Intrusion Prevention on a Single Server

Authors:

Zhipeng Zhao, Hugo Sadok, Nirav Atre, James C. Hoe, Vyas Sekar, and Justine Sherry, Carnegie Mellon University

ABSTRACT:

Intrusion Detection and Prevention Systems (IDS/IPS) are among the most demanding stateful network functions. Today’s network operators are faced with securing 100Gbps networks with 100K+ concurrent connections by deploying IDS/IPSes to search for 10K+ rules concurrently. In this paper we set an ambitious goal: Can we do all of the above in a single server? Through the Pigasus IDS/IPS, we show that this goal is achievable, perhaps for the first time, by building on recent advances in FPGA-capable SmartNICs. Pigasus’ design takes an FPGA-first approach, where the majority of processing, and all state and control flow are managed on the FPGA. However, doing so requires careful design of algorithms and data structures to ensure fast common-case performance while densely utilizing system memory resources. Our experiments with a variety of traces show that Pigasus can support 100Gbps using an average of 5 cores and 1 FPGA, using 38x less power than a CPU-only approach.

介绍

目前,云计算的日益增长为IDS/IPS提出了更高软件、硬件实现能力的要求,其中构建支持100Gbps量级的IDS/IPS线路,同时具有数十万的并发流能够根据数万条规则匹配数据包的能力尤为重要。本文通过引入服务器smartnic相关技术,将FPGA嵌入商用服务器网卡之中,实现低功耗、低成本和高性能的IDS/IPS单服务器架构Pigasus。

作者调研发现,绝大部分传统的将FPGA应用在IDS/IPS处理的工作,集中在将特定功能,例如正则表达式匹配,卸载到FPGA上。传统的卸载无法在单个服务器占用的空间内实现100Gbps的处理,这是因为Snort 3.0的平均运行速度为400mbps/核,即使假设正则表达式的搜索速度无线快,也需要250核才能达到上线路速率的数量级。

因此,在设计Pigasus时,作者主张在IDS/IPS处理中采用FPGA优先架构。在Pigasus中,IDS/IPS的大部分数据包处理是通过板载100Gbps SmartNIC FPGA上的高度并行数据路径执行的。Pigasus FPGA直接在FPGA上执行TCP重组,因此它可以立即在有效载荷数据上应用精确的字符串匹配算法,以确定哪些“可疑”数据包需要进入“完全匹配”模式,需要额外的字符串匹配和正则表达式匹配。与经典的FPGA卸载范例相反,Pigasus FPGA只将最后的匹配阶段留给CPU来检查字节流摘要上的少量签名。通过在FPGA上处理大多数良性流量,Pigasus在通常情况下可以达到100Gbps和3µs延迟。

实现Pigasus的挑战之一是使FPGA支持有状态数据包的处理。该挑战不仅包括用于有效负载匹配的多字符串模式匹配,还包括以100Gbps线速率执行的TCP字节流重组。必须重组接收到的乱序TCP数据包,以便规则匹配在跨TCP数据包边界模式也能进行检测。为了实现以上挑战,本文实现了两项贡献:

  • 分层模式匹配:传统的流字符串搜索算法使用基于nfa的(状态机)算法。虽然这些算法在处理小规则集时非常快,但是其所需的块RAM的大小超过了FPGA支持的容量。在本文中,作者仿照为x86处理器设计的Hyperscan,使用哈希表查找而不是传统的状态机方法来进行精确匹配字符串搜索。Pigasus使用一组分层过滤器来减少每个管道副本所需的总内存量,支持并行搜索32个索引,同时仅消耗约2MB的BRAM。与Snort相比,扫描额外的字符串会使到达完全匹配器的数据包减少2倍(规则/数据包减少4倍),需要额外的1.3MB内存。

  • 快速通用重组:TCP重组的传统方法使用固定长度、静态分配的缓冲区。这可以防止高度乱序流阻碍性能(因为插入时间是恒定的)和消耗太多内存(因为缓冲区大小是固定的),但是固定缓冲区的内存效率低下。Pigasus采用内存密集的链表方法,但仅在与主快速路径并行运行的异常慢路径上;如果内存缓冲区接近容量,则优先重置大流量以防止过载。在快速路径上,数据包访问存储预期的下一个字节的简单表,并相应地增加它,因此,有序流在性能方面与无序流隔离。这使得Pigasus在内存效率方面有着较大提升,同时在IDS被行为不当、乱序的数据包淹没时即使将行为良好的流量隔离开来,防止性能的下降。

背景

基于签名的IDS/IPS系统的主要目标是识别网络流何时触发多达数万个签名(也称为规则)中的任何一个。给定的签名可以指定一个或多个模式,并且通常在找到所有模式时触发整个签名。模式分为以下三类:

  • 包头匹配:流量5元组上的过滤器。
  • 字符串匹配:在TCP字节流或单个UDP数据包中检测精确匹配字符串。
  • 正则表达式:在TCP字节流或单个UDP报文中检测的正则表达式。

规则的监测需要满足PDU(Protocol Data Unit, PDU),即只有在同一个PDU中找到所有匹配项(而不是在整个流的过程中)时才触发签名。当IDS/IPS工作在防御模式下时,触发签名可能会触发告警、记录事件,也可能会阻断违规流或源的流量。因此,IPS必须对流量进行内联操作,并且对延迟敏感——在IPS完成扫描之前,报文可能不会被释放到网络中。另一方面,ids可以异步操作,并且通常部署在提供活动流量副本的次要流量“tap”上。

最广为人知的IDS/IPS之一是Snort,本文的工作旨在与Snort规则集兼容。Snort注册规则集包含大约10,000个签名,因此本文设定了支持10K规则的目标。

在智能网卡中使用FPGA改进IDS的原因有两个,一个是其相比GPU所消耗的功率要低4-5倍,其次,FPGA可以方便地部署在smartnic上,在没有PCIe延迟或带宽开销的流量上运行。FPGA允许程序员使用代码指定自定义电路,通过设计管道并行实现相对于CPU的性能加速,即使其时钟速率要慢5-20倍。FPGA的不同的模块同时操作不同的数据,或者通过数据并行,其中克隆同一模块的副本以同时操作不同的数据。FPGA的内存设计也为并行性提供了方便,使用块RAM (BRAM)为程序员提供了一系列内存选项。内存被分成20Kb的块,每个块有两个端口,每个周期可以并行地从所有BRAM块中读取(每个BRAM块两次)。当开发人员希望每个周期对一个BRAM块进行两次以上的并行读取时,他们可以选择复制该块,以允许对存储数据进行更多的同时只读访问。

需要注意的是,先前已经有一些工作将FPGA集成并应用在IDS/IPS处理中,先前的工作遵循“卸载”方法来利用FPGA,仍然依靠CPU执行大部分处理,FPGA仅用来加速单个任务。下图展示了Snort 3.0中MSPM、Full Matching、TCP Reassembly等任务所花费的CPU时间的比例,可以看出CPU的时间占用并不存在某一任务占用过多的情况。在这种情况下,根据Amdahl定律我们可知,即使MSPM被卸载到一个假想的、无限快的加速器上,吞吐量也只会增加85%,达到600Mbps/核,仍然需要166个核才能达到100Gbps,并不能解决实际问题。

在这里插入图片描述

在下图作者继续尝试对多种模块进行单独卸载,结果为没有任何模块的卸载能使系统达到两倍的加速效果。作者因此得出结论:要在单个服务器上实现行速率吞吐量,需要一种更为激进的方法

在这里插入图片描述

总览

Pigasus采用了FPGA优先的IDS/IPS设计,将FPGA作为主要的计算平台,执行大部分的计算任务。而CPU仅在需要时运行,根据上文的分析,任何加速IDS/IPS至100Gbps的方法都必须尽可能多地并行化系统,一种极端的情况便是完全对CPU的需求。在Pigasus中,正则表达式匹配和完全匹配阶段仍被部署在CPU上执行,这是因为最先进的硬件算法并没有达到100Gbps的性能和内存需求,且完全匹配阶段的数据包交互较少,卸载的效果并不明显。

在这里插入图片描述

  1. 初始数据包处理:每个数据包首先通过100Gbps以太网核心,该核心将电信号转换为原始以太网帧。这些帧暂时存储在包缓冲区中;每个帧的报头分别被发送到解析器,解析器提取TCP/IP报头字段作为元数据(例如,序列号,端口)供Reassembler和MSPM使用。
  2. Reassembler:Reassembler按顺序对TCP数据包进行排序,以便通过连续搜索实现对跨多个数据包匹配的识别。Reassembler能够在该流中记录数据包前一个的最后几个字节,以便在MSPM中启用跨数据包搜索。UDP报文直接通过Reassembler转发,不做任何处理。
  3. Data Mover:由于Parser和Reassembler仅对报头和元数据进行操作,因此需要Data Mover从Reassembler接收已排序的数据包元数据,并发出请求从packet Buffer获取原始数据包,以便将其转发到MSPM。
  4. MSPM:多字符串模式匹配器(Multi-String Pattern Matcher)负责根据10k条规则的报头匹配检查每个数据包,并根据所有10k条规则的所有字符串匹配过滤器检查每个数据包的每个索引。Snort 3.0的MSPM较为简略,仅搜索一个精确匹配字符串(fast pattern),并将其余字符串检测推送至"full match"模块完成。相比之下,Pigasus的改进方法使得发送到完整匹配阶段的数据包数量减少了2倍以上,并且还将完整匹配器要检查的每个数据包的可疑规则数量减少了4倍。
  5. DMA引擎:MSPM输出每个数据包部分匹配的规则id集,并将其转发给DMA引擎。随后,数据包将被传输至CPU进行Full Match。为了节省CPU周期,DMA引擎保留了发送给完全匹配器的数据包的副本,而不是在处理后通过PCIe复制整个数据包。DMA引擎以循环方式在核心之间分配任务。
  6. Full Matcher:在软件端,Full Matcher轮询一个由DMA引擎填充的环缓冲区。每个包携带元数据,包括MSPM确定为部分匹配的规则id。对于每个规则ID, Full Matcher检索完整的规则并检查是否完全匹配。然后,它将其决定(转发或丢弃)写入由FPGA端的DMA引擎轮询的传输环缓冲区。如果决定转发,DMA引擎将数据包转发到网络;否则,数据包将从DMA引擎的检查数据包缓冲区中被擦除。

实现以上的FPGA优先策略的一大关键便是在FPGA有限的内存上拟合上述功能。唯一一类可以在一个周期内执行读取操作的BRAM,即使在高端因特尔Stratix 10 MX FPGA上,也仅限有16MB的容量,因此只能为最频繁读写内存的模块保留BRAM。在Reassembler和MSPM阶段,每个数据包会被多次访问,前者为了管理无序的数据包缓冲区需要检查无序,后者需要根据10K精确匹配字符串规则检查每个数据包的每个索引和数据包头匹配。

为了节省BRAM,作者将其他有状态模块(stateful models)例如数据包缓冲区和DMA引擎分配给功能较弱的eSRMA和DRAM,因为它们在带宽和延迟方面的要求要低很多。包缓冲区的包数据仅被写入和读取一次,因此带宽需求很低,但是仍然超过了DRAM的峰值吞吐量,因此Data Mover在将数据包推送至MSPM之前需要预留12个周期。对于DMA引擎而言,只有5%的数据包需要进行Full Match,DRAM的带宽和延迟足够满足需求。

此外由于有限的BRAM容量,现实Reassembler和MSPM模块还是具有一定的挑战性,使用传统的基于nfa的MSPM搜索算法,公共规则集将需要23MB的BRAM容量,这超过了16MB的上限。作者对这些模块进行了一定的优化,保证其在不影响性能的前提下能够部署。

重组

重组是指在存在数据包碎片、丢失和无序传输的情况下重构TCP字节流的过程,是Pigasus检测跨多个数据包的模式所必须的功能。Reassembler的主要目标是在FPGA的内存限制下,以100Gbps的速度执行100K流的重新排序。

Pigasus采用链表方法,目标是更高效的内存设计。然而,为了避免由于可变时间数据包插入而导致管道停滞,Pigasus使用三个执行引擎来管理重组状态,每个执行引擎处理不同类别的传入数据包头。快速路径对已建立的流按顺序处理数据包;插入引擎处理新流的SYN包;OOO引擎处理现有流的乱序数据包。 由于Pigasus是在硬件中实现的,这些引擎可以同时运行而不会彼此拖延,但在访问Reassembly Flow Table中的共享状态时需要避免冲突。下图描述了当数据包header到达Reassembler时发生的步骤序列。

在这里插入图片描述

MSPM:

根据100 Gbps的字节流检查成千上万的字符串模式,使多字符串模式匹配器(MSPM)模块成为Pigasus中迄今为止操作最密集、性能最关键的组件。

在Snort中,为了避免检查每个索引和每个数据包的每个模式,规则集被设计为两步匹配过程。MSPM负责检查报头匹配和一个高度选择性的精确匹配字符串(Fast Pattern)。只有同时匹配报头匹配和快速模式的数据包才会被转发到完整匹配器,完整匹配器会检查正则表达式和任何次要精确匹配字符串(non-fast pattern strings),如上图所示。Pigasus的MSPM检查Fast Pattern、header和non-fast pattern,从而减少了CPU端完全匹配器的负载。

为了获得更有效的设计,作者参考了英特尔的Hyperscan字符串匹配算法,该算法可实现AVX并行化,与基于状态机的字符串匹配器相比快8倍。通过重新构建Hyperscan的基于哈希表的设计,可以将内存占用减少到只有2MB,留下多余的内存,并扩展Hyperscan方法来搜索所有字符串(而不仅仅是Fast Pattern),总内存预算为3.3MB。关键思想是分层排列哈希表过滤器,将低内存过滤器放置在管道的早期,提前过滤掉大部分流量。MSPM的后续阶段可能对每个模块占用更多内存,但每个阶段处理的流量越来越少,因此需要的复制也越来越少。

在Snort 3.0 + Hyperscan架构中,Hyperscan首先检查包的报头是否匹配。在所有10K规则中,只有≈400个唯一的报头匹配值。共享相同报头匹配字段的规则被称为属于相同的端口组。端口组模块输出数据包匹配的一组端口组id,平均一个数据包匹配2个端口组。对于每个端口组,都存在一个字符串匹配器,用于检查该端口组中所有规则的Fast Pattern。Snort必须检查数据包匹配的每个端口组的每个字符串匹配器。

在这里插入图片描述

Hyperscan的Fast Pattern字符串匹配采用哈希表集合而不是状态机。具体而言,对于每个可能得Fast Pattern长度,实例化一个包含该长度的哈希表。然后Hyperscan对每个索引的子字符串执行精确匹配查询,判断子字符串是否在哈希表中,为了减少昂贵的顺序查找次数,每个字符串匹配器在哈希表之前包含一个simd优化的移位或过滤器。过滤器为数据包的每个字节索引输出’0’或’1’,表明该索引是否与哈希表中的任何Fast Pattern匹配;不需要检查从移位或阶段产生’0’输出的索引。

将Snort 3.0 MSPM引擎和数据结构直接移植到FPGA上将消耗785KB内存,并以3.2Gbps的速率转发。利用FPGA提供的高度并行性,理论上可以通过数据并行性扩展到100Gbps,即复制32次。不幸的是,这样做需要25MB的RAM。作者在Pigasus中重新构建了hyperscan算法,对MSPM的顺序进行了修改,从字符串匹配开始,然后再进行报头匹配和端口分组,在可用资源内实现了高度的并行性。剩余的内存还可以扩展对non-fast pattern的字符串扫描,进一步将CPU的任务卸载到FPGA。

在这里插入图片描述

  • Fast Pattern String Matching(FPSM): 与Hyperscan相同,Pigasus在执行字符串匹配之前也有一个过滤阶段。数据包将并行通过shift-or过滤和一组按快速模式长度排列的散列表。两个滤波器的输出被加和在一起,将任何一个滤波器的误报减少了5倍。移位或和1位哈希表分别仅消耗65KB和25KB,因此为了扩展到100Gbps,将它们复制32倍相对便宜。理论上,这些过滤器每个周期可以生成32*8=256位宽矢量输出,但由于大多数数据包和大多数索引不匹配任何规则,因此可以选择非零规则匹配,将其缩小到8个值,以便在较低的内存开销下实现更高的并行性。

  • Header Matching:在这个阶段,MSPM使用Header数据来判断前一阶段产生的匹配是否与相应规则的端口组一致。Pigasus创建了8个17KB的Rule Table和68KB的Port Grouping模块副本,可同时检查8条规则。Rule Table根据FPSM产生的(index, length)元组查找相应规则的ID。然后检查数据包的端口号是否是这个规则映射的端口组的子集,若是则认为规则匹配,否则规则将被忽略。匹配至少一条规则的数据包将被发送到CPU进行处理,没有任何匹配的数据包则会被简单地流失传输到输出接口。Header Matching仅需要2MB的内存,就能将CPU处理的数据包降低到11%,平均每个数据包搜索4.4条规则。

  • Non-Fast Pattern String Matching(NFPSM):Pigasus通过额外搜索板上规则内的所有字符串匹配,进一步将发送给CPU的数据包和规则过滤到仅5%的数据包,平均只有1.1条规则/数据包。和FPSM层相同,Pigasus使用哈希表同时搜索所以字符串。

ISCA’22

Fidas: fortifying the cloud via comprehensive FPGA-based offloading for intrusion detection: industrial product

ISCA2022 体系结构顶会 Fidas(阿里云)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值