使用公钥基础设施 (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 加密通信。

TLS diagram

以下示例显示了来自工作节点证书的信息。

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命令时,将按顺序发生以下情况:

  1. Docker 生成交叉签名的证书。这意味着新根 CA 证书的版本是用旧根 CA 证书签名的。此交叉签名的证书用作所有新节点证书的中间证书。这确保了仍然信任旧根 CA 的节点仍然可以验证由新 CA 签名的证书。

  2. Docker 还指示所有节点立即续期其 TLS 证书。此过程可能需要几分钟,具体取决于 Swarm 中的节点数量。

  3. Swarm 中的每个节点都具有由新 CA 签名的新的 TLS 证书后,Docker 会忘记旧的 CA 证书和密钥材料,并指示所有节点仅信任新的 CA 证书。

    这也导致 Swarm 的加入令牌发生更改。以前的加入令牌不再有效。

从那时起,颁发的所有新节点证书都将使用新的根 CA 签名,并且不包含任何中间证书。

了解更多

  • 阅读有关节点如何工作的文章。
  • 了解 Swarm 模式服务的工作原理。