[转帖]倪朋飞:eBPF的2022之旅

ebpf · 浏览次数 : 0

小编点评

## 2022 年 eBPF 的动态发展 ** past 一年,eBPF 的生态和实践取得了突飞猛进的发展。** * ** Linux 内核极大地丰富了 eBPF 的功能特性。** * eBPF 允许用户在内核中定义新的执行路径和执行命令。 * 这使得用户可以轻松地实现各种安全和性能提升方法。 * ** eBPF 的生态和实践也取得了突飞猛进的发展。** * 许多开源项目和商业公司已经把 eBPF 应用到了实际的业务中。 * 这使得eBPF 成为网络安全领域的必不可少的工具。 ** 今天,我们带你一起梳理了 eBPF 在 2022 年的旅程。** * **过去一年, eBPF 的功能特性被进一步丰富。** * eBPF 允许用户在内核中定义新的执行路径和执行命令。 * 这使得用户可以轻松地实现各种安全和性能提升方法。 * **eBPF 的生态和实践也取得了突飞猛进的发展。** * 许多开源项目和商业公司已经把 eBPF 应用到了实际的业务中。 * 这使得eBPF 成为网络安全领域的必不可少的工具。 ** 让我们一起思考:** * **在今天分享的 eBPF 新进展和新项目中,有没有一些你已经在工作中使用过的呢?** * **如果有使用过,它们帮你解决了哪些实际的问题?** * **或者,还有哪些其他的产品或开源项目是你经常使用的呢?** ** 归纳总结以上内容,生成内容时需要带 simple 排版:** * **eBPF 的生态和实践取得了突飞猛进的发展。** * 许多开源项目和商业公司已经把 eBPF 应用到了实际的业务中。 * 这使得eBPF 成为网络安全领域的必不可少的工具。 * **eBPF 允许用户在内核中定义新的执行路径和执行命令。** * 这使得用户可以轻松地实现各种安全和性能提升方法。 * **eBPF 成为网络安全领域的必不可少的工具。**

正文

https://zhuanlan.zhihu.com/p/598793866

 

你好,我是倪朋飞。

不知不觉间,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_BPF 和 CAP_SYS_ADMIN 权限,更不要给容器随便赋予特权容器的权限。
  • 第二,对系统 eBPF 关键事件、eBPF 程序运行状态以及 eBPF 映射的访问等进行审计,异常事件及时告警处理。
  • 第三,对系统中的网络连接进行监控,实时探测网络连接的行为,最好是对所有的公网连接透过防火墙进行保护。
  • 第四,添加签名机制,只有经过签名的 eBPF 程序才可以加载运行。

小结

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

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

思考题

我想邀请你来聊一聊:

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

与[转帖]倪朋飞:eBPF的2022之旅相似的内容:

[转帖]倪朋飞:eBPF的2022之旅

https://zhuanlan.zhihu.com/p/598793866 你好,我是倪朋飞。 不知不觉间,2022 年已经走到了尾声。每个年尾我都喜欢回顾一下过去这一年的旅程,看看过去这一年都发生了什么事情,有什么收获,有什么遗憾,有什么值得期待的事情等等。对 eBPF 的学习和应用也是一样,今

【转帖】纳尼,mysqldump导出的数据居然少了40万?

0、导读 用mysqldump备份数据时,加上 -w 条件选项过滤部分数据,发现导出结果比实际少了40万,什么情况? 本文约1500字,阅读时间约5分钟。 1、问题 我的朋友小文前几天遇到一个怪事,他用mysqldump备份数据时,加上了 -w 选项过滤部分数据,发现导出的数据比实际上少了40万。

[转帖]TCP半连接队列和全连接队列

TCP半连接队列和全连接队列 文章很长,建议收藏起来慢慢读! 总目录 博客园版 为您奉上珍贵的学习资源 : 免费赠送 :《尼恩Java面试宝典》持续更新+ 史上最全 + 面试必备 2000页+ 面试必备 + 大厂必备 +涨薪必备免费赠送 经典图书:《Java高并发核心编程(卷1)》 面试必备 + 大

[转帖]

Linux ubuntu20.04 网络配置(图文教程) 因为我是刚装好的最小系统,所以很多东西都没有,在开始配置之前需要做下准备 环境准备 系统:ubuntu20.04网卡:双网卡 网卡一:供连接互联网使用网卡二:供连接内网使用(看情况,如果一张网卡足够,没必要做第二张网卡) 工具: net-to

[转帖]

https://cloud.tencent.com/developer/article/2168105?areaSource=104001.13&traceId=zcVNsKTUApF9rNJSkcCbB 前言 Redis作为高性能的内存数据库,在大数据量的情况下也会遇到性能瓶颈,日常开发中只有时刻

[转帖]ISV 、OSV、 SIG 概念

ISV 、OSV、 SIG 概念 2022-10-14 12:29530原创大杂烩 本文链接:https://www.cndba.cn/dave/article/108699 1. ISV: Independent Software Vendors “独立软件开发商”,特指专门从事软件的开发、生产、

[转帖]Redis 7 参数 修改 说明

2022-06-16 14:491800原创Redis 本文链接:https://www.cndba.cn/dave/article/108066 在之前的博客我们介绍了Redis 7 的安装和配置,如下: Linux 7.8 平台 Redis 7 安装并配置开机自启动 操作手册https://ww

[转帖]HTTPS中间人攻击原理

https://www.zhihu.com/people/bei-ji-85/posts 背景 前一段时间,公司北京地区上线了一个HTTPS防火墙,用来监听HTTPS流量。防火墙上线之前,邮件通知给管理层,我从我老大那里听说这个事情的时候,说这个有风险,然后意外地发现,很多人原来都不知道HTTPS防

[转帖]关于字节序(大小端)的一点想法

https://www.zhihu.com/people/bei-ji-85/posts 今天在一个技术群里有人问起来了,当时有一些讨论(不完全都是我个人的观点),整理一下: 为什么网络字节序(多数情况下)是大端? 早年设备的缓存很小,先接收高字节能快速的判断报文信息:包长度(需要准备多大缓存)、地

[转帖]awk提取某一行某一列的数据

https://www.jianshu.com/p/dbcb7fe2da56 1、提取文件中第1列数据 awk '{print $1}' filename > out.txt 2、提取前2列的文件 awk `{print $1,$2}' filename > out.txt 3、打印完第一列,然后打