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

本页面介绍了如何使用 gcloud CLI 配置托管式工作负载身份

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

准备工作

  1. Create or select a Google Cloud project.

    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

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

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

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

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

  6. Enable the IAM and Certificate Authority Service APIs:

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

  7. 配置 Google Cloud CLI 以使用添加到许可名单的项目进行结算和配额计算。

    gcloud config set billing/quota_project PROJECT_ID
    

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

所需的角色

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

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

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

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

概览

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

  1. 安全管理员

  2. 计算管理员

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

创建托管式工作负载身份

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

创建工作负载身份池

您必须在 TRUST_DOMAIN 模式下创建池才能创建托管式工作负载身份。如需为托管式工作负载身份创建工作负载身份池,请使用 workload-identity-pools create 命令。

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

替换以下内容:

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

如需验证您的工作负载身份池是否是在 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。

创建命名空间

借助 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 用于验证工作负载身份的属性。验证完成后,调用工作负载可以接收凭据。验证基于工作负载的以下属性之一:

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

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

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

  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

      如需创建基于实例 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
    

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

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

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

配置根 CA 池

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

gcloud

创建根 CA 池。

  1. Enterprise 层级中创建根 CA 池,这表示使用 gcloud privateca pools create 命令进行长期、小批量的证书颁发。

    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

使用 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 个字符,并且只能包含小写和大写字母数字字符、下划线或连字符。池名称在区域内必须是唯一的。
    • 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 Service 请求证书并获取公共证书的权限。

gcloud

  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/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/locations/global/workloadIdentityPools/POOL_ID/*"
    

    替换以下内容:

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

定义信任和证书颁发配置

您可以使用此信息创建 JSON 文件,该文件会在创建虚拟机时作为合作伙伴数据上传。

定义证书颁发配置

如需为 Compute Engine 启用托管式工作负载身份,需要使用以下证书颁发配置

{
  "primary_certificate_authority_config": {
    "certificate_authority_config": {
      "ca_pool": "projects/SUBORDINATE_CA_POOL_PROJECT_ID/locations/REGION/caPools/SUBORDINATE_CA_POOL_ID"
    }
  },
  "key_algorithm": "ALGORITHM",
  "workload_certificate_lifetime_seconds": DURATION,
  "rotation_window_percentage": ROTATION_WINDOW_PERCENTAGE
}

替换以下内容:

  • SUBORDINATE_CA_POOL_PROJECT_ID:包含从属 CA 池的项目的 ID。
  • REGION:从属 CA 池所在的区域。
  • SUBORDINATE_CA_POOL_ID:从属 CA 池的名称
  • ALGORITHM:用于生成私钥的加密算法。有效值为 rsa-2048(默认)、rsa-3072rsa-4096ecdsa-p256ecdsa-p384
  • DURATION:可选:叶证书的有效期(以秒为单位)。该值必须在 3600 到 315360000 之间。如果未指定,则系统会使用默认值 86400。已颁发证书的实际有效性也取决于颁发证书的 CA,因为它可能会限制已颁发证书的生命周期。
  • ROTATION_WINDOW_PERCENTAGE:可选:触发续订时证书生命周期的百分比。值必须介于 1 到 100 之间。默认值是 66%。您必须设置相对于证书生命周期的轮替窗口百分比,以确保证书在证书颁发至少 7 天之后且在到期前至少提前 7 天进行续订。

定义信任配置

信任配置包含一组用于验证对等证书的信任锚。其中包括以下内容:

  • 可信 CA 池资源 URI:一组可信 CA 池资源 URI,受信任可在虚拟机所属的同一信任网域中颁发证书。
  • PEM 格式的 CA 证书:一组 PEM 格式的 CA 证书,受信任可在虚拟机所属的同一信任网域中颁发证书。
{
  "POOL_ID.global.PROJECT_NUMBER.workload.id.goog": {
    "trust_anchors": [
      {
        "ca_pool": "projects/SUBORDINATE_CA_POOL_PROJECT_ID/locations/REGION/caPools/SUBORDINATE_CA_POOL_ID"
      },
      {
        "pem_certificate": "PEM_ENCODED_CERTIFICATE"
      }
    ]
  }
}

替换以下内容:

  • POOL_ID:工作负载身份池的 ID
  • PROJECT_NUMBER:包含工作负载身份池的项目的编号
  • SUBORDINATE_CA_POOL_PROJECT_ID:包含从属 CA 池的项目的 ID。
  • REGION:从属 CA 池所在的区域
  • SUBORDINATE_CA_POOL_ID:从属 CA 池的 ID
  • PEM_ENCODED_CERTIFICATE:可选:一组额外的 PEM 格式的 CA 证书,受信任可在虚拟机所属的同一信任网域中颁发证书。这些证书将添加到子级 CA 池的信任锚点列表中。以下命令可用于将 PEM 格式的 trust-anchor.pem 文件编码为一行字符串:

    cat trust-anchor.pem | sed 's/^[ ]*//g' | sed -z '$ s/\n$//' | tr '\n' $ | sed 's/\$/\\n/g'
    

创建配置文件以上传虚拟机的合作伙伴元数据

创建一个包含以下代码的 JSON 文件:

将此文件另存为 CONFIGS.json。此文件在创建虚拟机以运行使用托管式工作负载身份的应用时使用。

CONFIGS.json 文件应类似如下所示:

  {
  "wc.compute.googleapis.com": {
     "entries": {
        "certificate-issuance-config": {
           "primary_certificate_authority_config": {
              "certificate_authority_config": {
                 "ca_pool": "projects/PROJECT_ID/locations/REGION/caPools/SUBORDINATE_CA_POOL_ID"
              }
           },
           "key_algorithm": "ALGORITHM"
        },
        "trust-config": {
           "POOL_ID.global.PROJECT_NUMBER.workload.id.goog": {
               "trust_anchors": [{
                  "ca_pool": "projects/PROJECT_ID/locations/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"
     }
  }
  }
  

后续步骤

自行试用

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

免费开始使用