一、Docker安全-简介¶
安全本质就是分层!
Linux Docker利用了大部分Linux通用的安全技术。具体如下: 1、命名空间(Namespace) 2、控制组(CGroup) 3、系统权限(Capability) 4、强制访问控制(MAC)系统 5、安全计算(Seccomp)。
Docker平台本身也提供了一些非常棒的原生安全技术。具体如下: 1、Docker Swarm模式 默认开启,无须配置,就可以获得加密节点ID、双向认证、自动化CA配置、自动证书更新、加密集群存储、加密网络等安全功能 2、Docker内容信任(DCT) 允许用户对镜像签名,并且对拉取的镜像的完整度和发布者进行验证 3、Docker安全扫描 分析Docker镜像,检查已知缺陷,并提供对应的详细报告 4、Docker密钥 Docker密钥存储在加密集群存储中,在容器传输过程中实时解密,使用时保存在内存文件系统,并运行了一个最小权限模型。
二、Docker安全-详解¶
Docker安全由两部分组成,一种是Linux安全技术;另一种是Docker平台安全技术。
2.1 Linux安全技术¶
2.1.1 命名空间(Namespace)¶
内核命名空间属于容器中非常核心的一部分,该技术能够将os进行拆分,使一个操作系统看起来像多个独立的操作系统一样。
Docker容器是由各种命名的空间组合而成的。Docker容器本质就是命名空间的有组织集合。
Docker使用每个命令空间过程: 1、进程ID命名空间 Docker使用PID命名空间为每个容器提供互相独立的容器树。每个容器都拥有自己的进程树,意味着每个容器都有自己的PID为1的进程。PID命名空间也意味着容器不能看到其他容器的进程树,或者其所在主机的进程树。 2、网络命名空间 Docker使用NET命名空间为每个容器提供互相隔离的网络栈。网络栈中包括接口、ID地址、端口地址以及路由表。例如,每个容器都有自己的eth0网络接口,并且有自己独立的IP和端口地址。 3、挂载点命名空间 每个容器都有互相隔离的根目录/。这意味着每个容器都有自己的/etc、/var、/dev等目录。容器内的进程不能访问Linux主机上的目录,或者其他容器的目录,只能访问自己容器的独立挂载命名空间。 4、进程内通信命名空间 Docker使用IPC命名空间在容器内提供共享内存。IPC提供的共享内存在不同容器间也是互相独立的。 5、用户命名空间 Docker允许用户使用USER命名空间将容器内用户映射到Linux主机不同的用户上。常见的例子就是将容器内的root用户映射到Linux主机的非root用户上。用户命名空间对于Docker来说还属于新生事物且非必选项。该部分内容在未来可能出现改变。 6、UTS命名空间 Docker使用UTS命名空间为每个容器提供自己的主机名称。
2.1.2 控制组(Control Group)¶
命名空间用于隔离,控制组用于限额
假设容器就是酒店房间,每个容器都是独立的,但是每个房间都共享一部分公共资源(水电等)。控制组允许用户设置一些限制来保证不会存在单一容器占用全部公共资源。
2.1.3 系统权限(Capability)¶
适用于非root用户操作。
在底层,Linux root用户是由许多能力组成的。其中一部分包括以下几点。 1、CAP_CHOWN:允许用户修改文件所有权。 2、CAP_NET_BIND_SERVICE:允许用户将socket绑定到系统端口号。 3、CAP_SETUID:允许用户提升进程优先级。 4、CAP_SYS_BOOT:允许用户重启系统。 Docker采用Capability机制来实现用户在以root身份运行容器的同时,还能移除非必须的root能力。如果容器运行只需要root的绑定系统网络端口号的能力,则用户可以在启动容器的同时移除全部root能力,然后再将CAP_NET_BIND_SERVICE能力添加回来。
2.1.4 强制访问控制(MAC)系统¶
Docker采用主流Linux MAC技术,例如AppArmor以及SELinux。
Docker允许用户在启动容器的时候不设置相应策略,还允许用户根据需求自己配置合适的策略。
2.1.5 安全计算(Seccomp)¶
Docker使用过滤模式下的Seccomp来限制容器对宿主机内核发起的系统调用。
用户同样可以自定义Seccomp配置,同时也可以通过向Docker传递指定参数,使Docker启动时不设置任何Seccomp配置。
2.1.6 Linux安全技术总结¶
使用Docker在对安全技术的封装中提供的默认值是很不错的选择。
2.2 Docker平台安全技术¶
2.2.1 Docker Swarm模式¶
Swarm模式包括很多开箱即用的安全特性,同时还设置了合理的默认值。这些安全特性包括以下几点: * 加密节点ID * 基于TLS的认证机制 * 安全准入令牌 * 支持周期性证书自动更新的CA配置 * 加密集群存储(配置DB) * 加密网络
了解Swarm安全背后的原理 1、Swarm准入令牌 向某个现存的Swarm中加入管理者和工作者所需的唯一凭证就是准入令牌。每个Swarm都包含两种不同准入令牌。 (1)管理者所需准入令牌 (2)工作者所需准入令牌
Swarm准入令牌格式如下: PREFIX-VERSION-SWARM ID-TOKEN (1)PREFIX永远是"SWMTKN',允许通过表达式匹配到该令牌 (2)VERSION展示了Swarm版本信息 (3)SWARM ID列是Swarm认证信息的一个哈希值 (4)TOKEN决定该令牌是管理者还是工作者的准入令牌
2、TLS和双向认证 每个加入Swarm的管理者和工作者节点,都需要发布自己的客户端证书。这个证书用于双向认证。证书中定义了节点相关信息,包括从属的Swarm集群以及该节点在集群中的身份
3、配置CA信息 Swarm允许节点在证书过期前重新创建证书,这样可以保证Swarm中全部节点不会在同一时间尝试更新自己的证书信息。
4、集群部署 集群存储是Swarm的大脑,保存了集群配置和状态数据。存储目前是基于etcd的某种实现,并且会在Swarm内所有管理者之间自动复制。存储默认也是加密的。
集群存储的日常维护由Docker自动完成。但是,在生产环境中,需要为集群存储提供完整的备份和恢复方案。
2.2.2 Docker安全扫描¶
快速发现代码缺陷的能力至关重要。Docker安全扫描功能使得对Docker镜像中已知缺陷的检测工作变得简单。
Docker安全扫描对Docker镜像进行二进制代码级别的扫描,对其中的软件根据已知缺陷数据库(CVE数据库)进行检查。在扫描执行完成后,会生成一份详细报告。
Docker可信镜像仓库服务(Docker Trusted Registry,DTR),属于Docker企业版中本地化镜像仓库服务的一部分内容,提供了相同的Capability,同时还允许用户自行控制其镜像扫描时机以及扫描方式。
2.2.3 Docker内容信任(DCT)¶
Dockr内容信任(Docker Content Trust, DCT)使得用户很容易就能确认所下载镜像的完整性以及其发布者。在不可信任的网络环境中下载镜像时,这一点很重要。
DCT还可以提供关键上下文,如镜像是否已被签名从而可用于生产环境,镜像是否被新版本取代而过时等。
DTC提供的上下文还在初期,配置起来相当复杂。在Docker主机上启用DCT功能,所要做的只是在环境中将DOCKER_CONTENT_TRUST变量设置为1.
$ export DOCKER_CONTENT_TRUST=1
一旦DCT功能开启,就不能获取并使用未签名镜像了。下图展示了开启DCT之后,如果再次尝试通过Docker CLI或者UCP Web UI界面拉取未签名镜像时所报的错误。
Docker内容信任是一种很重要的技术,能帮助用户检查从Docker服务中拉取的镜像。该技术的基础模式配置起来非常简单,但是类似上下文等一些高级特性,现阶段配置起来还是非常复杂的。
2.2.4 Docker密钥¶
在后台,密钥在创建后以及传输中都是加密的,使用时被挂载到内存文件系统,并且只对那些已经被授权了的服务开放访问。这确实是一种综合性的端到端解决方案。
下面介绍Docker密钥引入流程

针对Docker密钥引入流程说明如下: 1、创建密钥,并发送到Swarm 2、密钥存放在集群存储当中,并且是加密的(每个管理者节点都能访问集群存储)。 3、B服务被创建,并且使用了该密钥。 4、密钥传输到B服务的任务节点(容器)的过程是加密的。 5、B服务的容器将密钥解密并挂载到路径/run/secrets下。这是一个临时的内存文件系统 6、一旦容器(服务任务)完成,内存文件系统关闭,密钥也随之删除。 7、A服务中的容器不能访问该密钥。
三、Docker安全-相关操作¶
3.1 查看指定节点客户端证书¶
1、执行openssl x509 -in /var/lib/docker/swarm/certificates/swarm-node.crt -text命令指定节点客户端证书
root@docker-virtual-machine:~# openssl x509 -in /var/lib/docker/swarm/certificates/swarm-node.crt -text
Certificate:
Data:
Version: 3 (0x2)
Serial Number:
12:7a:0e:77:47:f4:dc:4e:d1:54:83:29:5e:94:9c:77:59:0e:6c:7a
Signature Algorithm: ecdsa-with-SHA256
Issuer: CN = swarm-ca
Validity
Not Before: Nov 6 06:14:00 2022 GMT
Not After : Feb 4 07:14:00 2023 GMT
Subject: O = nkdf5crwz4dn64blgoaacionu, OU = swarm-manager, CN = 1n6asl32zm64n5mn5s3ijkalb
Subject Public Key Info:
...
...
上述输出中,Subject中用到了O、OU以及CN字段分别表示Swarm ID、节点角色以及节点ID信息。具体如下: * 组织字段O保存的是Swarm ID。 * 组织单元字段OU保存的是节点在Swarm中的角色。 * 规范名称字段CN保存的是节点的加密ID。
在Validity中,还可以直接看到证书的更新周期。
3.2 配置CA信息¶
1、执行docker swarm update --cert-expiry 720h命令更新swarm证书更新周期修改为30天,也可以增加--external-ca参数来指定外部的CA
root@docker-virtual-machine:~# docker swarm update --cert-expiry 720h
Swarm updated.
3.3 为服务指定密钥¶
1、执行docker service create dockersamples/atseasampleshopapp_reverse_proxy --secret revprox_key命令为dockersamples/atseasampleshopapp_reverse_proxy指定密钥revprox_key
root@docker-virtual-machine:~# docker service create dockersamples/atseasampleshopapp_reverse_proxy --secret revprox_key