APP下载

谷歌开源沙箱容器运行时环境:gVisor

消息来源:baojiabao.com 作者: 发布时间:2024-05-09

报价宝综合消息谷歌开源沙箱容器运行时环境:gVisor

作者:Nicolas Lacasse是谷歌软件工程师

容器已彻底改变了开发、打包和部署应用程序的方式。然而,暴露在容器面前的系统攻击面太广了,以至于许多安全专家不建议使用容器来运行不可信赖或可能恶意的应用程序。

人们越来越渴望运行更异构化、不太可信的工作负载,这让人们对沙箱容器产生了新的兴趣――这种容器有助于在主机操作系统和容器里面运行的应用程序之间提供了一道安全的隔离边界。

为此,我们想要引入gVisor(https://github.com/google/gvisor),这种新型的沙箱有助于为容器提供安全隔离机制,同时比虚拟机更轻量级。gVisor与Docker和Kubernetes集成起来,因而在生产环境下运行沙箱容器轻而易举。

传统的Linux容器并不是沙箱

传统Linux容器中运行的应用程序访问系统资源的方式与常规(非容器化)的应用程序一模一样:直接对主机内核进行系统调用。内核在特权模式下运行,因而得以与必要的硬件交互,并将结果返回给应用程序。

如果是传统的容器,内核对应用程序所能访问的资源施加一些限制。这些限制通过使用 Linux控制组(cgroup)和命名空间来加以实现,然而并非所有的资源都可以通过这种机制来加以控制。此外,即使有这样的限制,内核仍然暴露了很大的攻击面,恶意应用程序可以直接攻击。

像seccomp过滤器这样的内核特性可以在应用程序和主机内核之间提供更好的隔离,但是它们要求用户为系统调用创建预定义的白名单。实际上,常常很难事先知道应用程序需要哪些系统调用。如果发现你应用程序需要的系统调用中存在着漏洞,过滤器提供的帮助也不大。

现有的基于虚拟机的容器技术

提高容器隔离效果的一种方法是让每个容器在其自己的虚拟机里面运行。这给了每个虚拟机自己的“机器”,包括内核和虚拟化设备,与主机完全隔离。即使访客系统(guest)存在漏洞,虚拟机管理程序仍会隔离主机以及主机上运行的其他应用程序/容器。

在不同的虚拟机中运行容器提供了出色的隔离、兼容性和性能,但可能也需要占用更多的资源。

Kata容器是一个开源项目,它使用精简版虚拟机,尽量减少占用的资源,最大限度地提高隔离容器的性能。与gVisor一样,Kata也包含与Docker和Kubernetes兼容的开放容器项目(OCI)运行时环境。

基于gVisor的沙箱容器

gVisor比虚拟机更轻量,同时保持相似的隔离级别。gVisor的核心是作为一个普通的非特权进程来运行的内核,它支持大多数Linux系统调用。这个内核用Go编写,选择这种语言是由于它具有内存安全和类型安全的特性。就像在虚拟机里面一样,在gVisor沙箱中运行的应用程序也有自己的内核和一组虚拟化设备,独立于主机及其他沙箱。

gVisor通过拦截应用程序的系统调用,并充当访客系统的内核,提供强大的隔离边界,一直在用户空间中运行。不像虚拟机在创建时需要一定的资源,gVisor可以适应不断变化的资源,就像大多数普通的Linux进程那样。gVisor就好比是一个极其准虚拟化的操作系统,与标准的虚拟机相比,它具有灵活占用资源和固定成本更低的优点。然而,这种灵活性的代价是每个系统调用的开销更大、应用程序兼容性较差,下面有详细介绍。

“安全的工作负载对业界来说是优先事项。我们很高兴看到像gVisor这样的创新方法,期待在规范阐述方面进行合作,并对联合技术组件进行改进,以便为生态系统提高安全性。”

—萨缪尔?奥尔蒂斯(Samuel Ortiz),Kata 技术指导委员会成员,英特尔公司首席工程师

“Hyper非常高兴看到gVisor采用了新颖的容器隔离方法。业界需要一个强大的安全容器技术生态系统,我们期待进行gVisor方面的合作,帮助安全容器进入主流。”

—Xu Wang,Kata 技术指导委员会成员,Hyper.sh首席技术官

与Docker和Kubernetes集成

gVisor运行时环境通过runsc(全称“运行沙箱容器”)与Docker和Kubernetes无缝集成,而runsc符合OCI运行时API。

runsc运行时环境可以与Docker的默认容器运行时环境runc互换。安装很简单;一旦安装完毕,只需要一个额外的标志(flag),就可以在Docker中运行沙箱容器:

runsc运行时环境可以通过使用cri-o或cri-containerd项目,在Kubernetes集群中使用沙箱pod,这些项目可以将来自Kubelet(每个节点上运行的主节点代理)的消息转换成OCI运行时命令。在Kubernetes中,大多数资源隔离都在pod层面进行,因此pod自然很适合成为gVisor 沙箱边界。Kubernetes社区目前正在敲定沙箱Pod API,但是现在就提供实验性支持。

gVisor实现了大部分的Linux系统API(200个系统调用,数量在增加中),但不是全部。一些系统调用和参数目前还没有得到支持,/proc和/sys文件系统的一些部分也是如此。因此,不是所有应用程序都可以在gVisor里面运行,但许多应用程序可以正常运行,包括 Node.js、Java 8、MySQL、Jenkins、Apache、Redis和MongoDB 等应用程序。

开始上手

作为开发人员,我们想要集两者之所长:容器的易用性和可移植性以及虚拟机的资源隔离。我们认为,gVisor往这个方向迈出了可喜的一步。查看我们在GitHub上的代码仓库(https://github.com/google/gvisor),即可了解如何上手gVisor,如何进一步了解其背后的技术细节。务必加入我们的谷歌用户组(https://groups.google.com/forum/#!forum/gvisor-users),参与讨论!





2018-05-03 07:31:00

相关文章