本文为 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_name | GCP 中持有根 CA 证书的项目(Project) |
| region_name | GCP 中区域(region)的名称 |
| ca_pool | 持有根 CA 证书的 CA 池(CA Pool)的名称 |
| label_key | 标签(label)键值对,用于过滤并选择相关证书 |
| label_value | 标签(label)键值对,用于过滤并选择相关证书 |
配置示例
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)凭据:
- 如果设置了环境变量 GOOGLE_APPLICATION_CREDENTIALS,ADC 使用该变量所指向的服务账号文件。
- 如果未设置环境变量 GOOGLE_APPLICATION_CREDENTIALS,ADC 使用附加在运行你代码的资源上的服务账号。
- 如果未设置环境变量 GOOGLE_APPLICATION_CREDENTIALS,且运行你代码的资源上也没有附加服务账号,ADC 使用 Compute Engine、Google Kubernetes Engine、App Engine、Cloud Run 和 Cloud Functions 所提供的默认服务账号。
- 如果 ADC 无法使用上述任何凭据,则会发生错误。