在捕鱼大亨网络版中使用eBPF

介绍

捕鱼大亨网络版提供了一个高级API和一组组件,这些组件隐藏了几乎所有复杂的(对我们中的某些人而言)有趣的系统级细节。应用程序开发人员不需要了解计算机的IP表,cgroup,名称空间,seccomp,甚至如今也不需要。 容器运行时 他们的应用程序在其之上运行但在下面,捕鱼大亨网络版及其依赖的技术(例如,容器运行时)在很大程度上利用了Linux核心功能。

本文重点介绍网络,安全性和审计以及跟踪和监视工具中越来越多地使用的核心Linux功能。此功能称为 扩展的伯克利包过滤器 (eBPF)

注意: 在本文中,我们使用两个缩写词:eBPF和BPF。前者用于扩展的BPF功能,而后者则用于“经典” BPF功能。

什么是BPF?

BPF是驻留在运行BPF程序的Linux内核中的微型VM。在运行之前,BPF程序会加载 bpf() syscall并经过安全性验证:检查循环,代码大小等。BPF程序附加到内核对象,并在这些对象上发生事件时(例如,当网络接口发出数据包时)执行。

BPF超级大国

BPF程序通过定义来驱动事件,这是一个非常强大的概念,并且在事件发生时在内核中执行代码。 Netflix的Brendan Gregg 将BPF称为 Linux超级大国.

eBPF中的“ e”

Traditionally, BPF could only be attached to sockets for socket filtering. BPF’s first use case was in tcpdump. When you run tcpdump the filter is compiled into a BPF program 和 attached to a raw AF_PACKET socket in 要么der to print out filtered packets.

但是多年来,eBPF增加了附加功能 其他内核对象。除了套接字过滤之外,还支持以下一些附加点:

  • Kprobes(和等效的用户空间)
  • 追踪点
  • 网络调度程序或qdiscs用于分类或操作(tc)
  • XDP(eXpress数据路径) 此功能和其他更新功能(如内核内帮助功能和可用于与用户空间通信的共享数据结构(地图))扩展了BPF的功能。

使用捕鱼大亨网络版的eBPF的现有用例

一些开源捕鱼大亨网络版工具已经在使用eBPF,并且许多用例需要仔细观察,尤其是在网络,监视和安全工具等领域。

Cilium的动态网络控制和可见性

Cilium 是一个联网项目,大量使用eBPF超级功能来路由和过滤基于容器的系统的网络流量。通过使用eBPF,Cilium可以动态生成和应用规则(即使在使用XDP的设备级别),而无需更改Linux内核本身。

Cilium代理在每个主机上运行。它无需管理IP表,而是将网络策略定义转换为BPF程序,这些程序已加载到内核中并附加到容器的虚拟以太网设备。这些程序在发送或接收的每个数据包上执行(应用规则)。

下图显示了Cilium项目的工作方式:

根据所应用的网络规则,BPF程序可能会附带 tc 要么 XDP。通过使用XDP,Cilium可以将BPF程序附加到最低的点,这也是网络软件堆栈中性能最高的点。

如果您想了解有关Cilium如何使用eBPF的更多信息,请查看该项目的 BPF和XDP参考指南.

在Weave范围内跟踪TCP连接

编织范围 是用于监视,可视化和与基于容器的系统进行交互的工具。就我们的目的而言,我们将专注于Weave Scope如何获取TCP连接。

编织范围采用了在群集的每个节点上运行的代理。代理监视系统,生成报告并将其发送到应用服务器。应用服务器编译收到的报告,并在Weave Scope UI中显示结果。

为了准确地在容器之间绘制连接,该代理将BPF程序附加到跟踪套接字事件(打开和关闭连接)的kprobes上。 BPF程序, tcptracer-bpf,被编译成ELF目标文件并使用 哥布.

(作为附带说明,Weave Scope还具有一个使用eBPF的插件: HTTP统计

要了解有关其工作原理以及为什么这样做的更多信息,请阅读 这个广泛的职位金沃尔克 团队为 Weaveworks博客。你也可以看 最近的谈话 关于这个话题。

使用seccomp-bpf限制系统调用

Linux有300多个系统调用(读,写,打开,关闭等)可供使用或滥用。大多数应用程序只需要一小部分系统调用即可正常运行。 seccomp 是一种Linux安全工具,用于限制应用程序可以使用的系统调用集,从而限制潜在的误用。

The 要么iginal implementation of seccomp was highly restrictive. Once applied, if an application attempted to do anything beyond reading 和 writing to files it had already opened, seccomp sent a SIGKILL signal.

seccomp-bpf 启用更复杂的过滤器和更广泛的动作。 Seccomp-bpf,也称为seccomp模式2,允许以BPF程序的形式应用自定义过滤器。加载BPF程序后,将过滤器应用于每个syscall,并采取适当的措施(Allow,Kill,Trap等)。

seccomp-bpf在捕鱼大亨网络版工具中广泛使用,并在捕鱼大亨网络版本身中公开。例如,在Docker中使用seccomp-bpf来应用自定义 seccomp安全配置文件,在rkt申请 seccomp隔离器,在捕鱼大亨网络版本身中 安全上下文.

但是在所有这些情况下,BPF的使用都被隐藏了 libseccomp。在后台,libseccomp根据提供给它的规则生成BPF代码。生成后,将加载BPF程序并应用规则。

带有捕鱼大亨网络版的eBPF的潜在用例

eBPF是一种相对较新的Linux技术。因此,有许多用途尚未开发。 eBPF本身也在不断发展:在eBPF中添加了新功能,这些新功能将启用当前无法实现的新用例。在以下各节中,我们将研究其中一些才刚刚成为可能并且即将出现。我们希望这些功能将被开源工具所利用。

Pod和容器级别的网络统计

BPF套接字过滤并不是什么新鲜事物,但是每个cgroup的BPF套接字过滤是新的。在Linux 4.10中引入, 小组-bpf 允许将eBPF程序附加到cgroup。连接后,将对进入或退出cgroup中任何进程的所有数据包执行该程序。

A 小组 除其他外,是过程的分层分组。在捕鱼大亨网络版中,此分组位于容器级别。利用cgroup-bpf的一个想法是安装BPF程序,该程序收集详细的每个Pod和/或每个容器的网络统计信息。

Generally, such statistics are collected by periodically checking the relevant file in Linux's /sys directory 要么 using Netlink. By using BPF programs attached to 小组s for this, we can get much more detailed statistics: for example, how many packets/bytes on tcp port 443, 要么 how many packets/bytes from IP 10.2.3.4. In general, because BPF programs have a kernel context, they can safely 和 efficiently deliver more detailed information to user space.

为了探索这个想法,Kinvolk团队实施了概念验证: //github.com/kinvolk/cgnet。该项目将BPF程序附加到每个cgroup,并将信息导出到 普罗米修斯.

当然,还有其他有趣的可能性,例如进行实际的数据包过滤。但是目前阻碍实现此目标的障碍是在cgroup-bpf的要求下提供cgroup v2支持 码头工人 和捕鱼大亨网络版。

应用LSM

Linux安全模块 (LSM)在Linux内核中实现了用于安全策略的通用框架。 SELinuxAppArmor 就是这些例子。两者都在系统全局范围内实施规则,这使管理员有责任配置安全策略。

内陆人 是另一个正在开发中的LSM,它将与SELinux和AppArmor共存。初始补丁集已提交给Linux内核,并且处于开发的早期阶段。与其他LSM的主要区别在于,Landlock旨在允许非特权应用程序构建自己的沙箱,从而有效地限制了自己,而不是使用全局配置。使用Landlock,应用程序可以加载BPF程序,并在进程执行特定操作时执行该程序。例如,当应用程序使用open()系统调用打开文件时,内核将执行BPF程序,并且根据BPF程序返回的内容,将接受或拒绝该操作。

在某些方面,它类似于seccomp-bpf:使用BPF程序,seccomp-bpf允许无特权的进程限制它们可以执行的系统调用。 内陆人将更加强大,并提供更多的灵活性。考虑以下系统调用:

C  
fd = open(“myfile.txt”, O\_RDWR);

The first argument is a “char *”, a pointer to a memory address, such as 0xab004718.

使用seccomp,BPF程序只能访问syscall的参数,而不能取消引用指针,这使得无法基于文件做出安全性决策。 seccomp还使用经典的BPF,这意味着它无法利用eBPF映射(与用户空间进行交互的机制)。此限制意味着无法基于eBPF映射中的配置在seccomp-bpf中更改安全策略。

具有Landlock的BPF程序不接收系统调用的参数,而只接收对内核对象的引用。在上面的示例中,这意味着它将具有对该文件的引用,因此它不需要取消引用指针,考虑相对路径或执行chroot。

用例:基于捕鱼大亨网络版的无服务器框架中的Landlock

在捕鱼大亨网络版中,部署单位是pod。荚和容器是隔离的主要单元。但是,在无服务器框架中,部署的主要单元是功能。理想情况下,部署单位等于隔离单位。这使得无服务器框架像 无核 要么 OpenFaaS 陷入困境:针对隔离或部署单元进行优化?

为了实现最佳的隔离,每个函数调用都必须在自己的容器中进行-隔离的优点并不总是对性能有利。相反,如果我们在同一容器中运行函数调用,则会增加发生冲突的可能性。

通过使用Landlock,我们可以在同一个容器中将函数调用彼此隔离,例如,使一个函数调用创建的临时文件无法被下一个函数调用访问。 内陆人与基于捕鱼大亨网络版的无服务器框架等技术之间的集成将成为进一步探索的成熟领域。

使用eBPF审核kubectl-exec

在捕鱼大亨网络版 1.7中 审计建议 开始进入市场。目前,该计划的稳定状态为1.10版。顾名思义,它允许管理员记录和审核在捕鱼大亨网络版集群中发生的事件。

While these events log 捕鱼大亨网络版 events, they don't currently provide the level of visibility that some may require. For example, while we can see that someone has used kubectl exec to enter a container, we are not able to see what commands were executed in that session. With eBPF one can attach a BPF program that would record any commands executed in the kubectl exec session 和 pass those commands to a user-space program that logs those events. We could then play that session back 和 know the exact sequence of events that took place.

了解有关eBPF的更多信息

如果您想了解有关eBPF的更多信息,请参考以下资源:

结论

我们才刚刚开始看到eBPF的Linux超级功能已在捕鱼大亨网络版工具和技术中使用。毫无疑问,我们将越来越多地使用eBPF。我们在这里强调的只是对您将来可能期望的一种尝试。真正令人兴奋的是看到如何以我们尚未考虑的方式使用这些技术。敬请关注!

金沃尔克团队将在奥斯汀KubeCon的Kinvolk摊位上闲逛。快来和我们谈谈所有有关捕鱼大亨网络版,Linux,容器运行时以及eBPF的问题。