Docker如何改变云计算安全?
自云计算问世以来,人们就一直对云计算技术的安全性持有怀疑态度。一提到多租户模式:你可能与陌生人在同一个物理硬件上,即便服务提供商承诺采用虚拟机来隔离,也是如此,人们总是想到安全灾难。
时间证明,虚拟机确实提供了一层有效的隔离;更多的公司每天在采用虚拟机。Docker容器就好比微型虚拟机。比如说,如果一台服务器上可以运行10个虚拟机,同样这台服务器上可以运行100个、甚至1000个Docker容器。
坏消息是,默认状态下的Docker其安全性不如虚拟机和大多数云计算技术。由于多个Docker容器共享一个Linux内核,内核漏洞可能导致特权升级攻击方面存在更大的风险。通俗地说,Docker使用多租户模式是个坏主意,因为容器之间没有足够的固有隔离,无法完全确保一个用户根本无法访问另一个用户的容器。
现在有不少办法可以缓解这种风险。比如说,如果使用安全增强Linux(即SELinux,最初由NSA开发),即便Linux内核遭到危及,在容器外面肆意妄为的能力也很有限。但是完善这种办法却困难重重。
减小受攻击面
好消息是,Docker采用共享式Linux内核的架构实际上让你能够为开发的Linux应用程序大大减小受攻击面。如果你在开发并不需要多租户模式的技术(比如为银行、零售商和在线商家开发的软件),实际上可以通过采用Docker来增强安全性。
如何实现?如果你从一款为Docker开发的简约版Linux操作系统(比如开源CoreOS)开始入手,就能减少主机系统上面临的潜在攻击途径。CoreOS摈弃了Linux的大多数特性和功能,包括apt-get和yum之类的程序包管理器。要是不使用Docker,就很难将外部代码安装到CoreOS上。比如说,如果你想要安装Apache,就必须通过拉取里面有Apache的Docker容器才能安装上去。
这个要求减少了一系列受攻击面,因为无意中在Docker主机上运行不安全的代码变得极其困难。但是如果你将CoreOS与一项名为“临时映像”(sratch image)的特殊的Docker特性结合起来,安全方面的好处变得还要明显。
临时映像是最简约的Docker容器。它里面到底有什么东西呢?绝对是什么都没有。它是用一个空的打包文件创建而成的。不仅没有Apache,连二进制代码都根本没有创建。这个无二进制代码的磁盘映像概念在虚拟机上不可能实现,因为虚拟机并不共享Linux内核,这意味着虚拟机需要随带各自的二进制代码,才能正常运行。
眼下使用经过编译的Go二进制代码构建单单一套二进制代码的Docker容器方面在开展令人关注的工作。这种工作显著减小了Docker容器本身里面的受攻击面。比如说,如果你在临时映像里面运行你的应用程序代码,就没必要担心Bash Shellshock这个软件错误(bug)。那是由于你首先并不压根在容器里面使用bash命令。Linux内核本身成了唯一有可能的操作系统层面(非网络层面)的攻击途径。
为Docker化的应用程序确保安全的若干原则
如果你将CoreOS等简约的操作系统和SELinux以及临时映像结合起来,就能摈弃那些可能被人钻空子的不必要的技术。与大多数Linux发行版捆绑了大量不必要的工具不同,如果使用Docker,你就能创建经过精细调整、异常高效的基础设施集群,攻击途径比较少。
如果你将该方法与Docker公司打算未来一年推出的网络层安全特性结合起来,那么部署的Docker化的应用程序其安全性就会大大加强。
当然了,如果你在Docker里面构建的应用程序本身存在安全漏洞,这个方法没有太大帮助,而有时候,未知因素却是最让我们担忧不止的隐患。还有多少Heartbleeds和Shellshocks位于完全没有被发现的/usr/bin中呢?