颁发用于证明第三方身份的证书
本教程演示了如何颁发证书来证明 第三方身份提供方 身份反射 和工作负载身份池。
您可以使用身份反射创建与已验证 是证书请求者的身份借助身份反射,您可以限制 非特权证书请求者,可以仅请求具有 与服务中的身份对应的正文备用名称 (SAN) 凭据。
目标
本教程介绍了如何使用 CA Service 与工作负载身份池合作,以联合第三方身份并获取 用于证明此身份的证书
准备工作
在开始之前,请确保您了解以下概念:
- 工作负载身份池:借助工作负载身份池,您可以管理第三方 身份提供方。如需了解详情,请参阅 管理工作负载身份池和提供方。
- 工作负载身份联合:工作负载身份联合利用 用于向第三方身份授予对 Google Cloud 的访问权限的工作负载身份池 服务。如需了解详情,请参阅 Workload Identity 联合。
- Security Token Service (STS):借助 Security Token Service,您可以将第三方凭据换成第一方(Google Cloud)令牌。有关 相关信息,请参阅 Security Token Service。
- 身份反射:身份反射功能可让经过验证的 与请求的证书关联。对于 请参阅 Identity 反思。
确保您拥有以下 IAM 角色:
- 如需管理证书授权机构 (CA) 和 CA 池,以及请求证书,您必须拥有 CA Service Operation Manager (
privateca.caManager
) 角色。如需详细了解 CA 服务的 IAM 角色,请参阅使用 IAM 进行访问权限控制。 - 如需管理工作负载身份池和提供方,您必须拥有
Workload Identity Pool Admin (
iam.workloadIdentityPoolAdmin
) 角色。 - 如需创建服务账号,您必须拥有 Service Account Admin 角色
(
iam.serviceAccountAdmin
) 角色。
如需了解如何授予 IAM 角色,请参阅 管理对项目、文件夹和 组织。您可以向 Google 账号、服务账号、Google 群组、Google Workspace 账号或 Cloud Identity 网域授予所需的 IAM 角色。
设置工作负载身份池和提供方
本教程介绍了如何使用 Google OpenID Connect (OIDC) 与服务账号结合使用,以充当第三方身份。通过 Google 账号 OIDC 提供方充当第三方身份提供方 (IDP), Google Cloud 服务账号是此 IDP 声明的第三方身份示例。
工作负载身份池支持各种身份提供方, 包括 Microsoft Azure/本地 Active Directory、AWS 和基于 SAML 身份提供方。
如需设置工作负载身份池和提供方,请执行以下操作: 1.如需代表一组受信任的联合身份,请创建一个工作负载 身份池:
```
gcloud iam workload-identity-pools create IDENTITY_POOL_ID --location global --display-name "tutorial-wip"
```
Replace the following:
- <var>IDENTITY_POOL_ID</var>: The unique identifier of the new workload
identity pool.
为第三方身份创建工作负载身份池提供方 provider:
gcloud iam workload-identity-pools providers create-oidc PROVIDER_ID --location global --workload-identity-pool IDENTITY_POOL_ID --display-name "tutorial-oidc" --attribute-mapping "google.subject=assertion.sub" --issuer-uri="https://accounts.google.com"
替换以下内容:
- PROVIDER_ID:身份提供方的唯一标识符 您要在工作负载身份池中创建的资源
您可以根据自己的应用场景自定义以下标志:
attribute-mapping
:此标志设置 对 Google 主要版权主张google.subject
的版权主张。google.subject
是必需的映射,您可以使用 CEL 表达式将其设置为任何声明或声明组合。有关详情,请参阅定义属性映射和 条件。issuer-uri
:对于 OIDC 提供方,此标志可公开访问 端点,Google 会与其联系以验证第三方 词元。如需了解详情,请参阅准备外部身份 provider。
详细了解如何设置工作负载身份 请参阅配置工作负载身份 联合。
创建 CA 池和颁发 CA
本部分介绍如何创建 CA 池和添加根 CA 传递给它。您可以使用此 CA 池来发出身份反映 证书。如果要使用现有 CA 池和 CA,则可以跳过此步骤 部分。
除了根 CA 之外,您还可以选择创建从属 CA。正在创建 根 CA 有助于缩短流程。
在 DevOps 层级创建 CA 池:
gcloud privateca pools create CA_POOL_ID --location LOCATION --tier devops
替换以下内容:
- CA_POOL_ID - 执行此测试的 CA Service CA 池的 ID 颁发证书
- LOCATION - CA 池的位置。
如需详细了解如何创建 CA 池,请参阅 创建 CA 池。
创建根 CA:
gcloud privateca roots create CA_ID --pool CA_POOL_ID --location LOCATION --subject "CN=test,O=test-org"
替换以下内容:
- CA_ID - 颁发证书的证书授权机构的 ID。
- CA_POOL_ID - 执行此测试的 CA Service CA 池的 ID 颁发证书
- LOCATION - CA 池的位置。
如需详细了解如何创建根 CA,请参阅创建根 CA。
启用从工作负载身份池中联合以提出问题的身份 CA 池中的证书。身份反射需要 CA Service Workload 证书请求者 (
roles/privateca.workloadCertificateRequester
) IAM 角色CreateCertificate
的请求者。您可以以各种精细程度表示工作负载身份池主体,从单个主体到跨提供程序的池中所有身份。如需了解详情,请参阅可用的主账号或主账号集(使用 Google Cloud CLI 标签页),最适合您的使用场景。
gcloud privateca pools add-iam-policy-binding CA_POOL_ID --location LOCATION --role roles/privateca.workloadCertificateRequester --member "principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/IDENTITY_POOL_ID/*"
替换以下内容:
- PROJECT_NUMBER - 您在其中登录的项目的编号 已创建工作负载身份池。
创建代表第三方身份的服务账号
以下过程假定服务账号代表
第三方。本部分介绍了如何使用
GenerateIdToken
IAM 端点以
OIDC 令牌。根据您的使用场景,您可能需要执行不同的步骤
获取您选择的第三方身份令牌。
gcloud iam service-accounts create SERVICE_ACCOUNT
替换以下内容:
- SERVICE_ACCOUNT - 代表第三方身份的服务账号的 ID。
颁发证书,以证明第三方身份
开始之前,请确保您具有 Service Account Token Creator (roles/iam.serviceAccountTokenCreator
) IAM 角色。你需要这个
可调用 GenerateIdToken
API 的 IAM 角色。
要获取可证明第三方身份的证书,请执行以下操作: 以下:
从您的第三方身份提供方获取第三方身份令牌。
curl
export ID_TOKEN=`curl -d '{"audience":"//iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/IDENTITY_POOL_ID/providers/PROVIDER_ID"}' -H 'Content-Type: application/json' -H "Authorization: Bearer $(gcloud auth print-access-token)" https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/SERVICE_ACCOUNT@PROJECT_ID.iam.gserviceaccount.com:generateIdToken | python3 -c "import sys;import json;print(json.load(sys.stdin)['token'])"`
替换以下内容:
- PROJECT_ID - 您要创建的项目的 Google Cloud 项目 ID 资源。
客户端库
要以编程方式访问第三方令牌,您可以从 文件来源凭据或网址来源凭据。如需更多信息 请参阅使用客户端库、gcloud CLI 或 Terraform。 在本教程中,我们将遵循文件来源凭据工作流程。
将凭据加载到证书可读取的路径中 申请者:
curl -d '{"audience":"//iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/IDENTITY_POOL_ID/providers/PROVIDER_ID"}' -H 'Content-Type: application/json' -H "Authorization: Bearer $(gcloud auth print-access-token)" https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/SERVICE_ACCOUNT@PROJECT_ID.iam.gserviceaccount.com:generateIdToken | python3 -c "import sys;import json; print(json.load(sys.stdin)['token']) > /tmp/oidc_token.txt
替换以下内容:
- PROJECT_ID:您要创建的项目的 ID 资源。
使用 STS 将第三方令牌交换为联合 OAuth 令牌
token
端点:curl
export STS_TOKEN=`curl -L -X POST 'https://sts.googleapis.com/v1/token' -H 'Content-Type: application/json' \ -d '{ "grant_type": "urn:ietf:params:oauth:grant-type:token-exchange", "audience": "//iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/IDENTITY_POOL_ID/providers/PROVIDER_ID", "requested_token_type": "urn:ietf:params:oauth:token-type:access_token", "scope": "https://www.googleapis.com/auth/cloud-platform", "subject_token": "'$ID_TOKEN'", "subject_token_type": "urn:ietf:params:oauth:token-type:jwt" }' | python3 -c "import sys;import json; print(json.load(sys.stdin)['access_token'])"`
客户端库
- 创建凭据
名为
oidc_token.txt
的配置文件 读取请求代码以执行令牌交换。
gcloud iam workload-identity-pools create-cred-config projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/IDENTITY_POOL_ID --output-file=/tmp/cred_config.json --credential-source-file=/tmp/oidc_token.txt
- 读取
oidc_token.txt
文件以在客户端中设置授权机制 库:
Python
import json from google.auth import identity_pool with open('/tmp/cred_config.json', 'r') as f: json_config_info = json.loads(f.read()) credentials = identity_pool.Credentials.from_info(json_config_info) scoped_credentials = credentials.with_scopes( ['https://www.googleapis.com/auth/cloud-platform'])
- 创建凭据
名为
使用
REFLECTED_SPIFFE
主题请求模式:curl
可选:如果您没有 CSR,请通过执行 。
export TUTORIAL_CSR=$(openssl req -newkey rsa:2048 -nodes -subj / -keyout tutorial_do_not_use.key)
请求具有 CSR、生命周期和反映 主题请求模式:
curl -H "Authorization: Bearer $(echo $STS_TOKEN)" https://privateca.googleapis.com/v1/projects/PROJECT_NUMBER/locations/LOCATION/caPools/CA_POOL_ID/certificates\?alt\=json -X POST -H "Content-Type: application/json" -H 'Accept: application/json' --data '{"lifetime": "100s", "pemCsr": "'$TUTORIAL_CSR'", "subjectMode": "REFLECTED_SPIFFE"}'
客户端库
要将第一方令牌转发到 CA Service,您必须 创建具有凭据的客户端然后,您可以使用此已获授权的客户端发出证书请求:
启动具有凭据的 CA Service 客户端:
Python
caServiceClient = privateca_v1.CertificateAuthorityServiceClient(credentials=scoped_credentials)
请求证书。
Python
如需向 CA 服务进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证。
验证证书。您的证书应包含主题 包含单个 URI SAN。证明身份的 SAN 是 格式如下:
spiffe://IDENTITY_POOL_ID.PROJECT_NUMBER.global.workload.id.goog/subject/<oidc_subject_number>
您需要将其中的:
- IDENTITY_POOL_ID: 工作负载身份池。
- PROJECT_NUMBER - 您在其中创建了工作负载身份池的项目的编号。
清理
为避免系统因 按照本文档创建的 CA Service 资源, 执行以下操作:
删除您创建的 CA。
停用 CA:
gcloud privateca roots disable CA_ID --pool CA_POOL_ID --location LOCATION
您需要将其中的:
- CA_ID:CA 的唯一标识符。
- CA_POOL_ID:CA 池的唯一标识符。
- LOCATION:CA 池的位置。
删除 CA:
gcloud privateca roots delete CA_ID --pool CA_POOL_ID --location LOCATION --ignore-active-certificates
您需要将其中的:
- CA_ID:CA 的唯一标识符。
- CA_POOL_ID:CA 池的唯一标识符。
- LOCATION:CA 池的位置。
删除您创建的 CA 池。
gcloud privateca pools delete CA_POOL_ID --location LOCATION
您需要将其中的:
- CA_POOL_ID:CA 池的唯一标识符。
- LOCATION:CA 池的位置。
如需详细了解
gcloud privateca pools delete
命令,请参阅 gcloud privateca pool delete。删除您创建的工作负载身份池:
gcloud iam workload-identity-pools delete IDENTITY_POOL_ID --location global
您需要将其中的:
- IDENTITY_POOL_ID:工作负载的唯一标识符 身份池。
删除您创建的服务账号:
gcloud iam service-accounts delete SERVICE_ACCOUNT@PROJECT_ID.iam.gserviceaccount.com
您需要将其中的:
- SERVICE_ACCOUNT:工作负载的唯一标识符 身份池。
- PROJECT_ID:服务账号所属的项目。
CA Service 工作负载
证书请求者 (privateca.workloadCertificateRequester
)
IAM 角色将已颁发证书的主题限制为
请求者的身份信息。确保使用该身份的用户或工作负载
反射功能仅获得 CA Service 授权
工作负载证书请求者 (privateca.workloadCertificateRequester
)
IAM 角色。为了遵守最小权限原则,您可以
避免向 CA 服务证书请求者授予
(privateca.certificateRequester
) IAM 角色。
后续步骤
- 了解各种政策控制功能 可让您控制所请求证书的属性, 体现身份认同。
- 了解如何配置和管理各种政策 控件。