通过 mTLS 向其他工作负载验证工作负载的身份


本文档介绍如何为 Compute Engine 设置托管式工作负载身份的自动预配和生命周期管理。您可以将 CA 池配置为使用 Certificate Authority Service (CA) 颁发证书,后者是一项可用性高、可扩缩的 Google Cloud 服务,可简化和自动执行 CA 服务的部署、管理和安全维护。每个虚拟机均使用已配置的 CA 池中的 X.509 凭据进行预配。这些凭据随后可用于建立 mTLS 连接。

借助适用于 Compute Engine 的托管式工作负载身份,您可以在任意两个 Compute Engine 虚拟机之间实现经过了双向身份验证的加密通信。在配置的虚拟机上运行的工作负载应用可以为每个虚拟机的 mTLS 使用 X.509 凭据。Certificate Authority Service 会自动为您轮替和管理这些 mTLS 证书。

准备工作

  • 请求访问托管式工作负载身份预览版

  • 配置 Google Cloud CLI。

    Install the Google Cloud CLI, then initialize it by running the following command:

    gcloud init
  • 配置 Google Cloud CLI,以使用列入许可名单的项目进行结算和配额计算。

      gcloud config set billing/quota_project PROJECT_ID

    PROJECT_ID 替换为已添加到托管式工作负载身份预览版许可名单的项目的 ID。

  • 查看托管式工作负载身份概览文档。
  • Enable the Compute Engine API:

    gcloud services enable compute.googleapis.com

所需的角色

如需获得所需权限来创建使用托管式工作负载身份证书向其他工作负载进行身份验证的虚拟机,请让管理员向您授予项目的以下 IAM 角色:

如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限

您也可以通过自定义角色或其他预定义角色来获取所需的权限。

概览

如需为您的应用使用托管式工作负载身份,您必须执行以下任务:

  1. 安全管理员

  2. 计算管理员

在 Identity and Access Management 中配置托管式工作负载身份

  • 按照配置托管式工作负载身份的身份验证中的说明操作。

    这些说明详细介绍了如何完成以下操作:

    • 创建工作负载身份池。
    • 在工作负载身份池中创建命名空间。您可以使用命名空间为托管式工作负载身份创建管理边界,例如,为组织拥有的每个应用创建一个命名空间。
    • 在工作负载身份池的命名空间中创建托管式工作负载身份。例如,您可以为应用创建一个命名空间,并在该命名空间内为支持该应用的微服务创建托管式身份。
    • 创建一个服务账号。根据关联到虚拟机的 Google Cloud 服务账号,授权 Compute Engine 虚拟机接收托管式工作负载身份。
    • 创建工作负载证明政策,以允许工作负载获得托管式工作负载身份的凭据。如需为托管式工作负载身份颁发凭据,工作负载必须位于指定项目中并关联服务账号。
    • 配置 Certificate Authority Service 以便为托管式工作负载身份颁发证书:
      • 配置根 CA 池
      • 配置从属 CA
      • 授权托管式工作负载身份从 CA 池请求证书

获取配置文件以上传合作伙伴元数据

您的安全管理员创建了一个包含以下内容的 JSON 文件:

此文件应命名为 CONFIGS.json。在为 MIG 创建实例模板或创建单个虚拟机时,您可以使用此文件。

CONFIGS.json 文件应类似如下:

  {
  "wc.compute.googleapis.com": {
     "entries": {
        "certificate-issuance-config": {
           "primary_certificate_authority_config": {
              "certificate_authority_config": {
                 "ca_pool": "projects/PROJECT_ID/locations/SUBORDINATE_CA_POOL_REGION/caPools/SUBORDINATE_CA_POOL_ID"
              }
           },
           "key_algorithm": "rsa-2048"
        },
        "trust-config": {
           "POOL_ID.global.PROJECT_NUMBER.workload.id.goog": {
               "trust_anchors": [{
                  "ca_pool": "projects/PROJECT_ID/locations/SUBORDINATE_CA_POOL_REGION/caPools/SUBORDINATE_CA_POOL_ID"
                }]
           }
     }
  }
  },
  "iam.googleapis.com": {
     "entries": {
        "workload-identity": "spiffe://POOL_ID.global.PROJECT_NUMBER.workload.id.goog/ns/NAMESPACE_ID/sa/MANAGED_IDENTITY_ID"
     }
  }
  }
  

为托管式实例组 (MIG) 启用托管式工作负载身份

托管式实例组 (MIG) 是被视为单个实体的一组虚拟机实例。MIG 中的每个虚拟机都是使用实例模板创建的。如需使 MIG 中的虚拟机能够使用托管式工作负载身份,请在实例模板中指定配置。

创建实例模板

创建启用了托管式工作负载身份功能的实例模板。然后,使用此模板创建托管式实例组 (MIG)。

gcloud

使用 gcloud beta compute instance-templates create 命令新建启用托管式工作负载身份的实例模板。

gcloud beta compute instance-templates create INSTANCE_TEMPLATE_NAME \
    --service-account SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com \
    --metadata enable-workload-certificate=true \
    --partner-metadata-from-file CONFIGS.json

您可以在创建实例模板时添加其他标志,以自定义其创建的虚拟机,例如指定机器类型和映像,而不是使用默认值。

替换以下内容:

  • INSTANCE_TEMPLATE_NAME:新模板的名称。
  • SERVICE_ACCOUNT_NAME:允许接收托管式身份的服务账号的名称。
  • PROJECT_ID:在其中创建服务账号的项目的 ID。
  • CONFIGS.json:包含证书颁发配置、信任配置和托管式工作负载身份的配置文件。

如需了解详情,请参阅创建实例模板

通过模板创建托管式实例组

创建一个托管式实例组,它使用启用了托管式工作负载身份的实例模板。如需详细了解如何创建实例模板,请参阅创建实例模板

gcloud

使用实例模板和 gcloud compute instance-groups managed create 命令创建 MIG。

gcloud compute instance-groups managed create INSTANCE_GROUP_NAME \
    --size=SIZE \
    --template=INSTANCE_TEMPLATE_NAME \
    --zone=ZONE

替换以下内容:

  • INSTANCE_GROUP_NAME:托管式实例组的唯一 ID。如需详细了解有效名称,请参阅为资源命名
  • SIZE:托管式实例组的大小
  • INSTANCE_TEMPLATE_NAME:在 MIG 中创建虚拟机时使用的实例模板的名称。
  • ZONE:要在其中创建虚拟机的可用区。

如需详细了解如何创建 MIG,请参阅创建托管式实例组 (MIG) 的基本场景

为单个虚拟机启用托管式工作负载身份

您可以在创建虚拟机时或通过更新现有虚拟机的合作伙伴元数据来为虚拟机启用托管式工作负载身份。

创建启用了托管式工作负载身份的虚拟机

创建虚拟机时,如需为虚拟机启用托管式工作负载身份功能,您必须执行以下操作:

  • 指定供虚拟机使用的服务账号
  • enable-workload-certificate 元数据属性设置为 true
  • 将证书颁发配置和信任配置信息指定为合作伙伴元数据

gcloud

使用 gcloud beta compute instances create 命令创建新的虚拟机。使用由安全管理员提供的 CONFIGS.json 文件,或按照创建配置文件以上传合作伙伴元数据中的说明创建的文件。

  1. 创建启用了托管式工作负载身份功能的虚拟机。

    gcloud beta compute instances create INSTANCE_NAME \
       --zone=INSTANCE_ZONE \
       --service-account SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com \
       --metadata enable-workload-certificate=true \
       --partner-metadata-from-file CONFIGS.json
    

    您可以在命令中添加其他行以配置虚拟机,例如机器类型和映像,而不是使用默认值。如需了解详情,请参阅创建并启动虚拟机实例

    替换以下内容:

    • INSTANCE_NAME:虚拟机的唯一名称。如需详细了解有效的实例名称,请参阅为资源命名
    • INSTANCE_ZONE:要在其中创建虚拟机的可用区。
    • SERVICE_ACCOUNT_NAME:允许接收托管式身份的服务账号的名称。
    • PROJECT_ID:在其中创建服务账号的项目的 ID。
    • CONFIGS.json:包含证书颁发配置、信任配置和托管式工作负载身份配置的配置文件的名称。

在现有虚拟机上启用托管式工作负载身份

如需为现有虚拟机启用托管式工作负载标识,请更新虚拟机以进行以下配置:

  • 如果虚拟机没有关联的服务账号,请创建服务账号并将其关联到虚拟机。
  • enable-workload-certificate 元数据属性设置为 true
  • 将证书颁发配置和信任配置信息指定为合作伙伴元数据
  • 重启虚拟机。

gcloud

此任务使用由安全管理员提供的 CONFIGS.json 文件,或按照创建配置文件以上传合作伙伴元数据中的说明创建的文件。

  1. 如果虚拟机没有关联的服务账号,请将服务账号关联到虚拟机

  2. 更新现有虚拟机的元数据以启用托管式工作负载身份。

    gcloud beta compute instances add-metadata VM_NAME \
       --zone=ZONE \
       --metadata enable-workload-certificate=true
    

    替换以下内容:

    • VM_NAME:虚拟机的名称
    • ZONE:该虚拟机所在的可用区
  3. 更新现有虚拟机的配置以添加配置文件。

    gcloud beta compute instances update VM_NAME \
       --zone=ZONE \
       --partner-metadata-from-file CONFIGS.json
    

    替换以下内容:

    • VM_NAME:虚拟机的名称
    • ZONE:该虚拟机所在的可用区
    • CONFIGS.json:包含证书颁发配置、信任配置和托管式工作负载身份的配置文件。
  4. 停止虚拟机。

    gcloud beta compute instances stop VM_NAME \
       --zone=ZONE
    

    替换以下内容:

    • VM_NAME:虚拟机的名称
    • ZONE:该虚拟机所在的可用区。
  5. 启动虚拟机。

    gcloud beta compute instances start VM_NAME \
       --zone=ZONE
    

    替换以下内容:

    • VM_NAME:虚拟机的名称
    • ZONE:该虚拟机所在的可用区。

访问 Linux 虚拟机上的工作负载凭据

使用 mTLS 成功配置工作负载到工作负载身份验证后,您可以访问虚拟机上颁发的凭据。

您可以通过以下两种方法访问 Compute Engine 托管式工作负载身份凭据和关联的信任软件包:

  • 虚拟机上的文件系统
  • Compute Engine 元数据服务器

使用虚拟机上的文件系统访问工作负载凭据和信任软件包

此方法会将 X.509 凭据和信任软件包放在虚拟机文件系统内的特定路径下。应用可以直接从文件系统读取凭据和信任软件包。如需查看有关如何检索凭据的示例,请参阅 GitHub 上的以下示例:

虚拟机必须运行 Compute Engine 客机代理 20231103.01 或更高版本。使用以下命令检查虚拟机上 Compute Engine 客机代理的版本:

gcloud beta compute instances get-serial-port-output INSTANCE_NAME \
   --zone=ZONE | grep "GCE Agent Started"

如果客机代理的版本低于 20231103.01,您可以按照更新客机环境中的说明对其进行更新。

如需使工作负载凭据和信任软件包在虚拟机的文件系统中可用,请完成以下步骤:

  1. 安装 Compute Engine 客机代理或将其更新到 20231103.01 或更高版本。客机代理会执行以下操作:

    • 自动从 Compute Engine 元数据服务器检索凭据和信任软件包。
    • 确保在更新 X.509 证书和相应私钥时,以原子方式写入文件系统。
    • 自动刷新凭据和信任软件包,例如在 mTLS 证书轮替时自动刷新。
  2. 在客机操作系统上安装或更新 Compute Engine 客机代理后,工作负载刷新作业会创建目录 /var/run/secrets/workload-spiffe-credentials 并将目录权限设置为 0755 (rwxr-xr-x)

    该目录包含以下使用 0644 (rw-r--r--) 权限创建的文件:

    • private_key.pem:PEM 格式的私钥
    • certificates.pem:一组 PEM 格式的 X.509 证书,可作为客户端证书链提供给其他虚拟机,也可以作为服务器证书链。
    • ca_certificates.pem:一组 PEM 格式的 X.509 证书,在验证对等方证书时用作信任锚。

      spiffe://POOL_ID.global.PROJECT_NUMBER.workload.id.goog
      
    • config_status:包含错误消息的日志文件。

  3. 应用可以直接从文件系统读取证书、私钥和信任软件包,以建立 mTLS 连接。

使用元数据服务器访问工作负载凭据和信任软件包

在 Compute Engine 虚拟机上运行的应用可以直接查询元数据服务器端点并检索凭据和信任软件包。应用负责定期检查元数据服务器端点的新凭据以及信任软件包更新。

Compute Engine 元数据服务器公开了三个 HTTP 端点,让虚拟机内运行的应用能够使用托管式工作负载身份功能。

  • gce-workload-certificates/config-status:此端点包含通过虚拟机元数据提供的配置值中的任何错误。
  • gce-workload-certificates/workload-identities:由 Compute Engine 控制平面管理的身份的端点。此端点包含虚拟机信任网域的 X.509 证书和私钥。
  • gce-workload-certificates/trust-anchors:此端点包含一组用于对等 X.509 证书链验证的受信任证书。

如需详细了解如何查询虚拟机实例的元数据,请参阅虚拟机元数据简介

如需使用元数据服务器访问工作负载凭据和信任软件包,您的应用应执行以下操作:

  1. 查询 gce-workload-certificates/config-status 端点。确保 HTTP 响应代码为 200,并且响应不包含任何 partnerMetadataConfigsErrors 错误。如果存在此类错误,请按照更新证书颁发和信任配置中所述的步骤,使用有效值更新相应的配置。

    如需检查该值,您可以在虚拟机上运行以下命令:

    curl "http://metadata.google.internal/computeMetadata/v1/instance/gce-workload-certificates/config-status" -H "Metadata-Flavor: Google"
    

    config-status 端点会返回具有以下结构的 JSON 响应:

    {
        "partnerMetadataConfigsErrors": {
            "errors": {  // A map of errors keyed by attribute name.
                "ATTRIBUTE_NAME" : "ERROR_DETAILS",
                ...
            }
        }
    }
    
  2. 查询 gce-workload-certificates/workload-identities 端点。确保 HTTP 响应代码为 200。该端点会返回具有以下结构的 JSON 响应:

    {
     "workloadCredentials": {  // Credentials for the VM's trust domains
       "spiffe://POOL_ID.global.PROJECT_NUMBER.workload.id.goog/ns/NAMESPACE_ID/sa/MANAGED_IDENTITY_ID": {
          "certificatePem" : "X.509 certificate or certificate chain",
          "privateKeyPem" : "Private for X.509 leaf certificate"
       }
     }
    }
    

    提取 certificatePemprivateKeyPem。从同一响应中读取这两个值至关重要,可避免 Compute Engine 基础设施刷新托管式工作负载身份时私钥和公钥不匹配。

  3. 查询 gce-workload-certificates/trust-anchors 端点。确保 HTTP 响应代码为 200。响应将仅包含 SPIFFE 信任网域的信任锚(如果已指定)。否则,查询会返回错误。trust-anchors 端点会返回具有以下结构的 JSON 响应:

    {
        "trustAnchors": {  // Trust bundle for the VM's trust domains
            "POOL_ID.global.PROJECT_NUMBER.workload.id.goog": {
                "trustAnchorsPem" : "Trust bundle containing the X.509
                roots certificates"
            }
        }
    }
    

    trustAnchorsPem 的内容包含信任软件包,随后用于在建立 mTLS 连接时对对等 X.509 凭据进行身份验证。

刷新凭据和信任软件包

Compute Engine 控制平面会定期自动轮替托管式工作负载身份凭据和信任锚。

如果您的应用使用文件系统访问工作负载凭据和信任软件包,则 Compute Engine 客机代理会自动刷新凭据和信任软件包(例如,在轮替 mTLS 证书时)。

如果您的应用查询元数据服务器,则在虚拟机上运行的应用必须定期查询元数据服务器端点,以获取一组最新的托管式工作负载身份凭据和信任软件包。否则,应用可能会因证书过期或信任软件包更改而中断,因而导致 mTLS 连接建立失败。Google 建议应用每 5 分钟查询一次元数据服务器的托管式工作负载身份凭据和信任软件包。

更新证书颁发和信任配置

您可以修改使用托管式工作负载身份的虚拟机的证书颁发配置和信任配置。

更新托管式实例组的实例模板

如需更新实例模板中的证书颁发配置和信任配置值,您必须使用新值创建新模板。因此,不支持更新现有托管式实例组 (MIG) 的证书颁发配置和信任配置。

更新各个 Compute Engine 虚拟机

如需更新证书颁发配置和信任配置,请更新 CONFIGS.json 文件的内容并使用 gcloud beta compute instances update 命令应用更新:

gcloud beta compute instances update INSTANCE_NAME \
    --partner-metadata-from-file FILENAME.json

替换以下内容:

  • INSTANCE_NAME:要为其更新配置值的虚拟机的名称
  • FILENAME:修改后的配置文件的名称,例如 CONFIGS.json

问题排查

如需查找与检索工作负载凭据相关的常见错误的诊断和解决方法,请参阅排查与工作负载到工作负载身份验证相关的问题文档。

后续步骤