配置工作负载身份联合

本指南介绍了如何使用外部身份提供商颁发的凭据模拟服务帐号并访问 Google Cloud 上的资源。此过程称为工作负载身份联合

工作负载身份联合的常见用例包括:

  • 启用在 Google Cloud 外部运行的后台应用或持续集成/持续交付 (CI/CD) 流水线,以访问 Google Cloud 资源和 API
  • 允许在 Google Cloud 外部运行的 Web 应用的用户访问存储在 Google Cloud 服务中的数据,例如 Cloud Storage 或 BigQuery

要使用工作负载身份联合,请将 Google Cloud 配置为信任外部身份提供商(如 Amazon Web Services (AWS)、Azure Active Directory (AD)、与 OIDC 兼容的身份提供商或与 SAML 2.0 兼容的身份提供商)。然后,应用可以使用外部身份提供商颁发的凭据,按照以下步骤模拟服务帐号:

  1. 从受信任的身份提供商获取凭据。
  2. 用凭据从 Security Token Service 交换令牌。
  3. 使用 Security Token Service 中的令牌模拟服务帐号并获取短期 Google 访问令牌

通过使用工作负载身份联合,您可以避免存储和管理服务帐号密钥

准备工作

  • 启用 IAM, Resource Manager, Service Account Credentials, and Security Token Service API。

    启用 API

所需的角色

如需获得配置工作负载身份联合所需的权限,请让管理员向您授予项目的以下 IAM 角色:

  • Workload Identity Pool Admin (roles/iam.workloadIdentityPoolAdmin)
  • Service Account Admin (roles/iam.serviceAccountAdmin)

如需详细了解如何授予角色,请参阅管理访问权限

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

准备外部身份提供商

如需使用工作负载身份联合,您必须在项目中配置工作负载身份池工作负载身份池提供商

AWS

AWS 用户AWS 角色可以使用永久性或临时 AWS 安全凭据来模拟 Google Cloud 上的服务帐号。

要允许使用 AWS 安全凭据,您必须将工作负载身份池配置为信任您的 AWS 帐号。然后,工作负载身份联合会识别为此 AWS 帐号颁发的安全凭据令牌,您可以使用这些令牌获取短期有效的服务帐号凭据。

Azure

Azure 用户和服务正文可以使用 Azure AD 访问令牌模拟 Google Cloud 上的服务帐号。

如需允许使用 Azure AD 访问令牌,您必须将工作负载身份池配置为信任 Azure AD 应用。然后,工作负载身份联合会识别为此应用颁发的访问令牌,您可以使用这些令牌获取短期有效的服务帐号凭据。

最佳做法是在 Azure AD 中创建新应用,并使用该应用获取 Google Cloud 凭据:

  1. 创建一个 Azure AD 应用和服务主帐号

  2. 设置应用的 ID

    设置应用 ID URI 时,默认为 api://<appid>。请记下该 URI,因为稍后在创建工作负载身份池提供程序和凭据配置文件时将用到它。

稍后配置工作负载身份池提供程序时,您需要应用 ID URI。

如需让应用获取 Azure AD 应用的访问令牌,您可以使用代管式身份

  1. 创建代管式身份。记下托管身份的对象 ID。稍后您在配置模拟时需要用到它。

  2. 将代管式身份分配到运行应用的虚拟机或其他资源。

GitHub Actions

您可以让 GitHub Actions 工作流使用 GitHub OIDC 令牌在 Google Cloud 上模拟服务帐号。

为了允许使用这些令牌,您必须将工作负载身份池配置为信任 GitHub 颁发的 OIDC 令牌。然后,工作负载身份联合会识别为工作流颁发的 ID 令牌,您可以使用这些令牌获取短期有效的服务帐号凭据。

OIDC

您可以使用 ID 令牌JSON Web 令牌格式的访问权限,让用户和应用模拟 Google Cloud 上的服务帐号由 OIDC 合规身份提供商颁发的令牌。

要允许使用这些令牌,您必须将工作负载身份池配置为信任您的外部身份提供商。然后,工作负载身份联合会识别由外部身份提供商颁发的令牌,您可以使用这些令牌获取短期有效的服务帐号凭据。

要使用工作负载身份联合,您的身份提供商 OIDC 元数据 URI 必须可通过互联网公开访问,并使用端点 ISSUER/.well-known/openid-configuration,其中 ISSUER 是令牌中的颁发者 (iss) 声明的值。Google Cloud 会查询元数据端点以获取提供商的 JSON Web 密钥集 (JWKS),然后使用此密钥集验证令牌。

通常,最好在执行令牌交换时使用 ID 令牌,因为 ID 令牌反映了用户的身份。如果您决定使用访问令牌,请在身份提供商中配置一个专用应用或资源,仅用于获取 Google Cloud 凭据。

默认情况下,工作负载身份联合需要使用以下网址作为目标设备 (aud) 声明的令牌:

https://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID

替换以下内容:

  • PROJECT_NUMBER:您用于创建工作负载身份池的 Google Cloud 项目的编号
  • POOL_ID:您选择的工作负载 ID,用于标识工作负载身份池。稍后在创建工作负载身份池时,您必须使用相同的 ID。
  • PROVIDER_ID:您选择的工作负载 ID,用于标识工作负载身份池提供商。稍后在创建工作负载身份池提供程序时,必须使用相同的 ID。

您可以在创建工作负载身份池和提供商时指定允许的受众群体的自定义列表。

OIDC (AD FS)

Active Directory 用户可以使用 Active Directory Federation Services (AD FS) 中的 OIDC 访问令牌来模拟 Google Cloud 上的服务帐号。

如需让应用请求 AD FS 访问令牌并使用这些令牌访问 Google Cloud,则 AD FS 中需要有两个应用注册

  1. 类型为原生应用服务器应用的应用注册。

  2. 类型为 Web API 的应用注册,对应于 Google Cloud 上的工作负载身份池提供商。

然后,您可以将工作负载身份提供商配置为接受颁发给 Web API 的访问令牌。

使用 Windows 集成身份验证

您可以将工作负载身份联合与 Windows 集成身份验证 (IWA) 结合使用。通过 IWA,Active Directory 应用可以使用 Kerberos 或 NTLM 凭据向 AD FS 进行身份验证。通过结合使用工作负载身份联合和 IWA,您将无需存储和管理 AD FS 客户端凭据和服务帐号密钥。

如需使用 IWA,请确保满足以下前提条件:

注册客户端应用

如需在适用于 Windows Server 2019 的 AD FS 中注册应用,请执行以下操作:

  1. 打开 AD FS MMC 管理单元并导航到应用组
  2. 点击添加应用组
  3. 欢迎页面上,输入客户端的名称,然后选择服务器应用。然后点击下一步
  4. 服务器应用页面上,输入客户端标识符(客户端 ID)和重定向 URI。如果您仅计划使用 client_credentials 授权类型,则不会使用重定向 URI,您可以使用 http://localhost/ 等 URI。然后点击下一步
  5. 配置应用凭据页面上,选择客户端的身份验证方式。要使用 IWA,请将 Windows 集成身份验证设置为已启用,并选择要配置为应用的运行身份的网域用户。然后点击下一步
  6. 摘要页面上检查设置,然后点击下一步
  7. 点击关闭以关闭对话框。

为工作负载身份联合池创建 Web API 应用

创建另一个类型为 Web API 的应用注册。此应用对应于一个工作负载身份池提供方,您使用它来设置与 Google Cloud 的信任关系。

如需在适用于 Windows Server 2019 的 AD FS 中创建应用,请执行以下操作:

  1. 打开 AD FS MMC 管理单元并导航到应用组
  2. 点击添加应用组
  3. 欢迎页面上,输入一个名称(例如 Workload Identity Federation (test environment)),然后选择 Web API。然后点击下一步
  4. 配置 Web API 页面上,输入 Web API 的信赖方标识符。

    您可以使用以下 URI 作为信赖方标识符,而不是定义自定义信赖方标识符:

    https://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID
    

    替换以下值:

    • PROJECT_NUMBER:您用于创建工作负载身份池的 Google Cloud 项目的项目编号
    • POOL_ID:您选择的工作负载 ID,用于标识工作负载身份池。稍后在创建工作负载身份池时,您必须使用相同的 ID。
    • PROVIDER_ID:您选择的工作负载 ID,用于标识工作负载身份池提供商。稍后在创建工作负载身份池提供程序时,必须使用相同的 ID。

    此格式可确保信赖方标识符唯一标识工作负载身份池提供商。

    稍后在配置工作负载身份池提供商时,您需要信赖方标识符。

  5. 点击下一步

  6. 应用访问权限控制政策页面上,选择适当的访问权限政策,然后点击下一步

  7. 配置应用权限页面上,添加您之前创建的客户端应用。然后点击下一步

  8. 摘要页面上检查设置,然后点击下一步

  9. 点击关闭以关闭对话框。

SAML

通过使用符合 SAML 2.0 标准的身份提供商发出的断言,您可以让用户和应用模拟 Google Cloud 上的服务帐号。不支持使用加密断言的联合。

配置您的 SAML 身份提供商,以使用 https://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID 格式将工作负载身份池提供商作为目标对象发出断言。

如需允许使用这些断言,您必须将工作负载身份池配置为信任您的外部身份提供商,方法是为该池提供您的 SAML 身份提供商的元数据文档

然后,工作负载身份联合可识别外部身份提供商发出的断言,您可以使用令牌来获取短期服务帐号凭据。

SAML (AD FS)

通过使用 Active Directory Federation Services (AD FS) 中的 SAML 2.0 断言,您可以让应用模拟 Google Cloud 上的服务帐号。

如需让应用从 AD FS 请求可用于工作负载身份联合的 SAML 断言,您必须创建信赖方信任。要在适用于 Windows Server 2019 的 AD FS 中创建信赖方信任,请执行以下操作:

  1. 打开 AD FS MMC 管理单元,并导航到信赖方信任
  2. 点击添加信赖方信任
  3. 添加信赖方信任向导的欢迎页面上,选择声明感知,然后点击开始
  4. 选择数据源页面上,选择手动输入有关信赖方的数据。然后点击下一步
  5. 指定显示名称页面上,输入信任名称。然后点击下一步
  6. 配置证书页面上,点击下一步。不需要加密证书,因为工作负载身份联合不支持加密的 SAML 断言。
  7. 配置 URL 页面上,保留默认设置,然后点击下一步
  8. 配置标识符页面上,输入信赖方标识符。

    您可以使用以下 URI 作为信赖方标识符,而不是定义自定义信赖方标识符:

    https://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID
    

    替换以下内容:

    • PROJECT_NUMBER:您用于创建工作负载身份池的 Google Cloud 项目的项目编号
    • POOL_ID:您选择的工作负载 ID,用于标识工作负载身份池。稍后在创建工作负载身份池时,您必须使用相同的 ID。
    • PROVIDER_ID:您选择的工作负载 ID,用于标识工作负载身份池提供商。稍后在创建工作负载身份池提供程序时,必须使用相同的 ID。

    此格式可确保信赖方标识符唯一标识工作负载身份池提供商。

    稍后在配置工作负载身份池提供商时,您需要信赖方标识符。

  9. 点击下一步

  10. 选择访问控制策略页面上,选择适当的访问控制策略,然后点击下一步

  11. 准备好添加信任页面上,检查设置并点击下一步

  12. 完成页面上,点击关闭以关闭对话框。

为了与工作负载身份联合兼容,SAML 断言必须至少包含一个唯一标识 Active Directory 用户的声明。为此,您通常可以使用名称 ID 声明,该声明对应于 SAML 断言中 NameID 元素的值。

如需自定义 SAML 断言的一组声明,您必须修改信赖方信任的声明颁发策略。要修改声明颁发策略,请执行以下操作:

  1. 在信赖方信任列表中,选择刚刚创建的信任,然后点击编辑声明颁发策略
  2. 点击添加规则
  3. 添加转换声明规则向导的选择规则类型页面上,选择转换传入声明。然后点击下一步
  4. 配置声明规则页面上,配置以下设置:

    • 声明规则名称Name Identifier
    • 传入声明类型:选择主 SIDUPN 或其他声明来唯一标识主题。
    • 传出声明类型名称 ID
    • 传出名称 ID 格式未指定
  5. 选择传递所有声明值,然后点击完成

  6. (可选)配置其他规则,以在 SAML 断言中包含更多特性。

  7. 点击确定以关闭声明颁发策略对话框。

配置联合

要与您的外部身份提供商联合,您必须执行以下操作:

  1. 准备包含工作负载身份池和提供商的 Google Cloud 项目。
  2. 定义特性映射和可选的特性条件,用于将身份提供商的凭据映射到外部身份。
  3. 创建工作负载身份池和提供商。

以下部分将引导您完成此过程。

准备创建项目

选择并准备将包含工作负载身份池和提供商的项目:

  1. 确保您拥有项目的 Workload Identity Pool Admin (roles/iam.workloadIdentityPoolAdmin) 和 Service Account Admin (roles/iam.serviceAccountAdmin) 角色。

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

  2. 为您的组织更新组织政策以允许联合。

  3. 启用 IAM, Resource Manager, Service Account Credentials, and Security Token Service (STS) API。

    启用 API

定义特性映射和条件

定义特性映射和可选的特性条件,用于将身份提供商的凭据映射到外部身份。

您的外部身份提供商颁发的凭据包含一个或多个特性(也称为声明)。工作负载身份联合将这些特性称为断言特性,并以 assertion. 作为前缀。

特性映射允许您将断言特性映射到工作负载身份联合识别的预定义目标特性。这些预定义的目标特性如下:

特性 说明
google.subject 必需。用户的唯一标识符。此特性用于 IAM principal:// 角色绑定中,并显示在 Cloud Logging 日志中。 该值必须是唯一的,不能超过 127 个字符。
google.groups 可选。身份所属的一组群组。此特性在 IAM principalSet:// 角色绑定中使用,用于向群组的所有成员授予访问权限。
attribute.NAME 可选。您最多可以定义 50 个自定义特性,并在 IAM principalSet:// 角色绑定中使用这些特性,以授予对具有特定特性的所有身份的访问权限。

特性映射的格式为 TARGET_ATTRIBUTE=SOURCE_EXPRESSION。请参见以下示例:

  • 此映射会将断言特性 sub 分配给 google.subject

    google.subject=assertion.sub
    
  • 此映射使用通用表达式语言 (CEL) 表达式来连接多个断言特性:

    google.subject="myprovider::" + assertion.aud + "::" + assertion.sub
    
  • 此映射使用另一个 CEL 表达式将 GUID 值的断言特性 workload_id 映射到名称,并将结果分配给名为 attribute.my_display_name 的自定义特性:

    attribute.my_display_name={
      "8bb39bdb-1cc5-4447-b7db-a19e920eb111": "Workload1",
      "55d36609-9bcf-48e0-a366-a3cf19027d2a": "Workload2"
    }[assertion.workload_id]
    
  • 此映射使用 CEL 逻辑运算符和函数,将名为 attribute.environment 的自定义特性设置为 prodtest,具体取决于身份的 Amazon 资源名称 (ARN):

    attribute.environment=assertion.arn.contains(":instance-profile/Production") ? "prod" : "test"
    
  • 此映射会使用 extract 函数填充自定义特性 aws_role,该角色使用假设角色的名称,或者假设没有角色使用身份的 ARN。

    attribute.aws_role=assertion.arn.contains('assumed-role') ? assertion.arn.extract('{account_arn}assumed-role/') + 'assumed-role/' + assertion.arn.extract('assumed-role/{role_name}/') : assertion.arn
    

或者,您还可以定义特性条件。特性条件是可以检查断言特性和目标特性的 CEL 表达式。如果给定凭据的特性条件评估结果为 true,则接受凭据。否则,凭据会被拒绝。

要为您的用例选择合适的特性映射和条件,您需要决定是映射服务身份还是用户身份:

  • 通过映射服务身份,您可以启用在 Google Cloud 外部运行的后台应用或 CI/CD 流水线,以获取 Google Cloud 的短期凭据。应用会自行获取这些短期凭据,无需用户进行操作。
  • 通过映射用户身份,您可以为在 Google Cloud 外部运行的应用的用户获取 Google Cloud 的短期凭据。应用代表用户获取这些短期有效凭据。

映射服务身份

AWS

您的特性映射可以使用 GetCallerIdentity 的响应字段作为来源特性。这些字段包括:

  • account,包含 AWS 帐号。
  • arn,包含外部实体的 AWS ARN。
  • userid,其中包含调用实体的唯一标识符。

如果您的应用在附加角色的 Amazon Elastic Compute Cloud (EC2) 实例上运行,您可以使用以下特性映射:

google.subject=assertion.arn
attribute.aws_role=assertion.arn.contains('assumed-role') ? assertion.arn.extract('{account_arn}assumed-role/') + 'assumed-role/' + assertion.arn.extract('assumed-role/{role_name}/') : assertion.arn

通过此映射,您可以使用以下标识符向特定 EC2 实例或按角色授予模拟服务帐号的能力

授予对特定 EC2 实例的访问权限:

principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/subject/arn:aws:sts::ACCOUNT_ID:assumed-role/AWS_ROLE/AWS_ROLE_SESSION_NAME

按角色授予访问权限:

principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/attribute.aws_role/arn:aws:sts::ACCOUNT_ID:assumed-role/AWS_ROLE

您的 AWS 帐号可能包含大量用户和角色,但只有一小部分用户和角色可能需要访问 Google Cloud 资源。如需限制可以使用工作负载身份联合的一组用户和角色,请使用特性条件。例如,以下条件允许特定帐号访问 Google Cloud 资源:

assertion.arn.startsWith('arn:aws:sts::ACCOUNT-ID:assumed-role/')

Azure

您的特性映射可以使用嵌入在 Azure 访问令牌中的声明(包括自定义声明)作为来源特性。

如需获取您可以引用的声明的完整列表,请连接到具有已分配的代管式身份的 Azure 虚拟机,并执行以下操作:

  1. Azure Instance Metadata Service (IMDS) 获取访问令牌:

    Bash

    curl \
      "http://169.254.169.254/metadata/identity/oauth2/token?resource=APP_ID_URI&api-version=2018-02-01" \
      -H "Metadata: true" | jq -r .access_token
    

    此命令使用 jq 工具jq 默认在 Cloud Shell 中可用。

    PowerShell

    $SubjectTokenType = "urn:ietf:params:oauth:token-type:jwt"
    $SubjectToken = (Invoke-RestMethod `
      -Uri "http://169.254.169.254/metadata/identity/oauth2/token?resource=APP_ID_URI&api-version=2018-02-01" `
      -Headers @{Metadata="true"}).access_token
    Write-Host $SubjectToken
    

    APP_ID_URI 替换为您已为工作负载身份联合配置的应用的应用 ID URI

  2. 在网络浏览器中,转到 https://jwt.ms/ 并将访问令牌粘贴到文本框中。

  3. 点击声明查看嵌入在访问令牌中的声明列表。

如需使用服务主帐号进行身份验证,您可以使用以下特性映射:

google.subject=assertion.sub

对于发布到代管式身份的访问令牌,sub 声明包含代管式身份的对象 ID。如果您使用其他声明,请确保该声明是唯一的,并且无法重新分配。

对于服务身份,通常不需要为 google.groups 或任何自定义特性创建映射。

如需控制哪些身份可以获取 Google Cloud 的短期凭据,请不要定义特性条件。请改为将 Azure AD 应用配置为使用应用角色分配

GitHub Actions

您的特性映射可以使用 OIDC 令牌中嵌入的声明作为来源特性。其中包括:

  • sub:包含代码库名称和 Git 参考,例如 repo:username/reponame:ref:refs/heads/master
  • repository:包含所有者和代码库名称,例如 username/reponame
  • repository_owner:包含所有者,可以是用户名或 GitHub 组织的名称。
  • ref:包含 Git 参考,例如 refs/heads/main

以下特性映射会将 GitHub Actions OIDC 令牌中的 google.subject 设置为 sub 声明。由于 sub 声明同时包含代码库名称和 Git 参考,因此该映射可让您按代码库和分支控制访问权限:

google.subject=assertion.sub

如果某些分支(例如 main)需要与其他分支不同的资源访问权限(例如功能分支),则按代码库和分支控制访问权限非常有用。

如果您不打算按分支区分访问权限,则可以使用以下特性映射,将 google.subject 设置为 repository 声明:

google.subject=assertion.repository

(可选)您可以使用特性条件来定义 ID 令牌必须满足的其他要求。例如,以下条件会限制对使用 Git 分支 main 的工作流的 ID 令牌的访问权限:

assertion.ref=='refs/heads/main'

OIDC

您的特性映射可以使用嵌入在外部身份提供商的 ID 令牌或访问令牌中的声明。

您必须将其中一个声明映射到 google.subject,以唯一标识用户。为了防止欺骗威胁,请选择具有不可更改的唯一值的声明。

许多身份提供商都会使用唯一且不可变的 ID 填充 sub 声明。对于这些身份提供商,请考虑将 sub 声明映射到 google.subject

google.subject=assertion.sub

请避免使用 email 等声明来实现此目的。电子邮件地址通常可以重新分配或更改,因此不会唯一标识和永久标识用户。

您的身份提供商可能包含大量用户,但只有一小部分用户可能需要访问 Google Cloud 资源。要限制可以使用工作负载身份联合的用户和凭据集,您可以选择使用特性条件

例如,以下条件限制对包含值为 true 的自定义 service_account 声明的令牌的访问权限:

assertion.service_account==true

OIDC (AD FS)

特性映射可以使用 AD FS 访问令牌中嵌入的声明作为来源特性。

要对应用进行身份验证,您可以使用以下特性映射:

google.subject=assertion.appid

此映射会将 google.subject 设置为 appid 声明的值,其中包含 AD FS 应用的客户端 ID。

(可选)您可以使用特性条件来定义 AD FS 访问令牌必须满足的其他要求。例如,以下条件定义应用必须使用 IWA 向 AD FS 进行身份验证:

assertion.authmethod=='http://schemas.microsoft.com/ws/2008/06/identity/authenticationmethod/windows'

如需控制可以获取 Google Cloud 的短期凭据的应用列表,请勿定义特性条件。相反,请在 AD FS 中使用客户端权限来定义要允许的应用。

SAML

您的特性映射可以使用外部身份提供商发出的断言中嵌入的 <Subject><Attribute> 元素。可以使用以下关键字来引用 SAML 特性:

  • assertion.subject 包含 <Subject> 元素中经过身份验证的用户的 NameID
  • assertion.attributes['ATTRIBUTE_NAME'] 包含类似名称 <Attribute> 的值列表。

您必须将其中一个声明映射到 google.subject,以唯一标识用户。为了防止欺骗威胁,请选择具有不可更改的唯一值的声明。

许多身份提供商都会使用唯一且不可变的 ID 填充 NameId。对于这些身份提供商,请考虑将 NameId 特性映射到 google.subject

google.subject=assertion.subject

请避免使用 http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress 等特性来实现此目的。电子邮件地址通常可以重新分配或更改,因此不会唯一标识和永久标识用户。

您的身份提供商可能包含大量用户,但只有一小部分用户可能需要访问 Google Cloud 资源。要限制可以使用工作负载身份联合的用户和凭据集,您可以选择使用特性条件

例如,以下条件会限制对包含值为 true 的自定义 https://example.com/SAML/Attributes/AllowGcpFederation 特性的断言的访问权限:

assertion.attributes['https://idp.com/SAML/Attributes/AllowGcpFederation'][0]=='true'

SAML (AD FS)

如本指南前面所述,您的特性映射可以使用 AD FS 发出的断言中嵌入的声明。

使用以下映射让工作负载身份联合使用 SAML 断言中的名称 ID 声明来唯一标识用户:

google.subject=assertion.subject

如果您已将声明颁发策略配置为在 SAML 断言中包含其他声明,则可以添加其他映射。例如:

google.groups=assertion.attributes['http://schemas.microsoft.com/ws/2008/06/identity/claims/groupsid']
attribute.userip=['http://schemas.microsoft.com/2014/09/requestcontext/claims/userip'][0]

(可选)您可以使用所有 SAML 断言必须满足的特性条件。例如,以下条件只允许包含特定群组成员资格声明的 SAML 断言:

"S-1-5-6" in google.groups

创建工作负载身份池和提供商

现在,您已经收集了创建工作负载身份池和提供商所需的全部信息:

控制台

  1. 在 Cloud Console 中,转到新建工作负载提供方和池页面。

    转到“新建工作负载提供商和池”

  2. 创建身份池下,输入以下内容:

    • 名称:池的名称。该名称还用作池 ID。池 ID 创建后便无法更改。
    • 说明:描述池用途的文本。
  3. 点击继续

  4. 选择一个提供商下拉列表中,选择您的提供商:

    • AWS(如果要与 AWS 联合)。
    • OpenID Connect (OIDC)(如果您要与 Azure、GitHub Actions 或其他 OIDC 兼容提供商联合)。
    • 您不能使用 Cloud Console 从 SAML 2.0 身份提供方配置工作负载身份联合。您必须使用 gcloud CLI 从 SAML 2.0 身份提供商配置工作负载身份联合。
  5. 提供商详细信息下,输入身份提供商的详细信息:

    AWS

    • 提供商名称:提供商的名称。该名称还用作提供商 ID。提供商 ID 创建后便无法更改。

    Azure

    • 提供商名称:提供商的名称。该名称还用作提供商 ID。提供商 ID 创建后便无法更改。
    • 颁发者网址https://sts.windows.net/TENANT_ID,其中 TENANT_ID 是 Azure AD 租户的租户 ID (GUID)。
    • 允许的目标设备:您在 Azure AD 中注册应用时使用的应用 ID URI

    GitHub Actions

    • 提供商名称:提供商的名称。该名称还用作提供商 ID。提供商 ID 创建后便无法更改。
    • 颁发者网址https://token.actions.githubusercontent.com/

    OIDC

    • 提供商名称:提供商的名称。该名称还用作提供商 ID。提供商 ID 创建后便无法更改。
    • 颁发者网址:您的身份提供商的颁发者网址。
    • 允许的目标设备:ID 令牌的预期目标设备。

    OIDC (AD FS)

    • 提供商名称:提供商的名称。该名称还用作提供商 ID。提供商 ID 创建后便无法更改。
    • 颁发者网址https://ADFS_DOMAIN/adfs,其中 ADFS_DOMAIN 是 AD FS 服务器或服务器场的公共域名。
  6. 点击继续

  7. 配置提供商特性下,添加您之前识别的特性映射

  8. 特性条件下,输入您之前确定的特性条件。如果您没有特性条件,请将该字段留空。

  9. 点击保存以创建工作负载身份池和提供商。

gcloud

  1. 创建新的工作负载身份池:

    gcloud iam workload-identity-pools create POOL_ID \
        --location="global" \
        --description="DESCRIPTION" \
        --display-name="DISPLAY_NAME"
    

    替换以下值:

    • POOL_ID:池的唯一 ID。
    • DISPLAY_NAME:池的名称。
    • DESCRIPTION:池的说明。授予对池身份的访问权限时,系统会显示此说明。
  2. 添加工作负载身份池提供商:

    AWS

    gcloud iam workload-identity-pools providers create-aws PROVIDER_ID \
      --location="global"  \
      --workload-identity-pool="POOL_ID" \
      --account-id="AWS_ACCOUNT_ID" \
      --attribute-mapping="MAPPINGS" \
      --attribute-condition="CONDITIONS"
    

    替换以下值:

    例如:

    gcloud iam workload-identity-pools providers create-aws example-provider \
      --location="global"  \
      --workload-identity-pool="pool-1" \
      --account-id="123456789000" \
      --attribute-mapping="google.subject=assertion.arn"
    

    Azure

    gcloud iam workload-identity-pools providers create-oidc PROVIDER_ID \
        --location="global" \
        --workload-identity-pool="POOL_ID" \
        --issuer-uri="https://sts.windows.net/TENANT_ID" \
        --allowed-audiences="APPLICATION_ID_URI" \
        --attribute-mapping="MAPPINGS" \
        --attribute-condition="CONDITIONS"
    

    替换以下值:

    例如:

    gcloud iam workload-identity-pools providers create-oidc example-provider \
        --location="global" \
        --workload-identity-pool="pool-1" \
        --issuer-uri="https://sts.windows.net/00000000-1111-2222-3333-444444444444" \
        --allowed-audiences="api://my-app" \
        --attribute-mapping="google.subject=assertion.sub,google.groups=assertion.groups"
    

    GitHub Actions

    gcloud iam workload-identity-pools providers create-oidc PROVIDER_ID \
        --location="global" \
        --workload-identity-pool="POOL_ID" \
        --issuer-uri="https://token.actions.githubusercontent.com/" \
        --attribute-mapping="MAPPINGS" \
        --attribute-condition="CONDITIONS"
    

    替换以下值:

    • PROVIDER_ID:提供商的唯一 ID。
    • POOL_ID:池的 ID。
    • OWNER:拥有代码库的用户或组织的名称。
    • REPOSITORY:代码库名称。
    • MAPPINGS您之前识别的特性映射的逗号分隔列表。
    • CONDITIONS您之前确定的特性条件。如果您没有特性条件,请移除该参数。

    OIDC

    gcloud iam workload-identity-pools providers create-oidc PROVIDER_ID \
        --location="global" \
        --workload-identity-pool="POOL_ID" \
        --issuer-uri="ISSUER" \
        --allowed-audiences="AUDIENCE" \
        --attribute-mapping="MAPPINGS" \
        --attribute-condition="CONDITIONS"
    

    替换以下值:

    • PROVIDER_ID:提供商的唯一 ID。
    • POOL_ID:池的 ID。
    • ISSUER:OIDC 元数据中定义的颁发者 URI。
    • AUDIENCE:ID 令牌的预期受众群体,对于许多提供商而言,受众群体与客户端 ID 匹配。
    • MAPPINGS您之前识别的特性映射的逗号分隔列表。
    • CONDITIONS您之前确定的特性条件。如果您没有特性条件,请移除该参数。

    OIDC (AD FS)

    gcloud iam workload-identity-pools providers create-oidc PROVIDER_ID \
        --location="global" \
        --workload-identity-pool="POOL_ID" \
        --issuer-uri="https://ADFS_DOMAIN/adfs" \
        --allowed-audiences="RELYING_PARTY_ID" \
        --attribute-mapping="MAPPINGS" \
        --attribute-condition="CONDITIONS"
    

    替换以下值:

    SAML

    gcloud iam workload-identity-pools providers create-saml PROVIDER_ID \
        --location="global" \
        --workload-identity-pool="POOL_ID" \
        --idp-metadata-path="IDP_METADATA_PATH" \
        --attribute-mapping="MAPPINGS" \
        --attribute-condition="CONDITIONS"
    

    替换以下值:

    例如:

    gcloud iam workload-identity-pools providers create-saml example-provider \
        --location="global" \
        --workload-identity-pool="pool-1" \
        --idp-metadata-path="/path/to/idp_metadata.xml" \
        --attribute-mapping="google.subject=assertion.subject,google.groups=assertion.attributes.groups"
    

    SAML (AD FS)

    curl -O https://DOMAIN/federationmetadata/2007-06/federationmetadata.xml
    
    gcloud iam workload-identity-pools providers create-saml PROVIDER_ID \
        --location="global" \
        --workload-identity-pool="POOL_ID" \
        --idp-metadata-path="federationmetadata.xml" \
        --attribute-mapping="MAPPINGS" \
        --attribute-condition="CONDITIONS"
    

    替换以下内容:

    例如:

    gcloud iam workload-identity-pools providers create-saml example-provider \
        --location="global" \
        --workload-identity-pool="pool-1" \
        --idp-metadata-path="federationmetadata.xml" \
        --attribute-mapping=google.subject=assertion.subject"
    

后续步骤