Docker 安全
该文为《深入浅出Docker》的学习笔记,感谢查看,如有错误,欢迎指正
这里主要针对 Linux 平台中的 Docker 安全进行学习。
安全的本质就是分层,安全层越多,安全性就越高
一、简介
Linux 本身就具有相当多的安全技术,而 Docker 可以直接利用这些安全技术,并且 Docker 平台自身也提供了一些很好的安全技术。
主要涉及的安全技术有这些:
Linux 安全技术
- 内核命名空间(Namespace)
- 控制组(Control Group)
- 系统权限(Capability)
- 强制访问控制(MAC)
- 安全计算(Seccomp)
Docker 平台安全技术
- Swarm 模式
- Docker 安全扫描
- Docker 内容信任
- Docker 密钥
Linux 的安全技术略微复杂,Docker 平台的安全技术非常简单,下面我们一起来了解一下。
二、Docker 安全详解
2.1 Linux 安全技术
2.1.1 Namespace
命名空间的作用就是隔离
,对于 Docker 来说,内核命名空间可以将操作系统(OS
)进行拆分,使一个操作系统看起来像是多个独立的操作系统。
比如在相同的 OS 上运行多个不同的 Web 服务,并且不存在端口冲突,同时还能共享配置文件以及类库。简单点说就是在 Docker 主机上启动多个容器,容器内运行的都是 Web 服务,使用的都是 443 端口,并且容器还拥有自己的 IP 地址。
具体使用到的内核命名空间以及作用:
- 进程ID(
PID
):为每个容器提供相互独立的进程树,每个容器都有自己得 PID 为 1 的进程。 - 网络(
NET
):为每个容器提供互相隔离的网络栈,每个容器都有自己的 eth0 网络接口、IP 和端口,路由表。 - 文件系统/挂载(
MNT
):每个容器都有互相隔离的根目录/
、包括/etc
、/var
等,只能访问自己,不能访问 Docker 主机及其它容器。 - 进程内通信(
IPC
):在容器内提供共享内存,在不同容器间也是独立的。 - 用户(
USER
):将容器内的用户映射到 Docker 主机中的某一用户上。常用操作是将容器的 root 用户映射到 Docker 主机上的非 root 用户上。 UTS
:为每个容器提供自己的主机名称。
可以认为,Docker 容器就是由命名空间组成的。
2.1.2 Control Group
控制组的作用是限额
,限制公共资源的消耗情况,如CPU
、RAM
、硬盘I/O
等。不允许全部被一个容器占完了。
2.1.3 Capability
如果直接用 root 用户运行容器,授予的权限过大,有安全隐患,如果不用 root 用户运行容器,容器内部又会处处受限,Capability
就是为了解决该问题。用 root 用户运行容器时,Capability
会移除不需要的 root 权限。
2.1.4 MAC
Docker 采用主流 Linux MAC 技术,例如AppArmor
和SELinux
。Docker 允许用户在启动容器时不设置相应策略,还允许用户根据需求自己设置合适的策略。
2.1.5 Seccomp
Docker 使用过滤模式下的Seccomp
来限制容器对宿主机内核发起的系统调用,每个新容器都会设置默认的Seccomp
配置,用户也可以自定义该配置,也可以选择不设置任何Seccomp
配置。
以上配置建议使用默认值,自定义配置比较麻烦。
2.2 Docker 安全技术
2.2.1 Swarm 模式
Swarm 模式是 Docker 未来的趋势,包含了很多开箱即用的安全特性,并且设置了合理的默认值。主要包括以下几点:
- 加密节点 ID
- 基于 TLS 的认证机制
- 安全准入令牌
- 支持周期性证书自动更新的 CA 配置
- 加密集群存储(etcd)
- 加密网络
使用docker swarm init
创建 Swarm 集群时,当前节点会被配置为第 1 个管理节点。并且赋予 Swarm 集群加密ID、以及安全准入令牌。加密 ID,节点角色这些信息都是存放在证书中的,证书默认 90 天更新一次。集群数据库也配置完成并处于加密状态。只需要一条命令
,即可完成上述所有操作。
1)我们看一下证书详情,证书位于/var/lib/docker/swarm/certificates/
路径下
[root@huanzi-001 certificates]# openssl x509 -in swarm-node.crt -text
Certificate:
Data:
Version: 3 (0x2)
Serial Number:
48:27:56:18:8d:6c:8f:b7:97:e9:13:6a:93:05:e5:93:12:78:55:c7
Signature Algorithm: ecdsa-with-SHA256
Issuer: CN=swarm-ca
Validity
Not Before: Feb 2 07:09:00 2020 GMT
Not After : May 2 08:09:00 2020 GMT
Subject: O=qqf7k4kamkrmvh3lpksrtiuox, OU=swarm-manager, CN=8bet9fg0tnoqlfp0ebrrqdapn
Subject Public Key Info:
其中,Subject
内,
O(组织字段)
保存的是 Swarm IDOU(组织单元字段)
表示节点在 Swarm 中的角色CN
保存的是节点的加密 ID 信息。
在Validity
中还能看到证书的创建时间和下次更新时间,默认为 90 天。
上述信息也可以通过docker system info
查看
[root@huanzi-001 certificates]# docker system info
<...>
Swarm: active
NodeID: 8bet9fg0tnoqlfp0ebrrqdapn
Is Manager: true
ClusterID: qqf7k4kamkrmvh3lpksrtiuox
<...>
CA Configuration:
Expiry Duration: 3 months
Force Rotate: 0
<...>
[root@huanzi-001 certificates]#
使用docker swarm update --cert-expiry
修改 CA 的更新周期
[root@huanzi-001 certificates]# docker swarm update --cert-expiry 720h
Swarm updated.
[root@huanzi-001 certificates]# docker system info | grep "Expiry Duration"
Expiry Duration: 4 weeks
[root@huanzi-001 certificates]#
CA 的相关命令可以使用docker swarm ca --help
获取。
2)我们再看一下令牌格式
[root@huanzi-001 certificates]# docker swarm join-token manager
To add a manager to this swarm, run the following command:
docker swarm join --token SWMTKN-1-1eg46zszknhjnjsg0mb6cg0wt6hmy3ot3i9iyk6j92pzz1u7aq-65s5cp6mpxj50lltled075toy 192.168.124.17:2377
[root@huanzi-001 certificates]#
其中SWMTKN-1-1eg46zszknhjnjsg0mb6cg0wt6hmy3ot3i9iyk6j92pzz1u7aq-65s5cp6mpxj50lltled075toy
的格式是:
PREFIX - VERSION - SWARM ID - TOKEN
PREFIX
永远是SWMTKN
,避免意外发布至公共环境VERSION
是 Swarm 的版本信息
SWARM ID
是 Swarm 认证信息的一个hash
值,Swarm 集群创建时会生成这个TOKEN
决定该令牌是manager
还是worker
如何手动更新令牌呢?可以使用docker swarm join-token --rotate manager
更新。
[root@huanzi-001 certificates]# docker swarm join-token --rotate manager
Successfully rotated manager join token.
To add a manager to this swarm, run the following command:
docker swarm join --token SWMTKN-1-1eg46zszknhjnjsg0mb6cg0wt6hmy3ot3i9iyk6j92pzz1u7aq-4mblx41ep8g7ymnobvg6vvazv 192.168.124.17:2377
[root@huanzi-001 certificates]#
对比一下新旧令牌:
旧:SWMTKN-1-1eg46zszknhjnjsg0mb6cg0wt6hmy3ot3i9iyk6j92pzz1u7aq-65s5cp6mpxj50lltled075toy
新:SWMTKN-1-1eg46zszknhjnjsg0mb6cg0wt6hmy3ot3i9iyk6j92pzz1u7aq-4mblx41ep8g7ymnobvg6vvazv
我们发现只有 TOKEN
变了。
令牌保存在数据库中,默认是加密的
3)再看一下集群存储
存储目前使用的是etcd
,并且在 Swarm 集群所有 manager
之间自动复制,存储默认加密
集群存储的日常维护由 Docker
自动完成,生产环境中,我们需要完成的是完整的备份和恢复方案
2.2.2 Docker 安全扫描
Docker 安全扫描功能可以检测镜像中的已知缺陷,进行二进制级别的扫描,并在扫描完成以后生成详细的报告。
已知缺陷都在已知缺陷数据库中(CVE 数据库)
2.2.3 Docker 内容信任
Docker 内容信任(Docker Content Trust,DCT)让用户可以很容易的确认所下载镜像的完整性和发布者。
允许开发者在将镜像推送至 Docker Hub 时进行签名。
- 一旦 DCT 功能开启,用户将无法获取并使用未签名镜像。
- DCT 还允许仅使用某一个签名的镜像。
要开启 DCT 功能,只用在环境中将DOCKER_CONTENT_TRUST
变量设置为 1 即可。
$ export DOCKER_CONTENT_TRUST=1
2.2.4 Docker 密钥
Docker 密钥使用docker screct
来管理,密钥在创建后以及传输中都是加密的,使用时被挂载到内存文件系统,一旦容器(服务任务)完成,内存文件系统关闭,密钥也随之删除。
感谢阅读,有兴趣的小伙伴可以关注我的微信公众号DevOps探索之旅
,大家一起学习进步