好的安全性是基于分层隔离的,而Docker恰好有很多分层。Docker支持所有主流Linux安全机制,同时Docker自身还提供了很多简单的并且易于配置的安全技术。
15.1 Docker 安全——简介
安全的本质就是分层!通俗地讲,拥有更多的安全层,就能拥有更多的安全性。而Docker提供了很多安全层,可以看下图。
Linux Dokcer 利用了大部分Linux通用的安全技术。这些技术包括命名空间、控制组、系统权限、强制访问控制、安全计算。对于上述的每种技术,Docker都设置合理的默认值,实现了流畅的并且适度安全的开箱即用体验,同时,Docker也允许用户根据特定需求自定义调整每项安全配置。
Docker平台本书也提供了一些非常棒的原生安全技术。并且重要的是,这些技术使用起来都非常简单。
Docker Swarm 模式:默认是开启安全功能的。无需任何配置,就可以获得加密节点ID、双向认证、自动化CA配置、自动证书更新、加密集群存储、加密网络等安全功能。
Docker 内容信任:允许用户对镜像签名,并且对拉取镜像的完整度和发布者进行验证。
Docker密钥:使安全称为Docker生态系统中重要的一环。Docker密钥存储在加密集群存储中,在容器传输过程中实时解密,使用时保存在内存文件系统,并运行了一个最小权限模型。
15.2 Docker 安全——详解
大家都知道安全是非常重要的。同时安全又很复杂并且枯燥无味。Docker平台提供的绝大部分安全功能使用起来都非常简单。并且大部分的安全设置都配置了默认值,意味着用户无需任何配置,就能得到一个相当安全的平台。当然,默认配置不一定是最合适的,但是至少在最开始能够保障一定的安全性。如果默认配置与用户需求不符,那么用户也可以进行自定义配置。
15.2.1 Linux安全技术
这里会介绍容器用到的主要Linux技术进行简介。
- Namespace
内核命名空间属于容器中非常核心的一部分!该技术能够将操作系统进行拆分,使一个操作系统看起来像多个相互独立的操作系统一样。这种技术可以用来做一些非常酷的事情,比如在相同的OS上运行多个Web服务,同时还不存端口冲突的问题。该技术还允许多个应用运行在相同OS上不存在竞争,同时还能共享配置文件以及类库。
举例说明:用户可以在相同的OS上运行多个Web服务,每个端口都是443.为了实现该目的,可以将两个Web服务分别运行在自己的网络命名空间中。这样可以生效的原因是每个网络命名空间都拥有自己的IP地址和对应的全部端口。也可能需要将每个IP映射到Docker主机的不同端口上,但是使用IP上的哪个端口无须其他额外配置。
Linux Docker 现在利用了下列内核命名空间:进程ID、网络、文件系统/挂载、进程内通信、用户、UTS等。
Docker容器是由各种命名空间组合而成的,Docker容器本质就是命名空间的组织集合。
- Control Group
如果说命名空间用于隔离,那么控制组就是用于限额。假设容器就是酒店中的房间。每个容器间都是相互独立的,但是每个房间共享一部分公共资源,比如水电、游泳池、健身房、餐厅等等。CGroup允许用户设置一些限制来保证不会存在单一容器占用全部的公共资源,如用光全部水或者吃光餐厅的全部早餐。
抛开酒店的例子,在Docker的世界中,容器之间是相互隔离的,但却共享OS资源,比如CPU、RAM以及硬盘IO。CGroup允许用户设置限制,这样单个容器就不能占用主机全部的资源了。
- Capability
以root身份运行容器可以不是什么好主意,root拥有全部的权限,因此很危险。到那时,如果以非root身份在后台运行容器的话,非root用户缺少权限,处处受限。所以用户需要一种技术,能选择容器运行所需的root用户权限。了解下Capability。
Docker采用Capability机制来实现用户以root身份运行容器的同时,还能移除非必须的root能力。如果容器运行只需要root的绑定系统网络号的能力,则用户可以在启动容器的同时移除全部root能力,然后再将 CAP_NET_BIND_SERVICE能力添加回来。
- MAC
Docker采用主流Linux MAC技术,例如AppArmor以及SELinux。基于用户的Linux发行版本,Docker对新容器增加了默认的AppArmor配置文件。根据Docker文档的描述,默认配置文件提供了“适度的保护,同时还能兼容大部分应用”。
- Seccomp
Docker使用过滤模式下的Seccomp来限制容器对宿主机内核发起的系统调用。按照Docker的安全理念,每个新容器都会设置默认的Seccomp配置,文件中设置了合理的默认值。这样做是为了在不影响兼容性的前提下,提供适度的安全保障。
用户同样可以自定义Seccomp配置,同时也可以通过向Docker传递指定参数,使Docker启动时不设置任何Seccomp配置。
- Linux安全技术总结
Docker基本支持所有的Linux重要安全技术,同时对其进行封装并赋予合理的默认值,这在保证了安全的同时也避免了过多的限制。
15.2.2 Docker平台安全技术
- Swarm模式
Swarm模式时Docker未来的趋势。Swarm模式支持用户集群化管理多个Docker主机,同时还能通过声明式的方式部署应用。每个Swarm都有管理者和工作者节点构成,系欸但可以是Linux或者Windows。管理者节点构成了集群中的控制层,并负责集群配置以及工作负载的分配。工作者节点就是运行应用代码的容器。
正如所预期的,Swarm模式包括很多开箱即用的安全特性,同时还设置了合理的默认值。这些安全特性包括以下几点:加密节点ID、基于TLS的认证机制、安全准入令牌、支持周期性证书自动更新的CA配置、加密集群存储、加密网络。
- Docker 安全扫描
快速发现代码缺陷的能力至关重要。Docker安全扫描功能使得对Docker镜像中已知缺陷的检测工作变得简单。Docker安全扫描对Docker镜像进行二进制代码级别的扫描,对其中的软件根据已知缺陷数据库(CVE数据库)进行检查。在扫描执行完成后,会生成一份详细报告。
登录Docker Hub,我们可以查看官方仓库镜像的安全扫描报告。
Docker可信镜像仓库服务(Docker Trusted Registry,DTR),属于Docker企业版中本地化镜像仓库服务的一部分内容,提供了相同的Capability,同时还允许用户自行控制其镜像扫描实际以及扫描方式。
- Docker内容信任
Docker内容信任(Docker Content Tuest,DCT)使得用户很容易确认所下载镜像的完整性以及其发布者。在不可信任的网络环境中下载镜像时,这一点很重要。
从更高层面来看,DCT允许开发者对发布到Docker Hub或者Docker可信服务的镜像进行签名。当这些镜像被拉取的时候,会自动确认签名状态。
DCT还以提供关键上下文,如镜像是否已被签名从而可用于生产环境,镜像是否被新版本取代而过时等。
- Docker 密钥
很多应用都需要密钥。比如密码、TLS证书、SSH key等。在Docker 1.13版本之前,没有一种标准且安全的方式能让密钥在应用间实现共享。场景的方式时开发人员将密钥以文本的方式写入环境变量。这与理想状态差距甚远。
Docker 1.13 引入了Docker密钥,将密钥变成Docker生态系统中的一等公民。例如,增加了一个新的子命令 docker secret 来管理密钥。在Docker的UCP界面中,也有专门的地方来创建和管理密钥。在后台,密钥在创建后以及传输中都是加密的,使用时被挂载到内存文件系统,并且支队那些已经被授权了的服务开放访问。这确实时一种综合性的端到端解决方案。
用户可以通过 docker secret 子命令来管理密钥,可以通过在运行 docker service create 命令时附件 --secret,从而为某个服务指定密钥。
15.3 本章小结
Docker可以通过配置变得特别安全。Docker支持全部的Linux主流安全技术,包括Nmaespace、Control Group、Capability、MAC以及SECcomp。Docker为这些安全技术设定了合理的默认值,但是用户也可以自行修改配置,或者禁用这些安全技术。
在通用的Linux安全技术之上,Docker平台还引入了大量自有安全技术。Swarm模式基于TLS构建,并且配置上及其简单灵活。安全扫描对镜像进行二进制源码级别扫描,并提供已知缺陷的详细报告。Docker内容信任允许用户对内容进行签名和认证,密钥目前也是Docker中的一等公民。
最终结论就是,无论用户希望Docker环境有多安全,Docker都可以实现。这一切都取决于用户如何配置Docker。
后面的两个章节介绍企业版Docker的特性,这里不做介绍。