本页面介绍了如何使用 gcloud CLI 配置托管式工作负载身份。
本页面介绍如何为 Compute Engine 设置托管式工作负载身份的自动预配和生命周期管理。您可以将证书授权机构 (CA) 池配置为使用 Certificate Authority Service 颁发证书。 CA Service 是一项可用性高、可扩容的 Google Cloud 服务,可简化和自动执行 CA 服务的部署、管理和安全维护。您可以创建使用已配置的 CA 池中的 X.509 凭据预配的虚拟机实例。这些凭据随后可用于在工作负载之间建立 mTLS 连接。
准备工作
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.
-
了解托管式工作负载身份。
了解如何使用 Certificate Authority Service 颁发证书。
Enable the IAM and Certificate Authority Service APIs:
gcloud services enable iam.googleapis.com
privateca.googleapis.com 配置 Google Cloud CLI 以使用添加到许可名单的项目进行结算和配额计算。
gcloud config set billing/quota_project PROJECT_ID
将 PROJECT_ID 替换为已添加到托管式工作负载身份预览版许可名单的项目的 ID。
所需的角色
如需获得创建托管式工作负载身份和预配托管式工作负载身份证书所需的权限,请让您的管理员为您授予项目的以下 IAM 角色:
-
如需创建和配置托管式工作负载身份,请授予以下角色:
-
IAM Workload Identity Pool Admin (
roles/iam.workloadIdentityPoolAdmin
) -
Service Account Admin (
roles/iam.serviceAccountAdmin
)
-
IAM Workload Identity Pool Admin (
-
创建和配置 CA 池:CA Service Admin (
roles/privateca.admin
)
如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限。
此外,IAM Owner (roles/owner
) 基本角色还具有配置托管式工作负载身份的权限。
您不应在生产环境中授予基本角色,但可以在开发或测试环境中授予这些角色。
概览
如需为您的应用使用托管式工作负载身份,您必须执行以下任务:
安全管理员:
计算管理员:
为 Compute Engine 中运行的工作负载启用托管式工作负载身份:
- 对于单个虚拟机。
- 对于托管式实例组 (MIG)。
创建托管式工作负载身份
借助托管式工作负载身份,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
定义工作负载证明政策
工作负载证明政策可确保只有可信工作负载才能使用托管式身份。
当工作负载运行并请求凭据以获得托管式工作负载身份 ID 时,Google Cloud IAM 会使用您在证明政策中定义的属性来验证 Compute Engine 实例。验证基于工作负载的以下属性之一:
- 虚拟机实例 ID
- 关联的服务账号电子邮件地址
验证通过后,工作负载会收到凭据。
如需创建使用服务账号作为托管式身份的单属性选择器的证明政策,请运行以下命令:
gcloud iam service-accounts create SERVICE_ACCOUNT_NAME
替换以下内容:
SERVICE_ACCOUNT_NAME
:服务账号的名称
如需创建工作负载证明政策,以允许服务账号关联到的工作负载是为托管式工作负载身份颁发的证书,请运行以下命令:
gcloud iam workload-identity-pools managed-identities workload-sources create \ project-WORKLOAD_PROJECT_NUMBER \ --single-attribute-selectors="compute.googleapis.com/Instance.attached_service_account.email=SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com" \ --managed-identity=MANAGED_IDENTITY_ID \ --namespace=NAMESPACE_ID \ --workload-identity-pool=POOL_ID \ --location="global"
替换以下内容:
SERVICE_ACCOUNT_NAME
:服务账号的名称。WORKLOAD_PROJECT_NUMBER
:包含工作负载的项目的编号。该政策允许此项目中的工作负载使用托管式工作负载身份。PROJECT_ID
:服务账号所在项目的 ID。MANAGED_IDENTITY_ID
:托管式身份的唯一 ID。NAMESPACE_ID
:您之前创建的命名空间 ID。POOL_ID
:您之前创建的工作负载身份池 ID。
对于给定的工作负载身份池,您最多可以为工作负载项目定义 50 个单个属性选择器。
如需了解如何更新或删除证明政策,请运行以下命令:
gcloud iam workload-identity-pools managed-identities workload-sources --help
配置 Certificate Authority Service 以便为托管式工作负载身份颁发证书
使用 Certificate Authority Service 池为根证书授权机构和从属证书授权机构 (CA) 创建建议设置。 从属 CA 池向虚拟机颁发 X.509 工作负载身份证书。
配置 CA 池后,您可以授权托管式工作负载身份从 CA 池请求和接收签名证书。
配置根 CA 池
使用 Certificate Authority Service 的 Google Cloud CLI 接口配置根 CA 池。
gcloud
创建根 CA 池。
在 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 池。
使用
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 池中创建其他根 CA。这对根 CA 轮替非常有用。
配置从属 CA
使用 Certificate Authority Service 的 Google Cloud CLI 界面创建从属 CA 池和从属 CA。
如果您有多个证书颁发场景,可以为每种场景创建一个从属 CA。此外,在 CA 池中添加多个从属 CA 有助于您更好地对证书请求进行负载均衡。
gcloud
使用 gcloud privateca pools create
命令创建从属 CA 池。
在 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 池。
使用
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 Service 请求证书并获取公共证书的权限。
gcloud
将每个从属 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
将从属 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/PROJECT_ID/locations/REGION/caPools/SUBORDINATE_CA_POOL_ID" } }, "key_algorithm": "ALGORITHM", "workload_certificate_lifetime_seconds": "DURATION", "rotation_window_percentage": "ROTATION_WINDOW_PERCENTAGE" }
替换以下内容:
- PROJECT_NAME:包含 CA 池的项目的名称
- REGION:从属 CA 池所在的区域
- SUBORDINATE_CA_POOL_ID:从属 CA 池的名称
- ALGORITHM:用于生成私钥的加密算法。有效值为
rsa-2048
(默认)、rsa-3072
、rsa-4096
、ecdsa-p256
和ecdsa-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/PROJECT_NAME/locations/REGION/caPools/SUBORDINATE_CA_POOL_ID" }, { "pem_certificate": "PEM-encoded certificate" } ] } }
替换以下内容:
- POOL_ID:工作负载身份池的 ID
- PROJECT_NUMBER:包含工作负载身份池的项目的编号
- PROJECT_NAME:包含 CA 池的项目的名称
- REGION:从属 CA 池所在的区域
- SUBORDINATE_CA_POOL_ID:从属 CA 池的 ID
- PEM-encoded certificate:可选:一组可信的 PEM 格式的 CA 证书,受信任可在虚拟机所属的同一信任网域中颁发证书
创建配置文件以上传虚拟机的合作伙伴元数据
创建一个包含以下代码的 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" } } }
后续步骤
- 使用 mTLS 将工作负载配置为工作负载身份验证。
- 详细了解如何创建 CA 池。