eBPF 打开了可观测性、追踪、网络和安全应用的潘多拉魔盒
用户空间与内核空间
为了理解 eBPF 的用武之地,首先我们需要了解用户空间与内核空间的基本区别
eBPF 适合内核空间;但是,用用户空间来类比 eBPF 对操作系统的重要性,就像 WASM 对浏览器的意义一样。WASM 允许用非 javascript 编写的应用程序在浏览器中解释。它允许为网络开发像 Figma 这样的产品。Sketch 和 Invision 将无法跟上 Figma 强大编辑器的强大功能。好消息是,eBPF的革命性和新颖性将有助于观察内核空间,并且不会让任何技术陷入困境。
为什么选择 eBPF
假设你想调查一下 Linux 内部发生了什么。我的意思是真正研究具体细节,您可以使用来自用户空间的接口,该接口可以与内核空间通信,该接口将提供诸如 File IO 等 Network Traces 信息,但这会导致 2 个问题:
1.内核空间级别的任何意外崩溃都可能导致对故障的根本原因缺乏可观察性;
2.由于它是一个接口,因此无法从用户空间看到硬件或其他内核级别详细信息;
这就是 eBPF 的用武之地。它是一种挂在内核内部的虚拟机,允许从内核查看用户空间。这打开了潘多拉魔盒,为可以利用 eBPF 的日志记录、检测和安全应用程序提供了可能性。
BPF 和 eBPF 的历史
eBPF 的名称来源于一种称为 BPF(Berkely Packet Filter)的旧技术。
BPF
BPF 最初是在 1990 年代初(在 Linux 成为主流之前)被设想为一种拦截来自内核本身的网络流量而不是依赖用户级进程的方法。它是一个网络分流器(监控网络流量)和数据包过滤器(过滤掉不需要的数据包以减少网络监控中的噪音)。
eBPF
在 2010 年代初期,需要有更好的可观测性工具,可以在软件而不是硬件中定义。此外,从用户空间到内核空间的所有事物都可能意外崩溃,而实际上不知道是什么导致了内核空间层的崩溃。Alexie 想要一些用户空间的应用程序可以调用的东西,这将是内核的钩子/探测点,这将进一步决定向用户空间发送信息。这就是eBPF诞生的地方。
eBPF 架构
eBPF 程序由 Kernel 或 user-land 应用程序的钩子/探针调用。这些钩子是预定义的,包括:
1. 系统调用
2. 函数进入/退出:自定义程序可以附加到进入/退出函数,以便它们可以在这些方案中运行。
3. 内核跟踪点:跟踪点是用于在运行时调用函数的轻量级钩子。它用于内核的跟踪和性能分析。
4. 通过XDP的网络接口:eXpress数据路径(XDP)允许自定义程序连接到eBPF,eBPF可以在接收到网络数据包时执行这些自定义程序。
5. LSI模块接口等。
如果钩子/探针不适用于特定用例;可以在用户和内核级别将探针附加到 eBPF。这些分别称为 uprobe 和 kprobe 。
加载
在 BPF 可以在内核上运行之前;它需要在一些 eBPF 加载器库的帮助下加载:
1. Cilium 的 eBPF:基于 Go 的 eBPF 加载库;
2. libbpf;
验证
需要确保 eBPF 程序可以安全运行 确保它遵循各种条件,例如:
1. 程序由私有 eBPF 程序运行(除非另有说明)
2. 程序不会使系统瘫痪
3. 程序始终运行完成
JIT编译
将 eBPF 字节码(在用户空间生成)转换为机器可读的代码。
eBPF Maps
这些是保存和检索数据所必需的。它们包含各种各样的数据,例如:
1. 哈希表 (Hash Tables)
2. 数组 (Arrays)
3. 堆栈跟踪 (Stack traces)
4. 等等
帮助程序调用
eBPF 不直接调用内核函数,以使 eBPF 与内核版本松散耦合。eBPF 调用函数调用内核定义的预定义辅助函数。这些帮助程序函数包括:
1. 当前时间和日期
2. 进程/cgroup 上下文
2.1 cgroup 基本上是进程、CPU、N/W 的隔离,用于单独的容器
3. 网络数据包操作和转发逻辑
4. 随机数生成器
尾调用和函数调用
eBPF 允许对其他 eBPF 函数进行尾部调用,从而实现 eBPF 程序的兼容性和可扩展性。
确保 eBPF 安全
由于 eBPF 是一个非常强大的概念,它允许用户级程序挂钩到内核级细节;eBPF 的架构必须确保这种技术在使用时不会破坏系统。
编写安全的 eBPF 程序
这包括:
1. eBPF 程序应该是非阻塞的。eBPF 程序可以包含一个循环,当且仅当,验证器可以确保该循环退出!
2. eBPF 程序不使用越界内存。
3. eBPF 程序应该很小。
4. eBPF!
加固 eBPF
1. eBPF 程序中的内核内存是只读的。
2. Spectre 迁移:Spectre 是 CPU 架构中的一个重大漏洞,它允许无序分支执行,从而导致攻击者访问敏感数据。eBPF 在 Verifier 级别阻止 Spectre 类型的攻击。
3. 常量绑定。
eBPF 应用
联网
eBPF 的网络用例包括执行流量控制、控制网络策略(通过 XDP)等 工具:
1. Calico网络
2. Cilium 的 CNI
可观测性
将内核级别详细信息发送到可观测性平台。
跟踪
想要了解生产跟踪和故障排除。BPFTrace 是适合您的工具。如果想知道 VACUUM 这个过程是如何在Postgres中发生的。BPFTrace 可以提供帮助。基于 eBPF 的跟踪工具列表:
1. BCC(用于创建内核跟踪工具的工具包)
2. BPFTrace
安全
传统上,auditd 用于审计 Linux 操作系统中发生的事情;但由于它是用户空间组件;有一些性能损失。
通过 eBPF 实现的低级可观测性有助于查找攻击者对内核级别更改的警报。例如,当应用程序更改权限发生更改时,它可以触发对正在侦听的 eBPF 自定义程序的警报。
基于 eBPF 的安全库:
1. Tetragon
2. KubeArmour:基于 K80 的安全引擎,使用 eBPF 和 Linux 安全模块 (LSM)
3. Falco