写点什么

gVisor:谷歌发布的一个用于提供安全隔离的轻量级容器运行时沙箱

  • 2018-05-21
  • 本文字数:2060 字

    阅读完需:约 7 分钟

看新闻很累?看技术新闻更累?试试下载 InfoQ 手机客户端,每天上下班路上听新闻,有趣还有料!

谷歌发布了一种新型沙箱 gVisor ,可以用于为资源占用较少、不需要运行完整 VM 的容器提供安全隔离。gVisor 的核心是一个使用 Go 编写的开源用户空间内核,与现有的容器技术相比,其设计做了不同的权衡,它实现了 Linux 系统表面的主要部分。该项目包含集成了 Docker 和 Kubernetes 的 OCI 运行时“runsc”。

据 gVisor 项目的 GitHub README 介绍,gVisor 是一个作为普通非特权进程运行的内核,支持大多数的 Linux 系统调用。就像在 VM 中一样,在 gVisor 沙箱中运行的应用程序有自己的内核和虚拟设备,与主机和其它沙箱区分开来。通过拦截应用程序系统调用并作为客户内核运行,gVisor 提供了强隔离边界,可以将其视为极致半虚拟化的操作系统,“与完整的VM 相比,资源占用更灵活,固定成本更低”。不过,这种灵活性牺牲了性能和兼容性:对于频繁进行系统调用的工作负载,gVisor 的性能可能会差一些;虽然gVisor 实现了Linux 系统API 的一大部分(目前200 个系统调用),但有几个系统调用和参数还不支持(/proc 和/sys 文件系统的某些部分),也就是说,并不是所有的应用程序都可以在gVisor 内运行

gVisor 分层(图片来自项目的GitHub 库

谷歌云平台(GCP)博客关于gVisor 的公告指出,容器已经彻底改变了组织开发、打包和部署应用程序的方式,但是同时,暴露给容器的系统表面很宽,许多安全专家“不建议在容器中运行不受信任的应用程序或者潜在的恶意应用程序”。为了佐证这种说法,该博文引用了opensource.com 的一篇文章“ Docker 容器真的安全吗?”,不过,需要注意的是,这篇文章是 2014 年发表的,从那时到现在,容器安全领域的许多东西都发生了变化,尤其是和Docker 相关的

不过,目前的容器技术仍然有许多广为人知的安全挑战,我们之前发表在InfoQ 的文章“ Docker 与高安全性的微服务:总结 Aaron Grattafiori 于 DockerCon 2016 的发言”中罗列过。其中一个主要的问题是,从单一共享内核获得效率和性能意味着容器逃逸可能成为一个漏洞。相应地,谷歌认为,人们越来越希望运行异构性更高、信任度更低的工作负载,这就引发了人们对于沙盒容器的兴趣,“容器可以帮助我们在主机操作系统和在容器中运行的应用程序之间提供一个安全的隔离边界”。

gVisor 限制了应用程序可访问的主机内核表面,同时又让应用程序可以访问它们希望访问的所有特性。和大多数内核不同,gVisor 并没不假定或需要一套固定的硬件资源;相反,它利用已有的主机内核功能,作为一个普通的用户空间进程运行。gVisor 会拦截应用程序的所有系统调用,并做必要的工作为它们提供服务。与其他容器技术相比,一个关键的区别是,gVisor 不是简单地把应用程序系统调用重定向给主机内核,而是实现了大多数内核原语(信号量、文件系统、Futex、管道、mm 等),并基于这些原语实现了系统调用处理程序。

为了提供纵深防御,限制主机系统表面,gVisor 运行时被分成了两个独立的进程。第一个是Sentry 进程,它包含内核,负责执行用户代码,处理系统调用。第二个是 Gofer ,它是一个文件系统操作代理,超出沙箱(非内部 proc 或 tmp 文件、管道等)的文件系统操作会通过 9P 连接发送给它。

gVisor Sentry 和 Gofer 架构(图片来自项目的GitHub 库

Sentry 需要一个平台来实现基本的上下文切换和内存映射功能。现在,gVisor支持两个平台 Ptrace 平台,使用 SYSEMU 功能执行用户代码,不需要执行主机系统调用;KVM 平台(试验性),使 Sentry 充当客户 OS 和虚拟机监视器(VMM),并在两者之间无缝地来回切换。

gVisor 运行时通过“ runsc ”(“run Sandboxed Container”的缩写)集成了 Docker 和 Kubernetes,遵循 OCI 运行时 API 标准。runsc 运行时可以和 runc 互换,后者是 Docker 的默认容器运行时。在 Kubernetes 中,大多数资源隔离发生在 pod 层,这让 pod 特别适合作为 gVisor 沙箱的边界。Kubernetes 社区目前正在规范化沙箱pod API ,但是,现在已经提供了试验性支持。runsc 运行时可以通过 cri-o 或者 cri-containerd 项目在 Kubernetes 集群中运行沙箱化的 pod。这两个工具会把 Kubelet 的消息转换成 OCI 运行时命令。

至于相关项目, Kata 容器是一个开源项目,使用“非常轻量级的”VM 来保证容器隔离的资源占用最小化。和 gVisor 类似,Kata 包含一个兼容 Docker 和 Kubernetes 的 OCI 运行时。在 HackerNews 上,有许多关于在这些技术之间进行取舍的讨论,其中有个用户表示“在[这些不同的沙箱技术] 之间进行取舍主要考虑的是兼容性、安全边界健壮性和性能”。

gVisor 使用 Go 语言编写,选择它是考虑到它的内存和类型安全性。需要注意的是,gVisor 目前只能在 x86_64 Linux 3.17+ 上构建和运行,而且在沙箱内只支持 x86_64 二进制文件(即不能运行 32 位二进制文件)。

gVisor 的 GitHub 库提供了更多信息,希望参与讨论的工程师也可以加入谷歌讨论组

查看英文原文 Google Release “gVisor”, a Lightweight Container Runtime Sandbox Used to Provide Secure Isolation

2018-05-21 19:0010778
用户头像

发布了 1008 篇内容, 共 397.2 次阅读, 收获喜欢 345 次。

关注

评论

发布
暂无评论
发现更多内容

基于区块链的去中心化身份技术有哪些应用前景?

CECBC

如何推动区块链与物联网深度融合,赋能数字化转型?

CECBC

JavaScript面试系列:JavaScript设计模式之桥接模式和懒加载

汪子熙

JavaScript 设计模式 桥接模式 28天写作 12月日更

GrowingIO Reactor速成指南

GrowingIO技术专栏

响应式编程 reactor

Python 的切片为什么不会索引越界?

Python猫

Python

如何正确的重写hashcode()

李子捌

Java 28天写作 12月日更

Gitee 如何自动部署 Pages?还是用 GitHub Actions!

冴羽

GitHub 前端 GitHub Pages gitee vuepress

十二张图带你了解 Redis 的数据结构和对象系统

程序员历小冰

redis 数据结构 28天写作 12月日更

SIGCOMM 首篇 Multi-path QUIC 论文:阿里自研多路径传输技术XLINK

阿里巴巴终端技术

网络协议 传输协议 移动端 客户端 QUIC

EMQ & 轻流:全托管物联网消息服务助力海量设备低代码智联

EMQ映云科技

物联网 mqtt

如何看待制造企业的数字化转型,有哪些成功案例可以分享?

优秀

低代码 数字化转型 制造业

☕【Java深层系列】「技术盲区」让我们一起完全吃透针对于时间和日期相关的API指南

洛神灬殇

Java 工具 日期处理 12月日更

怎样的活动才算是成功?(20/28)

赵新龙

28天写作

网络安全教程:13 信息收集

喀拉峻

黑客 网络安全 安全 信息安全

复盘健康

将军-技术演讲力教练

PassJava 开源(一) :初始化项目和添加微服务

悟空聊架构

SpringCloud 28天写作 passjava 悟空聊架构 12月日更

Dubbo框架学习笔记七

风翱

dubbo 12月日更

优酷播放黑科技 | 基于WebRTC实现的直播“云多视角“技术解析

阿里巴巴终端技术

WebRTC 移动开发 直播技术 客户端

NFT改变潮流,也在解放人类创造力的约束

CECBC

如何提高用户留存?

石云升

AARRR 产品思维 28天写作 产品增长 12月日更

动手做个 AI 机器人,帮我回消息!

程序员鱼皮

JavaScript AI 前端 nlp Node

电竞进入5G时代!腾讯云联合腾讯游戏CROS首秀5G电竞专网

科技热闻

🏆【CI/CD技术专题】「Docker实战系列」(1)本地进行生成镜像以及标签Tag推送到DockerHub

洛神灬殇

Docker 容器镜像 12月日更 Dockerhub

不要被数据蒙蔽你的眼睛

Geek_utwige

数据分析 统计学 辛普森悖论

聊聊你每天是如何修bug的

卢卡多多

bug修复 28天写作 12月日更

vue3.2组件库-element plus 自动按需引入

Mr.Cactus

typescript Vue3 Element Plus Vite2

跟着源码学IM(九):基于Netty实现一套分布式IM系统

JackJiang

Netty websocket 即时通讯 IM

在Vue-cli中使用mock.js

CRMEB

CSS之变量

Augus

CSS 12月日更

开发者供不应求,传统企业如何拥抱 DevOps ?

SoFlu-JavaAI开发助手

王者荣耀异地多活架构设计

Beyond Ryan

gVisor:谷歌发布的一个用于提供安全隔离的轻量级容器运行时沙箱_DevOps & 平台工程_Daniel Bryant_InfoQ精选文章