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

下方的示例展示了来自工作节点(worker node)的证书信息:
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...默认情况下,群集中的每个节点每三个月更新一次其证书。
您可以通过运行 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 标志来指定根证书或使用集群外部的根 CA。或者,您可以传递 --ca-cert 和 --ca-key 标志来指定您希望集群使用的确切证书和密钥。
当您发出 docker swarm ca --rotate 命令时,以下事情将按顺序发生:
Docker 会生成一个交叉签名的证书。这意味着新根 CA 证书的一个版本是使用旧根 CA 证书进行签名的。 这个交叉签名的证书被用作所有新节点证书的中间证书。这确保了仍然信任旧根 CA 的节点仍然可以验证由新 CA 签名的证书。
Docker 还会通知所有节点立即更新其 TLS 证书。 该过程可能需要几分钟,具体取决于集群中节点的数量。
当集群中的每个节点都拥有了由新CA签发的新TLS证书后, Docker将不再使用旧的CA证书和密钥材料,并指示 所有节点仅信任新的CA证书。
这也会导致 Swarm 的加入令牌发生变化。之前的 加入令牌将不再有效。
从这一点开始,所有新签发的节点证书均使用新的根CA进行签名,且不包含任何中间证书。\n