Docker是基于Linux操作系统实现的应用虚拟化。运行在容器内的进程,跟运行在本地系统中的进程本质上并无区别,配置不合适的安全策略将可能给本地系统带来安全风险。

19.1 命名空间隔离的安全

当用户用docker run命令启动一个容器时,Docker将在后台为容器创建一个独立的命名空间。命名空间提供了最基础也是最直接的隔离,在容器中运行的进程不会被运行在本地主机上的进程和其他容器通过正常渠道发现和影响。
与虚拟机方式相比,通过命名空间来实现的隔离并不是那么绝对。运行在容器中的应用可以直接访问系统内核和部分系统文件。因此,用户必须保证容器中应用是安全可信的(这跟保证运行在系统中的软件是可信的一样),否则本地系统将可能受到威胁。总之,**必须保证镜像的来源和自身可靠
Docker自1.3.0版本起对镜像管理引入了
签名系统**,加强了对镜像安全性的防护。用户可以通过签名来验证镜像的完整性和正确性。


19.2 控制组资源控制的安全

当用户执行docker run命令启动一个Docker容器时,Docker将通过Linux相关的调用,在后台为容器创建一个独立的控制组策略集合,该集合将限制容器内应用对资源的消耗。
控制组提供了很多有用的特性。它确保各个容器可以公平地分享主机的内存、CPU、磁盘IO等资源。当然,更重要的是,通过控制组,可以限制容器对资源的占用,确保了当某个容器对资源消耗过大时,不会影响到本地主机系统和其他容器。
尽管控制组不负责隔离容器之间相互访问、处理数据和进程,但是它在防止恶意攻击、特别是DDoS方面是是否有效的。
对于支持多用户的服务平台(比如公有的各种Paas、容器云),控制组尤其重要。例如,当个别应用容器出现异常时,可以保证本地系统和其他容器正常运行而不受影响,从而避免引发“雪崩”灾难。


19.3 内核的能力机制

能力机制(Capability)是Linux内核一个强大的特性,可以提供细粒度的权限访问控制。以前Linux系统对进程权限只有根权限和非根权限两种粗粒度的区别。Linux内核自2.2版本起支持能力机制,它将权限划分为更加细粒度的操作能力,既可以作用在进程上,也可以作用在文件上。
默认情况下,Docker启动的容器被严格限制只允许使用内核的一部分能力。用户可以根据自生需求来为Docker容器启动额外的权限。


19.4 Docker服务端的防护

使用Docker容器的核心是Docker服务端。Docker服务的运行目前还需要root权限的支持,因此服务端安全性十分关键。
首先,必须确保只有可信的用户才可以访问到Docker服务。Docker允许用户在主机和容器间共享文件夹,同时不需要限制容器的访问权限,这就容易让容器突破资源限制。例如,恶意用户可以在启动容器时将本地根目录挂载到容器中,那么就可以在容器中任意修改主机内容了。因此,当提供容器创建服务时(例如通过一个Web服务器),要注意参数的安全检查,防止恶意用户用特定的参数来创建一些有破坏性的容器。
用户可以通过基于HTTP的REST API来访问Docker服务端。建议使用安全机制,确保只有可信的网络或VPN网络,或证书保护机制下的访问可以进行。
最近改进的Linux命名空间机制将可以实现使用非root用户来运行全功能的容器。
目前,Docker滋生改进安全防护的目标是实现以下两个特性:


19.5 更多安全特性的使用


19.6 使用第三方检测工具