为 Compute Engine 配置托管式工作负载身份的身份验证

本文档介绍了如何使用 gcloud CLI 为 Compute Engine 配置托管式工作负载身份。本页面还介绍了如何使用Certificate Authority Service为 Compute Engine 设置托管式工作负载身份的自动预配和生命周期管理,以便您在工作负载之间建立双向 TLS (mTLS) 连接。

准备工作

  1. 创建或选择 Google Cloud 项目。

    选择或创建项目所需的角色

    • 选择项目:选择项目不需要特定的 IAM 角色,您可以选择已获授角色的任何项目。
    • 创建项目:如需创建项目,您需要拥有 Project Creator 角色 (roles/resourcemanager.projectCreator),该角色包含 resourcemanager.projects.create 权限。了解如何授予角色。
    • 创建 Google Cloud 项目:

      gcloud projects create PROJECT_ID

      将 PROJECT_ID 替换为您要创建的 Google Cloud 项目的名称。

    • 选择您创建的 Google Cloud 项目:

      gcloud config set project PROJECT_ID

      将 PROJECT_ID 替换为您的 Google Cloud 项目名称。

  2. 了解托管式工作负载身份。

  3. 了解如何使用 Certificate Authority Service 颁发证书。

  4. 了解如何使用托管式工作负载身份对 Compute Engine 工作负载进行身份验证。

  5. 启用 IAM 和 Certificate Authority Service API(如果尚未启用):

    启用 API 所需的角色

    如需启用 API,您需要拥有 serviceusage.services.enable 权限。如果您创建了项目,则可能已经通过 Owner 角色 (roles/owner) 获得了此权限。否则,您可以通过 Service Usage Admin 角色 (roles/serviceusage.serviceUsageAdmin) 获得此权限。了解如何授予角色。

    gcloud services enable iam.googleapis.com privateca.googleapis.com

  6. 配置 Google Cloud CLI 以使用项目进行结算和配额计算。

    gcloud config set billing/quota_project PROJECT_ID
    

    将 PROJECT_ID 替换为相应项目的 ID。

所需的角色

如需获得创建托管式工作负载身份和预配托管式工作负载身份证书所需的权限,请让您的管理员为您授予项目的以下 IAM 角色:

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

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

此外,IAM Owner (roles/owner) 基本角色还具有配置托管式工作负载身份的权限。 您不应在生产环境中授予基本角色,但可以在开发或测试环境中授予这些角色。

概览

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

  1. 安全管理员:

  2. 计算管理员:

    为 Compute Engine 中运行的工作负载启用托管式工作负载身份:

创建工作负载身份池

  1. 如需配置托管式工作负载身份,您必须在 TRUST_DOMAIN 模式下创建池。

    gcloud iam workload-identity-pools create POOL_ID \
      --location="global" \
      --mode="TRUST_DOMAIN"
    

    将 POOL_ID 替换为池的唯一 ID。ID 必须介于 4 到 32 个字符之间,只能包含小写字母数字字符和短划线,并以字母数字字符开头和结尾。创建工作负载身份池后,无法再更改其 ID。

  2. 如需验证您的工作负载身份池是否是在 TRUST_DOMAIN 模式下创建的,请运行 workload-identity-pools describe 命令。

    gcloud iam workload-identity-pools describe POOL_ID \
      --location="global"
    

    输出类似于以下内容:

    mode: TRUST_DOMAIN
    name: projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID
    state: ACTIVE
    

    如果命令输出中不存在 mode: TRUST_DOMAIN,请验证您是否已正确配置 gcloud CLI 以将正确的项目用于结算和配额。确保您已更新到最新版本的 gcloud CLI。

选择 CA 选项

如需为工作负载证书签名,请选择最适合您使用情形的证书授权机构 (CA) 选项:

  • 由 Google 管理的默认 CA:如需一种免费的全代管式解决方案,请使用此选项。默认 CA 可为所有Google Cloud 用户提供一个共享的信任根。

  • 自定义 CA:使用此选项,即可通过 Certificate Authority Service 配置您自己的公钥基础架构 (PKI)。如果您需要自定义信任根,或者必须将签名密钥存储在硬件安全模块 (HSM) 中以满足合规性要求,则此选项非常适合。 Certificate Authority Service 的费用与托管式工作负载身份的费用分开收取。 如需了解详情,请参阅 CA 服务价格。

配置 CA

默认 CA

如需将默认 CA 绑定到工作负载身份池,请使用 use-default-shared-ca 标志更新工作负载身份池。

gcloud iam workload-identity-pools update TRUST_DOMAIN_NAME \
    --location="global" \
    --use-default-shared-ca \
    --project=PROJECT_ID

替换以下内容:

  • TRUST_DOMAIN_NAME:信任网域的名称。
  • PROJECT_ID:项目 ID。

自定义 CA

如需使用自定义 CA 配置托管式工作负载身份,请完成以下步骤:

  1. 配置 CA Service,以便为托管式工作负载身份颁发证书。
  2. 将 CA 绑定到工作负载身份池。
  3. 授权托管式工作负载身份从 CA 池请求证书。

配置 CA Service,以便为托管式工作负载身份颁发证书

使用 Certificate Authority Service 池为根证书授权机构和从属证书授权机构 (CA) 创建建议配置。 从属 CA 池向虚拟机颁发 X.509 工作负载身份证书。

配置为使用托管式工作负载身份为 Compute Engine 虚拟机颁发证书的 CA 池必须与虚拟机位于同一区域。如果您想设计多区域架构以灵活应对区域级服务中断,我们建议您为工作负载的每个区域都配置一个从属 Certificate Authority Service CA 池。这样一来,每个 Compute Engine 虚拟机都可以引用区域内的从属 Certificate Authority Service CA 池。

配置 CA 池后,您可以授权托管式工作负载身份从 CA 池请求和接收签名证书。

配置根 CA 池

使用 Certificate Authority Service 的 Google Cloud CLI 接口配置根 CA 池。

CA 池创建后无法移动或导出。

  1. 通过运行 gcloud privateca pools create 命令在 Enterprise 层级中创建根 CA 池。企业层级用于颁发长期、少量的证书。

    gcloud privateca pools create ROOT_CA_POOL_ID \
       --location=REGION \
       --tier=enterprise
    

    替换以下内容:

    • ROOT_CA_POOL_ID:根 CA 池的唯一 ID。ID 不得超过 64 个字符,并且只能包含小写和大写字母数字字符、下划线或连字符。池 ID 在区域内必须是唯一的。
    • REGION:根 CA 池所在的区域。

    如需了解详情,请参阅创建 CA 池。

  2. 通过运行 gcloud privateca roots create 命令在根 CA 池中创建根 CA。如果这是根 CA 池中的唯一 CA,系统可能会提示您启用根 CA。

    例如,您可以使用类似如下的命令来创建根 CA。

    gcloud privateca roots create ROOT_CA_ID \
       --pool=ROOT_CA_POOL_ID \
       --subject "CN=ROOT_CA_CN, O=ROOT_CA_ORGANIZATION" \
       --key-algorithm="ec-p256-sha256" \
       --max-chain-length=1 \
       --location=REGION
    

    替换以下内容:

    • ROOT_CA_ID:根 CA 的唯一名称。CA 名称不得超过 64 个字符,并且只能包含小写和大写字母数字字符、下划线或连字符。CA 名称在区域内必须是唯一的。
    • ROOT_CA_POOL_ID:根 CA 池的 ID。
    • ROOT_CA_CN:根 CA 的通用名称。
    • ROOT_CA_ORGANIZATION:根 CA 的组织。
    • REGION:根 CA 池所在的区域。

    如需了解详情,请参阅创建根证书授权机构。如需详细了解 CA 的 subject 字段,请参阅主体。

  3. 可选:重复上述步骤,在根 CA 池中创建其他根 CA。这对根 CA 变换非常有用。

配置从属 CA

使用 Certificate Authority Service 的 Google Cloud CLI 界面创建从属 CA 池和从属 CA。

如果您有多个证书颁发场景,可以为每种场景创建一个从属 CA。此外,在 CA 池中添加多个从属 CA 有助于您更好地对证书请求进行负载均衡。

使用 gcloud privateca pools create 命令创建从属 CA 池。

  1. 在 DevOps 层级创建从属 CA 池。此层级用于颁发大量、短期的证书。

    gcloud privateca pools create SUBORDINATE_CA_POOL_ID \
      --location=REGION \
      --tier=devops
    

    替换以下内容:

    • SUBORDINATE_CA_POOL_ID:从属 CA 池的唯一 ID。ID 不得超过 64 个字符,并且只能包含小写和大写字母数字字符、下划线或连字符。池 ID 在区域内必须是唯一的。
    • REGION:要在其中创建从属 CA 池的区域。

    如需了解详情,请参阅创建 CA 池。

  2. 运行 gcloud privateca subordinates create 命令,在从属 CA 池中创建从属 CA。 请勿更改默认的基于配置的颁发模式。

    例如,您可以使用类似如下的命令来创建从属 CA。

    gcloud privateca subordinates create SUBORDINATE_CA_ID \
      --pool=SUBORDINATE_CA_POOL_ID \
      --location=REGION \
      --issuer-pool=ROOT_CA_POOL_ID \
      --issuer-location=REGION \
      --subject="CN=SUBORDINATE_CA_CN, O=SUBORDINATE_CA_ORGANIZATION" \
      --key-algorithm="ec-p256-sha256" \
      --use-preset-profile=subordinate_mtls_pathlen_0
    

    替换以下内容:

    • SUBORDINATE_CA_ID:从属 CA 的唯一名称。 名称不得超过 64 个字符,并且只能包含小写和大写字母数字字符、下划线或连字符。CA 名称在区域内必须是唯一的。
    • SUBORDINATE_CA_POOL_ID:从属 CA 池的名称。
    • REGION:从属 CA 池所在的区域。
    • ROOT_CA_POOL_ID:根 CA 池的 ID。
    • REGION:根 CA 池的区域。
    • SUBORDINATE_CA_CN:从属 CA 的通用名称。
    • SUBORDINATE_CA_ORGANIZATION:从属 CA 颁发组织的名称。

    如需了解详情,请参阅创建 CA 池。 如需详细了解 CA 的 subject 字段,请参阅主体。

将 CA 绑定到工作负载身份池

创建 CA 层次结构后,您需要使用每个 CA 的证书颁发配置来更新工作负载身份池,从而将 CA 绑定到工作负载身份池。

  1. 创建一个包含以下内容的 issuance-config.yaml 文件:

    inlineCertificateIssuanceConfig:
    caPools:
    REGION: projects/PROJECT_ID/locations/REGION/caPools/SUBORDINATE_CA_POOL_ID
    keyAlgorithm: RSA_2048
    lifetime: 86400s
    rotationWindowPercentage: 50

    将文件中的以下内容替换为:

    • REGION:从属 CA 池所在的区域。
    • PROJECT_ID:包含从属 CA 池的项目的 ID。
    • SUBORDINATE_CA_POOL_ID:从属 CA 池的 ID。
  2. 运行以下命令以更新工作负载身份池:

    gcloud iam workload-identity-pools update POOL_ID \
       --location="global" \
       --inline-certificate-issuance-config-file=ISSUANCE_CONFIG_FILE
    

    替换以下内容:

    • POOL_ID:池的唯一 ID。
    • ISSUANCE_CONFIG_FILE:issuance-config.yaml 文件的路径。

授权托管式工作负载身份从 CA 池请求证书

托管式工作负载身份需要具有向 CA Service 请求证书并获取公共证书的权限。

  1. 将每个从属 CA 池上的 CA Service Workload Certificate Requester (roles/privateca.workloadCertificateRequester) IAM 角色授予托管式工作负载身份。以下 gcloud privateca pools add-iam-policy-binding 命令会授权托管式工作负载身份从 CA Service 证书链请求证书。

    gcloud privateca pools add-iam-policy-binding SUBORDINATE_CA_POOL_ID \
      --location=REGION \
      --role=roles/privateca.workloadCertificateRequester \
      --member="principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/name/locations/global/workloadIdentityPools/POOL_ID/*"
    

    替换以下内容:

    • SUBORDINATE_CA_POOL_ID:从属 CA 池的 ID。
    • REGION:从属 CA 池的区域。
    • PROJECT_NUMBER:包含工作负载身份池的项目的编号
    • POOL_ID:工作负载身份池的 ID
  2. 将从属 CA 池的 CA Service Pool Reader (roles/privateca.poolReader) IAM 角色授予托管式工作负载身份。这将授权托管式工作负载身份从 CA 的证书链获取已签名的 X.509 证书。

    gcloud privateca pools add-iam-policy-binding SUBORDINATE_CA_POOL_ID \
      --location=REGION \
      --role=roles/privateca.poolReader \
      --member="principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/name/locations/global/workloadIdentityPools/POOL_ID/*"
    

    替换以下内容:

    • SUBORDINATE_CA_POOL_ID:从属 CA 池的 ID。
    • REGION:从属 CA 池的区域。
    • PROJECT_NUMBER:包含工作负载身份池的项目的编号
    • POOL_ID:工作负载身份池的 ID

创建托管式工作负载身份

借助托管式工作负载身份, Google Cloud 会自动将工作负载身份池身份的凭据预配到您的工作负载。工作负载身份在工作负载身份池中定义,并整理到称为“命名空间”的管理边界中。

创建命名空间

借助 workload-identity-pools namespaces create 命令,您可以在工作负载身份池中创建命名空间。

gcloud iam workload-identity-pools namespaces create NAMESPACE_ID \
    --workload-identity-pool="POOL_ID" \
    --location="global"

替换以下内容:

  • NAMESPACE_ID:命名空间的唯一 ID。ID 必须介于 2 到 63 个字符之间,只能包含小写字母数字字符和短划线,并以字母数字字符开头和结尾。 创建命名空间后,无法更改其 ID。
  • POOL_ID:您之前创建的工作负载身份池 ID。

创建托管式工作负载身份

借助 workload-identity-pools managed-identities create 命令,您可以在工作负载身份池命名空间中创建托管式工作负载身份。

gcloud iam workload-identity-pools managed-identities create MANAGED_IDENTITY_ID \
    --namespace="NAMESPACE_ID" \
    --workload-identity-pool="POOL_ID" \
    --location="global"

替换以下内容:

  • MANAGED_IDENTITY_ID:托管式身份的唯一 ID。ID 必须介于 2 到 63 个字符之间,只能包含小写字母数字字符和短划线,并以字母数字字符开头和结尾。创建托管式工作负载身份后,无法再更改其 ID。
  • NAMESPACE_ID:您之前创建的命名空间 ID。
  • POOL_ID:您之前创建的工作负载身份池 ID。

托管式工作负载身份 ID 是 SPIFFE 标识符,其格式如下:

spiffe://POOL_ID.global.PROJECT_NUMBER.workload.id.goog/ns/NAMESPACE_ID/sa/MANAGED_IDENTITY_ID

定义工作负载证明政策

本部分介绍了如何设置证明政策。此政策决定了 Google Cloud IAM 用于验证工作负载身份的属性。验证后,调用工作负载可以接收凭据。

验证基于工作负载的以下属性之一:

  • 关联的服务账号电子邮件地址
  • 关联的服务账号 UID
  • 虚拟机实例名称
  • 虚拟机实例 ID

使用证明规则来定义工作负载证明政策

如需创建允许工作负载使用托管式身份的证明政策,请执行以下操作:

  1. 决定是否要创建证明政策,以允许您的工作负载使用其附加服务账号、使用其实例名称或使用其实例 ID 来证明受管身份。

  2. 创建 JSON 格式的证明政策文件。

    1. 可选:如需在 Compute Engine 实例上接收 X.509 凭据,您必须启用关联的服务账号。我们建议您先使用以下命令创建新的服务账号,然后将其附加到工作负载:

      gcloud iam service-accounts create SERVICE_ACCOUNT_NAME
      

      将 SERVICE_ACCOUNT_NAME 替换为服务账号的名称

    2. 创建 JSON 格式的证明政策文件,以便根据服务账号电子邮件地址、服务账号 UID、实例名称或实例 ID 进行证明。

      服务账号电子邮件地址

      如需创建基于服务账号电子邮件地址的证明政策文件,请创建一个包含以下内容的文件:

      {
         "attestationRules": [
            {
               "googleCloudResource": "//compute.googleapis.com/projects/WORKLOAD_PROJECT_NUMBER/type/Instance/attached_service_account.email/SERVICE_ACCOUNT_EMAIL"
            }
         ],
      }
      

      替换以下内容:

      • WORKLOAD_PROJECT_NUMBER:包含虚拟机实例或服务账号的项目的编号

        如需获取包含您刚刚创建的受管身份或服务账号的项目的项目编号,请运行以下命令:

        gcloud projects describe $(gcloud config get-value project) \
          --format="value(projectNumber)"
        
      • SERVICE_ACCOUNT_EMAIL:关联到虚拟机的服务账号的电子邮件地址

      服务账号 UID

      如需创建基于服务账号 UID 的证明政策文件,请创建一个包含以下内容的文件:

      {
         "attestationRules": [
            {
               "googleCloudResource": "//compute.googleapis.com/projects/WORKLOAD_PROJECT_NUMBER/type/Instance/attached_service_account.uid/SERVICE_ACCOUNT_UID"
            }
         ],
      }
      

      替换以下内容:

      • WORKLOAD_PROJECT_NUMBER:包含虚拟机实例或服务账号的项目的编号

        如需获取包含您刚刚创建的受管身份或服务账号的项目的项目编号,请运行以下命令:

        gcloud projects describe $(gcloud config get-value project) \
          --format="value(projectNumber)"
        
      • SERVICE_ACCOUNT_UID:关联到虚拟机的服务账号的 UID

      如需获取服务账号的唯一 ID,请运行以下命令:

         gcloud iam service-accounts describe SERVICE_ACCOUNT_EMAIL\
            --format="value(uniqueId)"
      

      实例名称

      如需创建基于实例名称的证明政策文件,请创建一个包含以下内容的文件:

      {
         "attestationRules": [
            {
               "googleCloudResource": "//compute.googleapis.com/projects/WORKLOAD_PROJECT_NUMBER/name/zones/ZONE/instances/INSTANCE_NAME"
            }
         ],
      }
      

      替换以下内容:

      • WORKLOAD_PROJECT_NUMBER:包含虚拟机实例或服务账号的项目的编号

        如需获取包含您刚刚创建的受管身份或服务账号的项目的项目编号,请运行以下命令:

        gcloud projects describe $(gcloud config get-value project) \
          --format="value(projectNumber)"
        
      • ZONE:Compute Engine 虚拟机可用区

      • INSTANCE_NAME:新的或现有 Compute Engine 虚拟机实例的名称

      实例 ID

      如需创建基于实例 ID 的证明政策文件,请创建一个包含以下内容的文件:

      {
         "attestationRules": [
            {
               "googleCloudResource": "//compute.googleapis.com/projects/WORKLOAD_PROJECT_NUMBER/uid/zones/ZONE/instances/INSTANCE_ID"
            }
         ],
      }
      

      替换以下内容:

      • WORKLOAD_PROJECT_NUMBER:包含虚拟机实例或服务账号的项目的编号

        如需获取包含您刚刚创建的受管身份或服务账号的项目的项目编号,请运行以下命令:

        gcloud projects describe $(gcloud config get-value project) \
          --format="value(projectNumber)"
        
      • INSTANCE_ID:Compute Engine 虚拟机实例 ID

        实例 ID 的值必须来自现有的 Compute Engine 实例。如需获取实例 ID,请运行以下命令:

        gcloud compute instances describe INSTANCE_NAME --zone=ZONE --format="get(id)"
        
      • INSTANCE_NAME:Compute Engine 虚拟机实例名称

      • ZONE:Compute Engine 虚拟机可用区

  3. 使用您在本文档中前面部分创建的政策 JSON 文件创建证明政策:

    gcloud iam workload-identity-pools managed-identities set-attestation-rules MANAGED_IDENTITY_ID \
       --namespace=NAMESPACE_ID \
       --workload-identity-pool=POOL_ID \
       --policy-file=PATH_TO_POLICY_JSON_FILE \
       --location=global
    

    替换以下内容:

    • MANAGED_IDENTITY_ID:托管式身份的唯一 ID。ID 必须介于 2 到 63 个字符之间,只能包含小写字母数字字符和短划线,并以字母数字字符开头和结尾。创建托管式工作负载身份后,无法再更改其 ID。
    • NAMESPACE_ID:您之前创建的命名空间 ID。
    • POOL_ID:您之前创建的工作负载身份池 ID。
    • PATH_TO_POLICY_JSON_FILE:指向您之前创建的代表证明政策的 JSON 文件的路径。

    您还可以通过单独添加或移除证明规则来更新政策。如需向您的证明政策添加证明,请运行以下命令:

    gcloud iam workload-identity-pools managed-identities add-attestation-rule MANAGED_IDENTITY_ID \
       --namespace=NAMESPACE_ID \
       --workload-identity-pool=POOL_ID \
       --google-cloud-resource='//compute.googleapis.com/projects/WORKLOAD_PROJECT_NUMBER/type/Instance/attached_service_account.uid/SERVICE_ACCOUNT_UID' \
       --location=global
    
  4. 如需了解如何列出或移除证明规则,请运行以下命令:

    gcloud iam workload-identity-pools managed-identities list-attestation-rules --help
    gcloud iam workload-identity-pools managed-identities remove-attestation-rule --help
    

可选:在工作负载身份池之间启用信任联合

如需为不同信任网域中的工作负载启用相互身份验证,您可以配置信任联合。

  1. 创建一个包含以下内容的 trust-config.yaml 文件:

    inlineTrustConfig:
    additionalTrustBundles:
      POOL_ID.global.PROJECT_NUMBER.workload.id.goog:
         trustAnchors:
         - pemCertificate: "-----BEGIN CERTIFICATE-----\nPEM_ENCODED_CERTIFICATE\n-----END CERTIFICATE-----"

    将文件中的以下内容替换为:

    • POOL_ID:您要联合的工作负载身份池的 ID。
    • PROJECT_NUMBER:您要联合的工作负载身份池的项目编号。
    • PEM_ENCODED_CERTIFICATE:您要联合的工作负载身份池的 PEM 编码的根 CA 证书。
  2. 如需使用信任配置更新工作负载身份池,请运行以下命令:

    gcloud iam workload-identity-pools update POOL_ID \
      --location="global" \
      --inline-trust-config-file=TRUST_CONFIG_FILE
    

    替换以下内容:

    • POOL_ID:池的唯一 ID。
    • TRUST_CONFIG_FILE:trust-config.yaml 文件的路径。

后续步骤

亲自尝试

如果您是 Google Cloud新手,请创建一个账号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。

免费开始使用