使用公钥基础设施 (PKI) 管理集群安全
Docker 内置的 Swarm 模式公钥基础设施 (PKI) 系统使安全部署容器编排系统变得简单。 Swarm 中的节点使用相互传输层安全 (TLS) 来验证、授权和加密与 Swarm 中其他节点的通信。
当您通过运行创建集群时docker swarm init
,Docker 将自己指定为管理节点。默认情况下,管理节点会生成一个新的根证书颁发机构 (CA) 以及密钥对,用于保护与加入集群的其他节点的通信。如果您愿意,可以使用docker swarm init命令--external-ca
的标志
指定您自己的外部生成的根 CA。
当您将其他节点加入 swarm 时,管理器节点还会生成两个令牌以供使用:一个工作器令牌和一个管理器令牌。每个令牌都包含根 CA 证书的摘要和随机生成的秘密。当节点加入群时,加入节点使用摘要来验证来自远程管理器的根 CA 证书。远程管理器使用该秘密来确保加入节点是经过批准的节点。
每次有新节点加入集群时,管理器都会向该节点颁发证书。证书包含随机生成的节点ID,用于标识证书通用名(CN)下的节点和组织单元(OU)下的角色。节点 ID 在当前集群中节点的生命周期内充当加密安全节点身份。
下图说明了管理器节点和工作器节点如何使用最低 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...
默认情况下,群中的每个节点每三个月更新一次其证书。您可以通过运行命令配置此时间间隔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 证书。此过程可能需要几分钟,具体取决于群中的节点数量。
当集群中的每个节点都拥有由新 CA 签名的新 TLS 证书后,Docker 会忘记旧的 CA 证书和密钥材料,并告诉所有节点仅信任新的 CA 证书。
这也会导致群的加入令牌发生变化。之前的加入令牌不再有效。
从此时起,颁发的所有新节点证书均由新的根 CA 签名,并且不包含任何中间证书。