乐趣区

关于后端: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 签名验证等个性,丰盛了内存个性的同时加强了安全性。

对于这些版本具体的公布文档这儿不再开展,如果你有趣味的话,能够点击这里的链接查看每个版本具体的公布文档。

随同着这些内核版本的公布,新引入的性能个性也都集成到了 libbpf 和 bpftool 中。你能够拜访它们的 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 来实现服务间的流量管制和可观测性。其开源的 Tetragon 和 pwru 等我的项目也不再依赖于 Cilium 网络插件,能够独立地应用,使得更多的用户能够不便地利用 eBPF 来实现网络观测、平安检测以及安全策略管制等丰盛的性能。

除了 Cilium,开源社区中还有十分多的我的项目借助 eBPF 的能力来实现各种各样的性能。比方:

  • 利用性能监控我的项目 Apache SkyWalking 借助 eBPF 加强了性能分析和网络诊断的能力。
  • TLS 加密明文捕捉我的项目 eCapture 借助 eBPF 在无需 CA 证书的状况下就能够抓取 TLS 加密的明文数据。
  • 调试和分析 Kubernetes 集群的我的项目 Inspektor Gadget 借助 eBPF 实现了一系列的小工具(Gadgets),能够帮忙用户疾速地定位和解决 Kubernetes 集群中的问题。
  • 运行时平安我的项目 Falco 和 Tracee 借助 eBPF 实现了一系列的平安检测和安全策略管制性能。
  • 继续性能分析平台 Pyroscope 和 Parca 借助 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 的弱小的能力,来暗藏本人的行为,从而绕过平安检测。在开源社区中,boopkit、TripleCross、ebpfkit 等 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 核心技术与实战》

退出移动版