• Linux eBPF:网络、系统监控和安全领域的创新


          扩展 Berkeley Packet Filter(eBPF)是Linux内核中的一项强大技术,最初用于网络数据包过滤。随着时间的推移,eBPF的功能和应用场景不断扩展,如今已成为网络、系统监控和安全等领域的重要工具。eBPF可以在Linux内核中安全地运行用户定义的字节码。它为内核提供了一种灵活的机制,允许用户在不修改内核源代码的情况下动态加载和执行程序。eBPF程序可以应用到多种内核事件上,如系统调用、网络包处理和内核跟踪点处理等。

    eBPF的原理和组成

          eBPF 是一项革命性技术,起源于 Linux 内核,可以在特权上下文(例如操作系统内核)中运行沙盒程序。它用于安全有效地扩展内核的功能,而无需更改内核源代码或加载内核模块。从历史上看,由于内核具有监督和控制整个系统的特权能力,操作系统内核一直是实现可观察性、安全性和网络功能的理想场所。同时,操作系统内核由于其核心地位,对稳定性和安全性要求较高,演化难度较大。因此,与操作系统外部实现的功能相比,操作系统内核级别的创新率一直不高。

          eBPF的出现从根本上改变了以上现象。eBPF允许沙盒程序在操作系统内核运行,这意味着应用程序开发人员可以运行 eBPF 程序以在运行时向操作系统内核添加附加功能。然后,操作系统可以保证安全性和执行效率,就像借助即时 (JIT) 编译器和验证引擎进行本机编译一样。

    eBPF由如下的部件组成:

    • eBPF钩子

        eBPF 程序是事件驱动的,当内核或应用程序通过某个挂钩点时运行。预定义的挂钩包括系统调用、函数入口/出口、内核跟踪点、网络事件等。如果不存在满足特定需求的预定义挂钩,则可以创建内核探针 (kprobe) 或用户探针 (uprobe) 来将 eBPF 程序附加到内核或用户应用程序中的几乎任何位置。

    图1 eBPF钩子

    • eBPF程序

          eBPF通过允许用户定义的程序在内核中运行来扩展其功能,从而实现动态高效的数据包处理,而无需修改内核本身。eBPF 程序用 C 语言限定子集编写,并用Clang编译成字节码并加载到内核中,在安全的沙盒环境中执行。

    • eBPF加载器和验证器

          eBPF加载器是一种工具/机制,用于将用户空间编写的eBPF字节码加载到内核空间中。加载器负责将编译后的eBPF程序传输到内核,并准备在特定的内核钩子点上运行。eBPF加载器不仅仅是一个传输工具,它还负责初始化和配置eBPF程序运行所需的各种资源,如eBPF Maps、Helper函数等。此外,它还确保eBPF程序能够在内核的正确位置执行,并与内核其他部分进行交互。

          eBPF验证器是内核中的一个关键组件,负责在eBPF程序加载到内核之前进行安全性和正确性检查。验证器的主要目的是确保eBPF程序不会对内核的稳定性和安全性造成威胁。当一个eBPF程序被加载时,验证器会对其进行一系列静态分析和检查,以确保程序是安全且正确的。

    • eBPF的运行

          在确认eBPF的字节码安全后,内核将其加载对应的内核模块-钩子点执行。

    图2 eBPF的执行

    eBPF在应用领域的创新

    • eBPF在网络领域的创新

          eBPF最初的用途之一是网络数据包过滤。现代网络应用需要高性能的数据包处理,而传统的内核空间与用户空间之间的上下文切换会带来性能损耗。eBPF允许在内核空间直接处理数据包,从而显著提高性能。

          eBPF可以动态收集网络流量信息,并将其导出到用户空间进行分析和可视化。与传统的网络监控工具相比,eBPF具有更低的性能开销和更高的灵活性。

    图3 eBPF的网络处理

    如图3所示,eBPF在网络协议栈各层实现对网络报文的数据处理、网络流量信息统计与分析。

    • eBPF在系统监控领域的创新

          eBPF 提供了四种不同的操作机制,以满足系统监控领域的需求和场景。这些操作方式包括:

    1、内核跟踪点(Kernel Tracepoints):内核跟踪点是由内核开发人员预定义的事件,可以使用 TRACE_EVENT 宏在内核代码中设置。这些跟踪点允许 eBPF 程序挂接到特定的内核事件,并捕获相关数据进行分析和监控。

    2、USDT(User Statically Defined Tracing):USDT 是一种机制,允许开发人员在应用程序代码中设置预定义的跟踪点。通过在代码中插入特定的标记,eBPF 程序可以挂接到这些跟踪点,并捕获与应用程序相关的数据,以实现更细粒度的观测和分析。

    3、Kprobes(Kernel Probes):Kprobes 是一种内核探针机制,允许 eBPF 程序在运行时动态挂接到内核代码的任何部分。通过在目标内核函数的入口或出口处插入探针,eBPF 程序可以捕获函数调用和返回的参数、返回值等信息,从而实现对内核行为的监控和分析。

    4、Uprobes(User Probes):Uprobes 是一种用户探针机制,允许 eBPF 程序在运行时动态挂接到用户空间应用程序的任何部分。通过在目标用户空间函数的入口或出口处插入探针,eBPF 程序可以捕获函数调用和返回的参数、返回值等信息,以实现对应用程序的可观察性和调试能力。

          上述这些机制提供了丰富而灵活的方式,让 eBPF 能够与内核和应用程序交互,捕获关键事件和数据,并实现深入的可观察性和调试功能。通过结合这些机制,开发人员可以更好地理解系统的行为、排查问题,并进行性能优化和故障排除。

    • eBPF在安全领域的创新

          eBPF利用其在网络监控和拦截方面的优势,可实现动态可定义的内核态网络安全:eBPF可以在内核态实时监控网络流量和数据包,并且根据事先定义的规则进行拦截和处理。这使得系统可以立即响应网络事件,包括攻击、异常流量等。eBPF允许在运行时动态加载和卸载安全规则,而无需重新启动系统或修改内核代码。这使得网络安全策略可以根据实际需求动态调整和更新,提高了灵活性和响应速度。eBPF提供了一种灵活的编程模型,可以使用高级语言编写网络安全规则,例如检测特定的网络流量模式、拦截恶意请求等。这使得用户可以根据具体的需求定制安全策略,更好地适应不同的网络环境和应用场景。eBPF可以与传统的网络安全解决方案(如防火墙、入侵检测系统)结合使用,提供更加全面和多层次的网络安全保护。通过与传统解决方案的结合,可以弥补它们的不足,并提供更强大的网络安全防御能力。

          在主机安全方面,eBPF与LSM(Linux Security Modules)机制相结合,实现动态的主机资源监控和拦截。

          LSM是Linux内核的访问控制架构,用于实施各种访问控制策略。它通过在系统调用、文件系统访问等操作中插入钩子的方式,来保护进程、文件等资源。当eBPF和LSM结合使用时,可以发挥以下优势:

          丰富的安全策略:eBPF可以与LSM结合,以实现更复杂、更细粒度的安全策略。LSM提供了钩子来拦截系统调用和文件访问等操作,而eBPF可以通过这些钩子来执行自定义的安全策略,从而实现更精细的访问控制。

          动态的安全策略更新:eBPF允许用户在运行时动态加载和卸载安全策略,而不需要重新编译或重新加载内核模块。这种灵活性使得用户能够及时更新安全策略以应对新的安全威胁或者变化的环境。

          全面的安全解决方案:eBPF和LSM结合可以提供一个全面的安全解决方案,涵盖了网络安全、系统调试、审计和访问控制等方面。这种综合性的安全解决方案可以帮助用户更好地保护其系统和数据免受各种安全威胁的影响。

    总结

          Linux eBPF 技术在网络、系统监控和安全领域的创新为用户提供了更多的选择和更高的灵活性。它不仅提供了一种高效、低开销的方法来实现各种网络功能和系统监控,还为用户提供了灵活、可扩展的机制来实现安全监控和防御。随着技术的不断发展和完善,预计 eBPF 技术在网络、系统监控和安全领域的应用还会不断增加和扩展。

  • 相关阅读:
    C专家编程 第6章 运动的诗章:运行时数据结构 6.3 操作系统在a.out文件里干了些什么
    [Python]Open CV 基础知识学习
    java基础面试
    defcon-quals 2023 crackme.tscript.dso wp
    2024年软件测试面试必看系列,看完去面试你会感谢我的!!
    MySQL索引为什么选择B+树,而不是二叉树、红黑树、B树?
    django特殊文件管理之Static和Media异同之处
    Vue实战篇二十八:实现一个手机版的购物车
    ESP32-C3入门教程 基础篇⑥——SPI通信点亮LCD显示屏
    初阶指针(1)
  • 原文地址:https://blog.csdn.net/whh_bjqy/article/details/139293460