容器VS虚拟化之安全性

编者按:提到容器的安全性,多数人都说它不够安全,但又不舍放弃其带来的高性能和便捷性。本文作者认为Docker其实已经提供了一种安全模式,并且能和SeLinux、AppArmor等所有Linux的安全方案搭配使用,只是很多人没有用好而已。作者通过将裸机、VMs和Container比作是建筑、公寓和私人房间,说明了这个问题。当然,从另一个角度来说,作者只考虑了单租户的问题,对多租户的情境,Container的安全性依旧不够。以下问原文:

自去年开始,Linux容器就一直处于技术炒作的最前沿,各种关于容器安全的讨论也随处可见。在大部分发表的讨论、文章和博客中,不管需要与否,与VMs的对比都不可避免。故事的真相更接近于“containers always”及“VMs sometimes”。 当然,也存在一些用户,在使用Docker后开始重新评估VMs。而在大部分情况下,用户更加偏向于性能而不是安全——单租户环境中,在使用VM生命周期管理方式的同时,避免虚拟化的开销无疑更加令人向往。

然而,对于那些依赖VMs实现安全的解决方案,Docker并不是替代,而是补充。

通常情况下,我更愿意将裸机、VMs和Container比作是建筑、公寓和私人房间。Linux容器可以存在于VM中,同样它们也可以直接运行在裸机上。现实生活中可能存在几个朋友共享一个公寓,他们分别使用自己的私人房间。但是毫无疑问,这和每个人拥有自己的公寓并不一样。如果你想和几个朋友共享一个公寓,那么这些人必须是你完全可信的。即使这样,这种安全只在一定的条件下可以,同时是有限度的。

我和妻子结婚已经12年,有两个孩子和我们生活在一起。我和妻子住在一个房间,而孩子住在另一间,还有第三个房间,是我的家庭办公室。将孩子们放在一个单独的公寓并没有太大意义,就像在自己VM上增加一个OpenSSH守护进程将之与应用程序分离一样。

孩子们有各自的私人房间,是未来让他们不会赖在父母的床上,但结果却差强人意(如果为3岁大的女儿准备自己的公寓,必然会触发一个CPS应用)。

我的家庭办公室是个禁止通行区域,就如我给这个房间配备了定制的防火墙,但是我的孩子仍然会进来,虽然不是经常。即使两岁大的孩子都清楚那个是父亲的空间,并且尊重这个设定。

容器就像是私人房间,在保护隐私方面是无价的——出于某些原因,在同一台主机或者VM上经常需要混搭多个进程。而在容器环境下,这些进程已经被隔离了,VMs带来的安全效益已不复存在。

这种容器之间松散的隔离并不是bug,而是一种有用的特性。我们假定容器中运行的进程运行在同一个VM上,那么在这些进程间实施严格、更细粒度的访问控制是一件好事。

实际情况下,即使是在一个运行单进程的主机上,运行容器也有助于你的安全防护。谁能保证以后我们不会运行任何通用进程?比如通常主机上都会运行的syslogd、sshd等。这显然不可能,在这里,我们可以假设有一个VM会直接加载一个网络服务器作为它的初始化进程(PID 1)。

那么这个进程可能会造成什么样的结果?它可以做什么?它是否可以发送原始网络框架?是否可以提升到root权限?既然系统上存在setuid-root,它是否可以被提升权限?如果可以提升,那么它可以做什么?它是否可以进行DAC重写,或者挂载文件系统,亦或是做其它只有root权限用户才可以进行的事情?

肯定的是,SeLinux可以被用于保护你的进程。但是相信不少DevOps工程师都将SELinux禁用了,并且没有多少人重写过自己的SELinux策略,甚至读过SeLinux策略的人都很少。时至今日,当下的Linux系统中又会有多少使用了SeLinux作为Docker的默认安全策略呢?这里的阻碍又是什么?

不错,你的应用程序可以放弃这些特权,但是你需要的应用程序及开发者做一些正确的事情。当然,你还可以选择使用一个包装盒,也就是Docker做的事情。

换个角度说:即便使用了VM,也不意味着你可以在主机上运行“chmod -R 777 /”。你的系统提供了进程所需要的安全政策,但是你可能并没有使用它们。Docker就是提供了这个功能的工具,在最大程度上的开箱即用。

毫无疑问,不管是从工具的角度还是文化的角度来说,上述问题正是DevOps成败的关键。而对于许多机构来说,“DevOps”通常是“soft ops”(软件层面上的Ops)。对比以往,开发者在建立和部署应用程序时有了更多的特权,尤其是在一个VM内时。这也导致了关注点的分离,通常hard-ops(硬件Ops) 工程师只负责硬件和网络基础设施的健康。而对于那些运行AWS或者GCE上的服务,更是将hard-ops外包给了Google和AWS。

hard-ops工程师,传统系统管理员,以及安全工程师,他们过去通常做的事情是应用程序部署工作,以及帮助评估安全问题。在有些机构,他们可能仍然从事这样的事情。但毫无疑问的是,开发者使用self-provisioning-in-a-bubble模式的机构数量正在增加。

不幸的是,在DevSecOps(或者说是SecDevOps)上并没有太大的进步。同时,随着DevOps向“No Ops”的倾斜,人们对安全上的关注可能在日渐减弱。

Docker作为一个DevOps工具,通过为用户提供一种安全模型,同时也让模型更容易及便捷的被调整,而在改变这种现状。Docker将安全切实的转交到开发者手中,让他们避免搬起石头砸自己的脚。

使用Docker,用户将默认获得严谨的功能集,而获得这个能力仅仅需要调整一些命令行参数。同时,对比以往阅读Linux系统调用手册后再胆战心惊的调试,你只需要在运行时设置一个简单的标记(或许在将来,这个操作可以通过Dockerfile更便捷的完成)。

容器安全肯定不会优于一个使用sys_setcap()做良好安全保障的应用程序,但是对于容器来说,它不与任何其他最佳实践冲突。它与VMs并不矛盾,可以良好的配合运行。同时,它与SeLinux或者AppArmor也不冲突,同样可以良好的搭配使用。事实上,使用之后你会发现,所有Linux中存在的安全方案都可以通过Docker进行。

原文链接:On the Security of Containers(编译/童阳 审校/周小璐)

如需要了解更多Docker相关的资讯或是技术文档可访问Docker技术社区;如有更多的疑问请在Dcoker技术论坛提出,我们会邀请专家回答。购票等问题可咨询QQ群:303806405。

Container技术日报公众账号已开启,欢迎关注!

时间: 2024-09-13 12:27:59

容器VS虚拟化之安全性的相关文章

云服务“兼得”的奥秘:容器与虚拟化共存

摘要:孟子<鱼我所欲也>中言:"鱼,我所欲也,熊掌亦我所欲也;二者不可得兼,舍鱼而取熊掌者也."这句话的意思想必大家都知道,即是二者必然不可兼得--人们在选择一样东西的时,就要牺牲另外一件东西--这似乎于与佛语的"舍得"有异曲同工之处.但事实真的如此吗? 孟子<鱼我所欲也>中言:"鱼,我所欲也,熊掌亦我所欲也;二者不可得兼,舍鱼而取熊掌者也."这句话的意思想必大家都知道,即是二者必然不可兼得--人们在选择一样东西的时,就要

如何使用基于容器的虚拟化提高效率性能

本文讲的是如何使用基于容器的虚拟化提高效率性能[IT168云计算]如果你不介意只使用一种操作系统的话,那么和传统的hypervisor相比,基于容器的虚拟化能够提供更高的效率与性能. 基于容器的虚拟化使用单个内核运行一个操作系统的多个实例.每个实例在一个完全隔离的环境中运行,因此不存在一个容器访问另一个容器中文件这样的风险.因此,基于容器的虚拟化是安全的. 而且这种虚拟化方式的资源使用效率也是非常高的,因为所有的容器都运行在同一个内核上.但是这种方式同样存在弊端:只有一个内核意味着无法选择其他的

一个“优雅”技术人眼中,容器与虚拟化的相爱相杀

       不知是由于技术炒作还是资本市场的青睐,近年来以 Docker 为代表的容器化技术已掀起一股浪潮,甚至出现了不少 Docker 容器将替代虚拟化的声音,他们认为 Docker 容器技术将推动云计算行业下一场革命. Docker是如何火遍整个行业的 鉴于不少非技术出身的读者对 Docker 也许不太了解, 雷锋网宅客频道借鉴公众号小黑羊的一篇文章,对 Docker 先做个简单科普: 生鲜市场有很多买东西的商贩(企业),他们需要一个库房(服务器)来存放和处理这些商品. 但是鱼呀.肉啊都需

利用虚拟化提高安全性的实际操作流程

以下的文章主要向大家描述的是如何正确利用虚拟化来提高安全性,我们都知道虚拟化技术可以帮助企业节省开支,IT资源管理的简化, 但是我们能利用虚拟化技术来加强系统和网络的安全性吗?随着虚拟蜜罐(honeypot)和蜜网(honeynet)技术的出现.到使用Hyper-V虚拟化技术分配服务器角色,再到虚拟应用程序的无缝沙盒(sandboxing)技术以及最新版本VMWare工作站的发布,答案是 肯定的.我们都知道虚拟化技术可以帮助企业节省开支,简化IT资源管理,但是我们能够利用虚拟化技术来加强系统和网

网络虚拟化提高安全性的四种方式

  虚拟化已经给IT部门带来了很多礼物.它让不可能不仅成为可能,更成为普遍.从服务器整合到云计算,虚拟化是目前世界范围内占主导地位的计算平台. 除了扩展计算能力,虚拟化也被认为是增加网络安全性的一种方法.VMware运营和销售发展总监Rod Stuhlmuller认为,在网络虚拟化中可以通过四种方式改善安全性. 网络虚拟化如何提高安全性 在云数据中心,应用程序工作负载随意配置,迁移和下线,云管理软件按需分配计算.存储和网络容量. 添加网络虚拟化到动态环境,彻底改变网络的运作模式.这样的深刻变化往

谈谈虚拟化及其安全性

虚拟化是硬件和软件工程的协作,以创建虚拟机(VM).这被认为是计算机硬件的抽象化,使单个物理机能够当作多个机器运行.没有虚拟机,单个操作系统将会占用所有的硬件资源,但是随着虚拟机的部署,具有各自独立虚拟机的多个操作系统可以共享硬件.虚拟化是指创建虚拟或基于软件版本的能力,包括存储设备.虚拟计算机硬件平台和计算机网络资源.虚拟化可以大致分为三类,包括操作系统虚拟化,完全虚拟化和半虚拟化(para-virtualization). 当组织的服务器被虚拟化时,对物理硬件的需求将会降低,这给企业带来的最

Joyent公司CTO谈容器安全:安全性是容器部署面临的首要问题

本文讲的是Joyent公司CTO谈容器安全:安全性是容器部署面临的首要问题[编者的话]随着容器技术的发展,越来越多的IT企业开始关注容器技术.面对视安全如生命的企业级项目,如何才能帮助他们快速扫清拥抱容器技术的障碍?致力于容器云服务的Joyent公司CTO Bryan Cantrill在第97期The New Stack Analysts中探讨了Joyent对容器安全问题的一些看法.本文根据这次访谈整理而成. 现在开发者开始拥抱容器技术,很多人使用例如Docker.Kubernetes Pods

什么是容器技术和虚拟化技术

问题描述 什么是容器技术和虚拟化技术 昨晚看到容器技术和虚拟化技术. 之前没研究过, 想知道什么是容器?什么是虚拟化技术?有好的文章或者图书推荐看看,谢谢~ 解决方案 广义上说,容器是虚拟化的一种,但是狭义上,我们说虚拟化,一般是操作系统虚拟化.也就是一个计算机上运行多个操作系统.容器(比如docker)指同一个操作系统中通过api虚拟化隔离不同的应用.因此容器拥有更好的性能. 解决方案二: http://www.linuxidc.com/Linux/2011-06/37350.htm

Docker 容器虚拟化的实用技巧总结_docker

服务器虚拟化指的是在操作系统与硬件之间加一层,叫做hypervisor层,对下控制硬件,对上承载操作系统,操作系统os以文件形式封装运行,称为虚拟机,主要解决的问题是硬件利用率和灵活性的问题,常见的方案为vmware vsphere,xen,kvm,hyper-v..容器虚拟化指的是在os上将应用打包以进程的形式运行,应用和应用间非完全隔离,但是更轻量,效率高,lxc和docker都可以称为容器级虚拟化,区别在于docker可以理解为经过精美封装过更加好用的lxc,有更好的接口和更完善的配套.