转载自:http://dockone.io/article/5280

容器技术彻底改变了我们对应用程序进行开发、打包与部署的具体方式。然而,系统在与容器对接时仍会暴露出大量攻击面,因此相当一部分安全专家不建议在容器当中运行不受信任或潜在的恶意应用程序

随着用户越来越多地希望在容器当中运行异构及低信任度工作负载,沙箱化容器也就应运而生——此类容器能够在主机操作系统与容器内应用程序之间提供安全的隔离边界。

为此,我们将介绍gVisor——一款新型沙箱解决方案,其能够为容器提供安全的隔离措施,同时继续保持远优于虚拟机的轻量化特性。gVisor能够与Docker及Kubernetes实现集成,从而在生产环境中更轻松地建立起沙箱化容器系统。

传统Linux容器并不属于沙箱环境

传统Linux容器当中运行的应用程序采用等同于常规(非容器化)应用程序的系统资源访问方式:即直接对主机内核进行系统调用。内核以高权限模式运行,允许其与必要硬件交互并将结果返回给应用程序。

01.png


对于传统容器,我们可以立足内核对应用程序所能访问的资源作出一些限制。这些限制通过Linux cgroups与命名空间来实现。然而,并非所有资源皆可通过这种方式加以控制。此外,即使存在这些限制,内核仍然在很大程度上暴露在恶意应用程序的攻击范围之内。

seccomp过滤器这类内核功能可以在应用程序与主机内核之间建立更好的隔离机制,但其要求用户创建预定义的系统调用白名单。在实践当中,我们往往很难预先确定哪些应用程序需要哪些系统调用。如果应用程序所需要的系统调用当中存在安全漏洞,过滤器功能更是表现得无能为力。

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

改进容器隔离能力的一种方法,是在其自有虚拟机中运行各套容器。这能够为每个容器提供属于自己的“机器”,包括对应内核与虚拟化设备,且与主机完全分离。在这种情况下,即使访客虚拟机当中存在漏洞,管理程序也仍能将其与主机以及同样运行在主机上的其它应用程序/容器隔离开来。

2.png


不同的虚拟机往往能够提供良好的隔离性、兼容性与性能表现,但其同样需要占用可观的资源与空间。

Kata容器是一个开源项目,其利用精简化虚拟机以尽可能减少资源占用量,同时最大限度提高容器隔离能力。与gVisor一样,Kata也包含与Docker及Kubernetes相兼容的开放容器倡议(简称OCI)运行时。

利用gVisor建立沙箱化容器

gVisor能够在保证轻量化优势的同时,提供与虚拟机类似的隔离效果。gVisor的核心为一套运行非特权普通进程的内核,且支持大多数Linux系统调用。该内核使用Go编写,这主要是考虑到Go语言拥有良好的内存管理机制与类型安全性。与在虚拟机当中一样,gVisor沙箱中运行的应用程序也将获得自己的内核与一组虚拟设备——这一点与主机及其它沙箱方案有所区别。

3.png


gVisor通过在用户空间内拦截应用程序系统调用并充当访客内核,gVisor能够提供强大的隔离边界。而与需要一组固定资源的虚拟机不同,gVisor能够随时适应不断变化的资源条件,这一点更像是普通Linux进程。gVisor很像是一种超虚拟化操作系统,其与完整虚拟机相比拥有更灵活的资源利用方式与更低的固定成本,但这种灵活性的代价是其系统调用成本更高且应用程序兼容性略差。

保护工作负载已经成为目前业界的首要任务,我们很高兴地看到gVisor这类创新方案的出现,并期待着能够在规范方面开展合作,共同对联合技术组件加以改进,从而为生态系统带来更可靠的安全保障能力。”
——Samuel Ortiz,Kata技术指导委员会成员、英特尔公司首席工程师

“Hyper公司鼓励我们了解gVisor采用的全新容器隔离方法,业界需要一套强大的安全容器技术生态系统,我们期待着与gVisor合作以将安全容器推向主流市场。”
——Xu Wang,Kata技术指导委员会成员、Hyper.sh公司CTO

与Docker及Kubernetes相集成

gVisor运行时能够与Docker及Kubernetes实现无缝化集成,这一集成效果通过匹配OCI运行时API的runsc(即‘run Sandboxed Container’的缩写)实现。

runsc运行时可与Docker的默认容器运行时runc进行互换。其安装非常简单; 在安装完成后,只需要一个额外标记即可在Docker内运行沙箱化容器:

$ docker run --runtime=runsc hello-world
$ docker run --runtime=runsc -p 3306:3306 mysql


在Kubenetes当中,大多数资源隔离在pod层面实现,而这意味着pod能够天然充当gVisor的沙箱边界。Kubernetes社区目前正在对沙箱pod API进行标准化调整,但目前已经开放实验性支持供用户体验。

runsc运行时能够在Kubernetes集群当中通过cri-o或cri-containerd等项目运行沙箱化pod——此类项目负责将Kubelet中的消息转换为OCI运行时命令。

gVisor能够实现大部分Linux系统API(总计200项系统调用与计数),但仍有一部分无法支持。部分系统调用与参数目前尚无法使用,/proc与/sys文件系统中的某些特定部分同样如此。因此,还有少数应用程序不能在gVisor当中运行。但除此之外,包括Node.js、Java 8、MySQL、Jenkins、Apache、Redis以及MongoDB等在内的大多数应用程序皆可顺利运作。

马上开始

作为开发者,我们希望能够让容器的易用性与可移植性同虚拟机的资源隔离能力结合起来。而gVisor无疑是我们朝着这一方向迈出的重要一步。您可以查看我们在GitHub上的repo以了解如何使用gVisor以及更多背后技术细节。同样欢迎大家加入我们的Google群组参与讨论!

如果您出席本次于哥本哈根召开的KubeCon大会,也请莅临我们的展台进行深入讨论并观看演示资料。

最后,请参阅gVisor PM的采访内容以了解更多信息。

原文链接:Open-sourcing gVisor, a sandboxed container runtime

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐