freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

eBPF - 释放 Linux 内核
2024-01-19 14:48:48

eBPF 打开了可观测性、追踪、网络和安全应用的潘多拉魔盒

1705654720_65aa39c0a2aab4854d6a3.png!small?1705654721894

用户空间与内核空间

为了理解 eBPF 的用武之地,首先我们需要了解用户空间与内核空间的基本区别

1705654514_65aa38f208b481ebde73e.png!small?1705654517387

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诞生的地方。

1705654784_65aa3a004e55b01e3ff64.png!small?1705654785106

eBPF 架构

1705654812_65aa3a1c68295eb2385f5.png!small?1705654813933

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. 随机数生成器

尾调用和函数调用

1705654495_65aa38df7563dd2be23d5.png!small?1705654517387

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 应用

1705654866_65aa3a52052be502a09e0.png!small?1705654867042

联网

eBPF 的网络用例包括执行流量控制、控制网络策略(通过 XDP)等 工具:

1. Calico网络

2. Cilium 的 CNI

可观测性

将内核级别详细信息发送到可观测性平台。

  • Grafana Beyla 允许将 HTTP 和 HTTPS 服务从 Linux 内核直接检测到 Grafana。
  • Cilium的哈勃

跟踪

想要了解生产跟踪和故障排除。BPFTrace 是适合您的工具。如果想知道 VACUUM 这个过程是如何在Postgres中发生的。BPFTrace 可以提供帮助。基于 eBPF 的跟踪工具列表:

1. BCC(用于创建内核跟踪工具的工具包)

2. BPFTrace

安全

传统上,auditd 用于审计 Linux 操作系统中发生的事情;但由于它是用户空间组件;有一些性能损失。

通过 eBPF 实现的低级可观测性有助于查找攻击者对内核级别更改的警报。例如,当应用程序更改权限发生更改时,它可以触发对正在侦听的 eBPF 自定义程序的警报。

基于 eBPF 的安全库:

1. Tetragon

2. KubeArmour:基于 K80 的安全引擎,使用 eBPF 和 Linux 安全模块 (LSM)

3. Falco

# 网络安全 # linux安全 # 云安全 # Linux内核 # ebpf
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录