随着 IT 技术的发展,AI、区块链和大数据等技术提升了对应用毫秒级扩展的需求,开发人员也面临着的功能快速推出的压力。混合云是新常态,数字化转型是保持竞争力的必要条件,虚拟化成为这些挑战的基本技术。

在虚拟化的世界,有两个词耳熟能详:虚拟机和容器。前者是对硬件的虚拟化,后者则更像是操作系统的虚拟化。两者都提供了沙箱的能力:虚拟机通过硬件级抽象提供,而容器则使用公共内核提供进程级的隔离。有很多人将容器看成是“轻量化的虚拟机”,通常情况下我们认为容器是安全的,那到底是不是跟我们想象的一样?

容器:轻量化的虚拟机?

容器是打包、共享和部署应用的现代化方式,帮助企业实现快速、标准、灵活地完成服务交互。容器化是建立在 Linux 的命名空间(namespace)和控制组(cgroup) 的设计之上。

命名空间创建一个几乎隔离的用户空间,并为应用提供专用的系统资源,如文件系统、网络堆栈、进程ID和用户ID。随着用户命名空间的引入,内核版本 3.8 提供了对容器功能的支持:Mount(mnt)、进程 ID(pid)、Network(net)、进程间通信(ipc)、UTS、用户 ID(user)6 个命名空间(如今已达 8 个,后续加入了 cgroup 和 time 命名空间)。

cgroup 则实施对应用的资源限制、优先级、记账和控制。cgroup可以控制 CPU、内存、设备和网络等资源。

同时使用 namespace 和 cgroup 使得我们可以在一台主机上安全地运行多个应用,并且每个应用都位于隔离的环境中。

虚拟机提供更强大的隔离

虽然容器很棒,足够轻量级。但通过上面的描述,同一个主机上的多个容器其实是共享同一个操作系统内核,只是做到了操作系统级的虚拟化。虽然命名空间提供了高度的隔离,但仍然有容器可以访问的资源,这些资源并没有提供命名空间。这些资源是主机上所有容器共有的,比如内核 Keyring、/proc、系统时间、内核模块、硬件。

我们都知道没有 100% 安全的软件,容器化的应用也一样,从应用源码到依赖库到容器 base 镜像,甚至容器引擎本身都可能存在安全漏洞。发生容器逃逸的风险远高于虚拟机,黑客可以利用这些逃逸漏洞,操作容器的外部资源也就是宿主机上的资源。除了漏洞,有时使用的不当也会带来安全风险,比如为容器分配了过高的权限(CAP_SYS_ADMIN 功能、特权权限),都可能导致容器逃逸。

而虚拟机依靠硬件级的虚拟化,实现的硬件隔离比命名空间隔离提供了更强大的安全边界。与容器相比,虚拟机提供了更高程度的隔离,只因其有自己的内核

由此可见,容器并不是真正的“沙盒”,也并不是轻量化的虚拟机。有没有可能为容器增加一个更安全的边界,尽可能的与主机操作系统隔离,做到类似虚拟机的强隔离,使其成为真正的“沙盒”?

沙盒化容器

答案是有,就是沙盒容器。这种容器就像虚拟机一样有自己的内核,这层内核成为用户空间内核。这层内核要保持容器的轻量级,使用现代编程技术编写,本身非常轻,仅用于作为容器和主机之间的强隔离层。

并且还要支持 OCI 和 CRI 规范,可以与 Docker 和 Kubernetes 等容器工具很好的集成。

这里简单介绍下 gVisor 和 Kata Containers。

gVisor

gVisor[1] 是使用 Go 编写的应用内核,实现了 Linux 操作系统的大部分接口。其包含了一个叫做 runsc 的 OCI 运行时,提供了应用和宿主机内核间的隔离层。runsc 也实现了与 Docker 和 Kubernetes 的集成,可以很容易的运行沙盒容器。

gVisor 为每个容器提供了独立的操作系统内核。应用与 gVisor 内核提供的虚拟环境进行交互,不是直接访问宿主机的内核。gVisor 还限制和管理文件和网络操作,确保容器化应用和主机操作系统之间有两个隔离层。通过减少和限制应用与主机内核的交互,尽可能减小攻击者绕过容器隔离机制的攻击面。

与大部分内核不同,gVisor 不需要固定的物理资源;相反,其利用现有的主机内核功能,并作为一个正常进程运行。换句话说,gVisor 以 Linux 的方式实现了 Linux。

gVisor 沙盒由多个进程组成,这些进程共同构成了可以运行一个或多个容器的环境。

每个沙盒都有其独立的实例:

Sentry:运行容器的内核,拦截并响应应用的系统调用。

沙盒中的每个容器都有其独立的实例:

Gofer:提供容器文件系统的访问。

Kata Containers

Kata Containers[2] 与容器一样轻量级且快,并与容器管理层集成-- 包括 Docker 和 Kubernetes 等流行的容器编排工具 -- 同时还提供了与虚拟机一样的安全。

Kata Containers 与 OCI、容器运行时接口(CRI)和容器网络接口(CNI)完全集成。它支持各种类型的网络模型(例如,passthrough、MacVTap、桥接、tc 镜像)和可配置的访客内核,以便需要特殊网络模型或内核版本的应用都可以在上面运行。上图显示了 Kata VM 中的容器如何与现有编排平台交互。

Kata 在主机上有一个 kata 运行时来启动和配置新容器。对于 Kata VM 中的每个容器,主机上都有一个相应的 Kata Shim。Kata Shim 接收来自客户端(例如 docker 或 kubectl)的 API 请求,并通过 VSock 将请求转发给 Kata VM 内的代理。Kata 容器进一步进行了几项优化,以减少 VM 启动时间。

Kata Containers 由两个开源项目合并而来:Intel 的 Clear containers 和 Hyper runV。前者注重性能(引导时间小于 100ms)和安全;而后者通过支持不同的 CPU 架构和管理系统,将技术无关放在首位。Kata Containers 可以说集二者之大成。

与传统的容器相比,Kata Container 做到了虚拟机的隔离,集虚拟机的安全性和容器的性能于一身。

总结

与普通容器相比,沙盒容器提供了更强的隔离性,这种强隔离提供了更高的安全性。同时这类容器技术支持 OCI 和 CRI 规范,可以与现有的容器工具以及 Kubernetes 很好的集成。

引用链接

[1] gVisor: https://github.com/google/gvisor
[2] Kata Containers: https://katacontainers.io

沙盒化容器:是容器还是虚拟机相关推荐

  1. 沙盒化容器:是容器还是虚拟机?

    公众号关注 「奇妙的 Linux 世界」 设为「星标」,每天带你玩转 Linux ! 随着 IT 技术的发展,AI.区块链和大数据等技术提升了对应用毫秒级扩展的需求,开发人员也面临着的功能快速推出的压 ...

  2. 影子系统、沙盒、虚拟机的区别,沙盒化容器:是容器还是虚拟机,容器、虚拟机、虚拟环境的区别

    1 容器和虚拟机的区别 虚拟机是操作系统级别的资源隔离,而容器本质上是进程级的资源隔离. 2 虚拟机和虚拟环境的区别 虚拟环境是为了隔绝用户的多个运行环境,避免冲突. 虚拟机是为了隔绝多个用户之间的操 ...

  3. linux 在沙盒中运行,Linux容器的细粒度沙盒策略执行方法与流程

    本发明专利属于计算机技术领域,涉及云计算安全方向.更具体的讲,本发明专利涉及一种Linux容器的细粒度沙盒策略执行方法. 背景技术: Linux容器技术采用命名空间将进.文件.设备等资源进行隔离,为用 ...

  4. linux snap 沙盒化软件包格式 简介

    0x01 关于Snap Snap是Ubuntu母公司Canonical于2016年4月发布Ubuntu16.04时候引入的一种安全的.易于管理的.沙盒化的软件包格式,与传统的dpkg/apt有着很大的 ...

  5. 【DEVOPS】借助Docker+Liquibase实现数据库的沙盒化

    借助Docker + Liquibase 实现数据库分钟级别的重建,做到开发/测试环境的沙盒化. 1. 前言 传统的开发/测试流程中,每次涉及到数据库的操作都是比较痛苦的: 你这到底做了什么样的骚操作 ...

  6. 布谷鸟沙盒分析静态文件_【虚拟机镜像分析】

    来源:iForensics ID:iForensics-2016 我们在工作中经常会接触到各种各样的虚拟机镜像,常见的镜像文件格式有:raw.qcow2.qed.qcow.luks.vdi.vmdk. ...

  7. Windows沙盒——系统自带的一次性虚拟机

    说明 在我们使用Windows的过程中,不可避免的要接触一些安全性未知的文件,比如破解软件.带有宏的文件以及一些不可描述的文件.虽然现在杀毒软件较为强大,但是万一更强大的病毒劫持了杀毒软件,那后果就严 ...

  8. Linux版idea沙盒化运行,游戏《Minecraft》IntelliJ下模组开发环境ForgeGradle的使用教程...

    嗯,当你想搞个模组的时候,肯定需要用到FG. 就比如编译模组的时候. 很好,首先下载源码去. files.minecraftforge.net/ 然后打开命令行到源码目录下 执行命令~ Win:   ...

  9. docker和虚拟机的区别服务器,杜老师说容器:Docker 与虚拟机的区别

    Docker 是一个开源应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux 或 Windows 机器上,也可以实现虚拟化.虚拟机可以虚拟出一个完成 ...

最新文章

  1. 【DB2】db2命令Export与Import
  2. PL/SQL Developer 中文乱码解决
  3. Node.js之HTPP URL
  4. java setpaintmode 用法_详解Paint的各种set方法
  5. 数据可视化js框架 d3.js入门
  6. 利用汇编挖掘编程语言的本质
  7. bat批处理命令拨号上网
  8. 数学图形(1.34) peut aussi曲线
  9. 关注的计算机视觉研究组和个人主页列表
  10. linux定时器无法重启pm2,在linux下开机启动pm2 不成功
  11. Linux下安装grafana
  12. 你如何理解软件测试?
  13. 2015年第六届C/C++ B组蓝桥杯省赛真题
  14. 通过直链下载google网盘里的文件
  15. python绿色蓝色代表什么_蓝绿黄车牌识别(Python)
  16. SPDY:一种更快速web的实验协议(转)
  17. 洛谷P1008 [NOIP1998 普及组] 三连击题解
  18. 创建 Time Machine 时间机器的备份至 openmediavault 5(OMV 5) NAS 的 SMB/CIFS 共享文件夹
  19. ftp服务器匿名用户文件夹,ftp服务器匿名用户文件夹
  20. 通过css设置img的src

热门文章

  1. 2018计算机职称考试题,2018年职称计算机Powerpoint考试试题及答案
  2. 实战讲解Python函数参数
  3. 简单介绍numpy实现RNN原理实现
  4. 关于学习Python的一点学习总结(31->继承及多态)
  5. 点分治问题 ----------- P3727 曼哈顿计划E[点分治+博弈SG函数打表找规律]
  6. python常用包下载_Python及其常用模块库下载及安装
  7. C++ __gnu_pbds(平板电视)超详细教程(C++内置的平衡树,字典树,hash)
  8. Codeforces Round #665 (Div. 2) 题解( 小学奥数专场 )
  9. kuangbin带你飞专题合集
  10. java 继承 注解_在java中实现组合注解原理分析(注解继承)