使用公钥基础设施 (PKI) 管理 Swarm 安全性
Docker 内置的 Swarm 模式公钥基础设施 (PKI) 系统使得安全部署容器编排系统变得简单。Swarm 中的节点使用相互传输层安全协议 (TLS) 来对 Swarm 中与其他节点的通信进行身份验证、授权和加密。
当你运行 docker swarm init
命令创建 Swarm 时,Docker 会将自己指定为管理器节点。默认情况下,管理器节点会生成一个新的根证书颁发机构 (CA) 以及一对密钥,用于保护与加入 Swarm 的其他节点之间的通信。如果你愿意,可以使用 docker swarm init 命令的 --external-ca
标志指定自己的外部生成的根 CA。
管理器节点还会生成两个令牌,用于将其他节点加入 Swarm:一个工作节点令牌和一个管理器节点令牌。每个令牌都包含根 CA 证书的摘要和一个随机生成的密钥。当节点加入 Swarm 时,加入节点使用摘要来验证远程管理器提供的根 CA 证书。远程管理器使用密钥来确保加入节点是经过批准的节点。
每当有新节点加入 Swarm 时,管理器都会向该节点颁发一个证书。证书包含一个随机生成的节点 ID,用于在证书通用名称 (CN) 下标识该节点,并在组织单位 (OU) 下标识其角色。该节点 ID 在节点当前 Swarm 的生命周期内充当加密安全的节点身份。
下图说明了管理器节点和工作节点如何使用最低 TLS 1.2 版本加密通信。


下面的示例显示了工作节点证书中的信息
Certificate:
Data:
Version: 3 (0x2)
Serial Number:
3b:1c:06:91:73:fb:16:ff:69:c3:f7:a2:fe:96:c1:73:e2:80:97:3b
Signature Algorithm: ecdsa-with-SHA256
Issuer: CN=swarm-ca
Validity
Not Before: Aug 30 02:39:00 2016 GMT
Not After : Nov 28 03:39:00 2016 GMT
Subject: O=ec2adilxf4ngv7ev8fwsi61i7, OU=swarm-worker, CN=dw02poa4vqvzxi5c10gm4pq2g
...snip...
默认情况下,Swarm 中的每个节点每三个月更新一次证书。您可以通过运行 docker swarm update --cert-expiry <TIME PERIOD>
命令配置此间隔。最小轮换值为 1 小时。有关详细信息,请参阅 docker swarm update CLI 参考。
轮换 CA 证书
注意
Mirantis Kubernetes Engine (MKE),前身为 Docker UCP,为 Swarm 提供外部证书管理器服务。如果您在 MKE 上运行 Swarm,则不应手动轮换 CA 证书。如果需要轮换证书,请联系 Mirantis 支持。
如果集群 CA 密钥或管理器节点遭到泄露,您可以轮换 Swarm 根 CA,以便所有节点都不再信任由旧根 CA 签名的证书。
运行 docker swarm ca --rotate
命令生成新的 CA 证书和密钥。如果您愿意,可以传递 --ca-cert
和 --external-ca
标志来指定根证书并使用 Swarm 外部的根 CA。或者,您可以传递 --ca-cert
和 --ca-key
标志来指定您希望 Swarm 使用的确切证书和密钥。
当您执行 docker swarm ca --rotate
命令时,会按顺序发生以下事情
Docker 生成一个交叉签名证书。这意味着新根 CA 证书的一个版本是用旧根 CA 证书签名的。这个交叉签名证书用作所有新节点证书的中间证书。这确保了仍然信任旧根 CA 的节点仍然可以验证由新 CA 签名的证书。
Docker 还会通知所有节点立即更新其 TLS 证书。此过程可能需要几分钟,具体取决于 Swarm 中节点的数量。
Swarm 中的每个节点都拥有由新 CA 签名的新 TLS 证书后,Docker 会丢弃旧的 CA 证书和密钥材料,并通知所有节点仅信任新 CA 证书。
这也会导致 Swarm 的加入令牌发生变化。之前的加入令牌不再有效。
从此刻起,所有颁发的新节点证书都将由新的根 CA 签名,并且不包含任何中间证书。