Skip to content

本文为 SPIRE 官方文档 plugin_server_upstreamauthority_gcp_cas 的中文译本,以英文原文为准。

🔗 穿越源码分析:Server 详解 · UpstreamAuthority · 上游 CA 与无缝轮换

服务端插件:UpstreamAuthority "gcp_cas"

gcp_cas 插件使用 Google Cloud Platform 提供的证书颁发机构(即 "Certificate Authority Service",CAS),为 SPIRE Server 生成中间签名证书(intermediate signing certificate)。

配置

插件有一个必填的 root_cert_spec 段。它用于指定使用哪些 CA 来签名中间 CA,以及哪些 CA 作为可信根包(trusted root bundle)的一部分。如果它匹配到多个 CA,则使用最早到期的那个 CA 进行签名。

"root_cert_spec" 需要以下属性:

配置项说明
project_nameGCP 中持有根 CA 证书的项目(Project)
region_nameGCP 中区域(region)的名称
ca_pool持有根 CA 证书的 CA 池(CA Pool)的名称
label_key标签(label)键值对,用于过滤并选择相关证书
label_value标签(label)键值对,用于过滤并选择相关证书

配置示例

yaml
UpstreamAuthority "gcp_cas" {
    plugin_data {
        root_cert_spec {
            project_name = "MyProject"
            region_name = "us-central1"
            ca_pool = "mypool"
            label_key = "myapp-identity-root"
            label_value = "true"
        }
    }
}

插件做了什么

插件会检索 GCP 中处于 ENABLED 状态、且匹配插件配置里所指定 root cert spec 参数的 CA。在这些匹配的证书中,选出到期时间最早的 CA,用它来创建并签名一个中间 CA。信任包(trust bundle)包含 GCP 中所有匹配 root_cert_spec 标签的 CA 的根 CA。

CA 轮换

  • 稳态(steady state):配置的标签匹配 CAS 中的 CA X 和 CA Y;插件一直在用 CA X 签名,所有 agent 都信任 CA X 和 CA Y。
  • 现在在 CAS 中创建一个带相同标签的 CA Z。
  • 在 CAS 中停用(disable)并可选地删除 CA X。
  • 插件将 Y 和 Z 的根证书作为 UpstreamX509Roots 返回。同时它用 Y 签名签发 CA,因为 Y 现在是最早到期的 CA。
  • 这不会影响现有工作负载,因为它们在 SPIRE 开始用 Y 签名之前就已经在信任 Y 了。

与 Google Cloud Platform 的认证

本插件通过应用默认凭据(Application Default Credentials,ADC)隐式地与 Google Cloud Platform 的 CAS 实现连接并认证。ADC 机制的文档见 https://cloud.google.com/docs/authentication/production#automatically

ADC 按以下顺序查找服务账号(service account)凭据:

  1. 如果设置了环境变量 GOOGLE_APPLICATION_CREDENTIALS,ADC 使用该变量所指向的服务账号文件。
  2. 如果未设置环境变量 GOOGLE_APPLICATION_CREDENTIALS,ADC 使用附加在运行你代码的资源上的服务账号。
  3. 如果未设置环境变量 GOOGLE_APPLICATION_CREDENTIALS,且运行你代码的资源上也没有附加服务账号,ADC 使用 Compute Engine、Google Kubernetes Engine、App Engine、Cloud Run 和 Cloud Functions 所提供的默认服务账号。
  4. 如果 ADC 无法使用上述任何凭据,则会发生错误。