将容器变成真正的沙箱

本文讲的是将容器变成真正的沙箱,【编者的话】本文来自于Jessie Frazelle的博客,原文链接here

容器现在非常流行,其最核心之处所使用的Linux原语和创建应用程序沙箱是一致的。大家比较熟悉的沙箱技术可能是Chrome沙箱,关于Chrome沙箱的详细介绍可以访问链接chromium.googlesource.com/chromium/src/+/master/docs/linux_sandboxing.md,其中与本文比较相关的是它使用了用户命名空间技术和seccomp机制,以及其他一些已经弃用的功能,包括AppArmor和SELinux。听起来有些熟悉?那是因为今天我们所了解的容器技术都使用了这些相同的功能。

为什么现在容器没有被认为是一个“沙箱”?

运行Chrome沙箱和运行容器的关键不同点之一在于权限的使用。Chrome沙箱以非特权用户身份运行,而大多数容器(例如docker、runc或者rkt)以root用户身份运行。

当然,我们都知道容器里运行的都是非特权进程,但是创建和启动容器在某些地方是需要使用root特权。

怎么以非特权用户运行容器?

你可能会说,非常容易,使用用户命名空间啊!但事实上没有这么简单。Chrome沙箱和容器的主要区别之一在于cgroups。Cgroups控制的是进程所能够使用的资源,而命名空间控制的是进程的可见范围。容器内嵌了cgroup资源管理,使用非特权用户创建cgroups是比较困难的,特别是设备控制组。

如果我们暂时忽略“使用非特权用户创建cgroups”这个难题,那使用非特权用户创建容器就简单了。用户命名空间技术允许我们在不使用任何特权的情况下创建所有命名空间,唯一需要提醒的是{uid,gid}_map必须将宿主机当前用户映射为容器内进程运行所使用的uid,{uid,gid}_map的大小可以只设置为1。比如说,你使用uid为1000的用户来创建容器,{uid,gid}_map设置为0 1000 1,即表示在容器内以uid为0的用户身份来运行进程,而1指的是{uid,gid}_map的大小。

Docker对于用户命名空间的支持有什么不同?

Docker对于用户命名空间的支持与上述方式完全不同。默认情况下,当重映射用户被创建时,/etc/subuid/etc/subgid这两文件将连续地写入65536范围以内从属用户和组的ID,起始ID的偏移量从这些文件当前条目开始计算。Docker的实现让更大范围的用户能够存于容器中,甚至可以让“匿名”用户来映射宿主机用户。如果你想了解更多关于Docker用户命名空间的实现,推荐estesp的博客或者Docker的官方文档

POC或者GTFO

为了证明在不使用cgroups情况下实现非特权容器的想法,我创建了binctr。我在谷歌论坛上也建了一个帖子来讨论如何在runc或者libcontainer中实现这个想法,具体可见hereAleksa Sarai已经开始提交代码,这可能很快就会成为一个现实。

这是否处于“沙箱”范畴?

通过实现,我们将

  • namespaces
  • apparmor
  • selinux
  • seccomp
  • capabilities limiting

这些都使用非特权用户进行创建!

沙箱应该是比较面向具体应用的,使用定制的AppArmor配置文件、Seccomp配置文件等等。通用容器决不会等价于沙箱,因为它过于普遍而不能真正地锁定应用程序。

容器并不能够完全防止你的应用程序受到危害,但它能够限制受到危害的程度。攻击者在一个拥有定制AppArmor或Seccomp配置文件且十分严谨的容器中所看到的与不使用容器所看到的是完全不同的世界。通过命名空间我们可以限制应用程序的可见范围,例如网络、挂载点、进程等等。而且通过cgroups我们能够进一步限制攻击者所能够使用的资源,无论是内存、cpu,还是fork原语。

但关于cgroups呢?

我们可以使用非特权用户给内存、blkio、cpu和pids建立cgroups,只要cgroup子系统的所有者被修改为当前用户。设备却是另外一回事,不过无法在一个用户命名空间中使用mknod并不是世界上最糟糕的事情。

我们不要完全把设备cgroup排除,将来完全有可能实现。4.6版本以上的内核,将会有一种新的cgroup命名空间。而现在的做法就是在容器内掩盖了cgroups路径,所以对于非特权容器来说不是完全有用。但未来也许可以(如果我们的要求足够好?)

这个想法带给我们的最棒收益是什么?

GitHub上讨论非特权runc容器这个问题的评论者中大多数都是来源于一些科学社区,他们都严格地被要求使用非root用户来运行程序。

但是这个想法的用处远不止于这个。我最期盼的用法之一就是Alex Larssonxdg-app所完成的工作,即在沙箱中运行应用程序。如果感兴趣的话可以了解下bubblewrap

还有subgraph,基于OS的容器专门用于安全和隐私方面,和我们有着相同的想法。

对于在容器中运行桌面应用以及解决容器的多租户问题我都有非常大兴趣,我衷心希望能够帮助容器发展成一个真正的沙箱。

原文链接:Getting Towards Real Sandbox Containers(翻译:肖远昊)

原文发布时间为:2016-05-14

本文作者:xiaoyh

本文来自合作伙伴DockerOne,了解相关信息可以关注DockerOne。

原文标题:将容器变成真正的沙箱

时间: 2024-09-13 19:56:31

将容器变成真正的沙箱的相关文章

如何在 Docker 容器之间设置网

你也许已经知道了,Docker 容器技术是现有的成熟虚拟化技术的一个替代方案.它被企业应用在越来越多的领域中,比如快速部署环境.简化基础设施的配置流程.多客户环境间的互相隔离等等.当你开始在真实的生产环境使用 Docker 容器去部署应用沙箱时,你可能需要用到多个容器部署一套复杂的多层应用系统,其中每个容器负责一个特定的功能(例如负载均衡.LAMP 栈.数据库.UI 等). 那么问题来了:有多台宿主机,我们事先不知道会在哪台宿主机上创建容器,如果保证在这些宿主机上创建的容器们可以互相联网? 联网

深入了解docker(docker镜像、容器、仓库的基本概念)_docker

本文重点给大家介绍docker镜像.容器.仓库的基本概念的知识. Docker概念 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制,相互之间不会有任何接口. 镜像 Docker 镜像就是一个只读的模板. 例如:一个镜像可以包含一个完整的 CentOS 操作系统环境,里面仅安装了 httpd或用户需要的其它应用程序. 镜像可以用来创建 Docker 容器. Dock

大数据工程师练成记之首重:知识体系一览!

我们想要告诉大家的是成为大数据工程师需要掌握的知识体系,而作为初学者,你可以先从简单的入手,慢慢在学更深的知识,拿出高考的恒心和坚持来,肯定能行. 值得一提的是,目前大数据工程师的月薪都是20K起,月收入两万的薪资是不是很诱人?而且大数据工程师是非常容易找到工作的,所以--Why not 不扯犊子了,由于篇幅所限,这一部分内容主要包括数据可视化.机器学习和算法三个分支. 数据可视化 R R不仅是编程语言,同时也R具有强大的统计计算功能和便捷的数据可视化系统.在此,推荐大家看一本书,这本书叫做<R

有了Docker的程序猿们就能开启“上帝视角”?

现在,如果有程序猿说不知道Docker,这将是难以想象的. 百科是这样描述Docker的."Docker是dotCloud开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制,相互之间不会有任何接口."而更为通俗的说法是,Docker是轻量的虚拟化技术,它拥有"统一.一次操作和随处运行"的特性. 在很多程序媛心中,这应该是男神级的程序猿了吧 今年是Docker

Docker简介(转)

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app).几乎没有性能开销,可以很容易地在机器和数据中心中运行.最重要的是,他们不依赖于任何语言.框架包括系统. 起源 Docker 是 PaaS 提供商 dotCloud 开源的一个基于 LXC 的高级容器引擎,源代码托管在 Github 上,基于go语言并遵从 Ap

WIN10下安装Docker的教程_docker

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制,相互之间不会有任何接口. 1.去官方网站下载toolbox-->https://www.docker.com/toolbox 速度慢可以去这里下载https://get.daocloud.io/toolbox/ 2.安装过程直接下一步直至完成即可 3.安装完成点击桌面显示如下错误:--点击浏览找到git/bin目录下

Docker 搭建 Tomcat 运行环境的方法_docker

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制,相互之间不会有任何接口. 1 Docker与虚拟机   2 搭建过程 2.1 准备宿主系统 准备一个 CentOS 7操作系统,具体要求如下: 必须是 64 位操作系统 建议内核在 3.8 以上 通过以下命令查看您的 CentOS 内核: # uname -r 2.2 安装Docker # yum install d

在docker中部署tomcat并且部署java应用程序的步骤详解_docker

先给大家简单说下Docker的概念 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制,相互之间不会有任何接口. 1.先说如何在docker中部署tomcat 第一步:root用户登录在系统根目录下创建文件夹tomcat7,命令如:mkdir tomcat7,并且切换到该目录下:cd tomcat7: 第二步:创建Dockerfile,命令如:touch Docker

百花开放笑声甜,“开源萌宠”庆六一

  FreeBSD FreeBSD是一种类UNIX操作系统,Unix的一个重要分支,FreeBSD 为不同架构的计算机系统提供了不同程度的支持.   OpenSUSE OpenSUSE 操作系统和相关的开源程序会被SUSE Linux Enterprise使用,openSUSE对个人来说是完全免费的,包括使用和在线更新. linux Linux操作系统是基于UNIX操作系统发展而来的一种克隆系统,借助于Internet网络,并通过全世界各地计算机爱好者的共同努力,已成为今天世界上使用最多的一种U