eBPF的2022之旅

你好,我是倪朋飞。

不知不觉间,2022 年已经走到了尾声。每个年尾我都喜欢回顾一下过去这一年的旅程,看看过去这一年都发生了什么事情,有什么收获,有什么遗憾,有什么值得期待的事情等等。对 eBPF 的学习和应用也是一样,今天的内容我就带你一起总结一下 eBPF 在 2022 年的旅程。

eBPF 内核的新进展

作为 Linux 内核的一部分,我们先从内核来看看 eBPF 在 2022 年中都有哪些新的变化。

Linux 内核在 2022 年主要发布了 5.16-5.19 以及 6.0 和 6.1 这几个版本,每个版本都为 eBPF 引入了大量的新特性。具体来说,每个版本引入的主要特性包括:

  • Linux 5.16 为 eBPF 添加了布隆过滤映射(Bloom Filter Map)、原生跟踪可写上下文等特性,并允许在 eBPF 程序中直接调用内核模块函数。为了确保安全,非特权 eBPF 程序改成了默认不允许状态。
  • Linux 5.17 为 eBPF 添加了一次编译到处执行(Compile Once – Run Everywhere,简称 CO-RE)以及 bpf_loop() 辅助函数,大大简化了 eBPF 程序处理多版本内核兼容时的复杂性以及循环逻辑的处理。
  • Linux 5.18 为 eBPF 添加了内核探针多挂载(BPF_LINK_TYPE_KPROBE_MULTI)、在 XDP 程序 bpf_prog_run() 中传输数据包以及增强 LSM 程序的 IMA(Integrity Measurement Architecture)互操作等特性,进一步完善了 KPROBE、XDP、LSM 等类型 eBPF 程序的功能特性。
  • Linux 5.19 为 eBPF 添加动态指针和类型指针的支持,增强了内存访问的安全性。同时,libbpf 中新增的 USDT(User Statically-Defined Tracing)探针也完善了对用户空间自定义探针的支持。
  • Linux 6.0 为 eBPF 添加了类型匹配、64 位枚举、可睡眠用户探针等特性,并提升了循环的性能。
  • Linux 6.1 为 eBPF 添加了 BPF 内存分配器、用户空间环形缓冲区映射、通过 panic() 转存内存状态以及 PKCS#7 签名验证等特性,丰富了内存特性的同时增强了安全性。

关于这些版本详细的发布文档这儿不再展开,如果你有兴趣的话,可以点击这里的链接查看每个版本详细的发布文档。

伴随着这些内核版本的发布,新引入的功能特性也都集成到了 libbpfbpftool 中。你可以访问它们的 Github 发布网站,查看最新的发布列表。

在 Linux 内核如火如荼发展的同时,eBPF for Windows 项目也在不断地推进。在 2022 年中,eBPF for Windows 项目发布了从 v0.2.0 到 v0.5.0 的多个版本,每个版本都为 eBPF for Windows 添加了大量的新特性,并完善了使用文档和 API 参考文档,简化了入门者的学习曲线。虽然 eBPF for Windows 还是处于早期预览的状态,但从目前的进展来看,它已经具备了在 Windows 上运行 eBPF 程序的基本能力,并且支持把基于 libbpf API 的 Linux eBPF 程序经过简单修改迁移到 Windows 平台(比如 Cilium L4LB 经过修改也可以运行在 Windows 上)。

从以上这些最新版本的发布情况来看,eBPF 在内核中依然是最活跃的模块之一,它的功能特性还在快速发展中。同样,在内核之外的开源社区和商业公司也在不断地推进 eBPF 的发展,完善 eBPF 生态的同时为 eBPF 带来了更多的应用实践。接下来,我再带你一起看看开源社区和商业公司又为 eBPF 的生态带来了哪些最新的进展。

eBPF 生态的新进展

在 2021 年的时候,大家看待 eBPF 还是一个比较新的技术,讨论的更多是 eBPF 的探索和调研,吸引的主要也是开发者。但是,随着 2022 过去一年的快速发展,eBPF 已经被广泛地应用到了生产环境中,同时也催生了大量的新生开源项目和商业案例。

以应用最为广泛的 eBPF 产品 Cilium 为例,自 2021 年 10 月加入 CNCF 作为孵化项目以来,Cilium 取得了可谓是突飞猛进的发展。

  • 一方面,作为 CNCF 基金会的最新明星项目,Cilium 已经获得包括 AWS、Azure、GCE 在内的主流公有云平台和托管 Kubernetes 平台的支持。同时,Cilium 也与 Grafana、OpenTelemetry 等建立了广泛的合作关系,一起引领云原生观测和云原生安全的生态。
  • 另一方面,Cilium 也在不断地完善自己的功能特性。比如在 1.12 版本中引入的无边车 Service Mesh(sidecar-free Service Mesh),可以让用户在不需要任何代理的情况下,通过 eBPF 来实现服务间的流量控制和可观测性。其开源的 Tetragonpwru 等项目也不再依赖于 Cilium 网络插件,可以独立地使用,使得更多的用户可以方便地利用 eBPF 来实现网络观测、安全检测以及安全策略控制等丰富的功能。

除了 Cilium,开源社区中还有非常多的项目借助 eBPF 的能力来实现各种各样的功能。比如:

  • 应用性能监控项目 Apache SkyWalking 借助 eBPF 增强了性能剖析和网络诊断的能力。
  • TLS 加密明文捕获项目 eCapture 借助 eBPF 在无需 CA 证书的情况下就可以抓取 TLS 加密的明文数据。
  • 调试和剖析 Kubernetes 集群的项目 Inspektor Gadget 借助 eBPF 实现了一系列的小工具(Gadgets),可以帮助用户快速地定位和解决 Kubernetes 集群中的问题。
  • 运行时安全项目 FalcoTracee 借助 eBPF 实现了一系列的安全检测和安全策略控制功能。
  • 持续性能剖析平台 PyroscopeParca 借助 eBPF 实现了一系列的性能剖析功能。

除了开源项目,很多商业公司也已经把 eBPF 技术应用到了实际的业务中。比如,Linkedin 基于 eBPF 构建了其基础设施观测代理 Skyfall、宜家借助 Cilium L4LB 构建了其私有云网络负载均衡等等。

在利用 eBPF 强大能力的同时,这些开源项目和商业公司同时也积极参与构建 eBPF 生态,并通过开源贡献、社区会议等分享了他们的实践经验。所以,2022 年的社区会议也格外火热,不仅 eBPF Summit 2022、Linux Plumbers Conference (LPC) 2022、bpfconf 2022 等专注于 eBPF 的会议无一缺席,Cloud Native eBPF Day 也成了 KubeCon 的例行活动。在国内,西安邮电大学也举办了首届中国 eBPF 研讨会。这些繁荣的社区活动,不仅极大促进了 eBPF 技术的发展,也吸引了更多的人加入到 eBPF 中来,用 eBPF 解决更多的问题。

eBPF 的安全隐患

伴随着 eBPF 大量应用的同时,eBPF 带来的安全问题也逐渐暴露出来。Linux 内核中的漏洞可能会更容易地被恶意程序所利用,恶意程序也可以利用 eBPF 伪装自己的行为,从而绕过安全检测。在应用 eBPF 解决你的问题的同时,你也需要及时关注这些安全问题,以免受到新型恶意程序的攻击和影响。

比如,CVE-2022-23222 就是一个典型的 eBPF 权限提升漏洞,它会影响 Linux 5.8-5.16 之间的内核版本。由于内核在执行用户提供的 eBPF 程序前缺乏适当的验证,攻击者可利用这个漏洞提升权限并在内核上下文中执行代码,你可以在 Github 上找到这个漏洞的利用代码

这类问题的解决方法相对比较简单,只需要你紧跟发行版的安全更新,及时更新到带有 CVE 修复的内核版本即可。但是,如果你使用的是自己编译的内核,那么你需要及时关注内核的安全更新,把相关的 CVE 修复带到你维护的内核版本中,以免被恶意程序利用。

相对来说,利用 eBPF 的能力伪装自身行为的恶意程序则更难防御。比如,被誉为 NSA 顶级后门的 Bvp47、具有极高隐匿性的恶意软件 Symbiote 和 BPFdoor 等都借助 eBPF 的强大的能力,来隐藏自己的行为,从而绕过安全检测。在开源社区中,boopkitTripleCrossebpfkit 等 Rootkit 程序也都借助 eBPF 对内核或应用程序的执行路径进行修改,从而达到后门注入、权限逃逸、隐藏自身以及系统破坏等各种目的。

这类恶意程序的特征都是非常难以被检测到的,其防范也比较复杂,你可以从以下几个角度进行防御:

  • 第一,限制 eBPF 程序的运行,禁止普通用户和普通容器应用运行 eBPF 程序,特别是不要给普通进程赋予 CAP_BPFCAP_SYS_ADMIN 权限,更不要给容器随便赋予特权容器的权限。
  • 第二,对系统 eBPF 关键事件、eBPF 程序运行状态以及 eBPF 映射的访问等进行审计,异常事件及时告警处理。
  • 第三,对系统中的网络连接进行监控,实时探测网络连接的行为,最好是对所有的公网连接透过防火墙进行保护。
  • 第四,添加签名机制,只有经过签名的 eBPF 程序才可以加载运行。

小结

今天,我带你一起梳理了 eBPF 在 2022 年的旅程。过去一年,不仅 Linux 内核极大地丰富了 eBPF 的功能特性,eBPF 的生态和实践也取得了突飞猛进的发展。如果你还没有在产品中使用过 eBPF,从某些方面来看(特别是网络、观测、安全的角度来看),你或许已经落后了。在带来极大便利的同时,你也要留心 eBPF 带来的一些新挑战,比如安全性、多内核版本兼容性、性能等都是在 eBPF 实践过程中需要考虑的问题。

今天这一讲就到这里了。在 2023 年,我们专栏将继续关注 eBPF 的发展,为大家带来更多的 eBPF 相关的内容。下一次的动态更新预计会在 4 月份。如果你有对我们课程未来内容的建议,欢迎在评论区提出来,期待你与我一起完善和构建一个最贴近实践的 eBPF 知识体系。

思考题

我想邀请你来聊一聊:

在今天分享的 eBPF 新进展和新项目中,有没有一些是你已经在工作中使用过的呢?如果有使用过,它们帮你解决了哪些实际的问题?或者,还有哪些其他的产品或开源项目是你经常使用的呢?

文章来源:极客时间《eBPF 核心技术与实战

你可能感兴趣的:(后端)