配置员工身份联合

本指南介绍如何通过支持 OIDCSAML 2.0 的身份提供方 (IdP) 配置员工身份联合。

如需查看特定于 IdP 的说明,请参阅以下内容:

准备工作

  1. 确保您已设置 Google Cloud 组织。
  2. 安装 Google Cloud CLI。 安装完成后,运行以下命令来初始化 Google Cloud CLI:

    gcloud init

    如果您使用的是外部身份提供方 (IdP),则必须先使用联合身份登录 gcloud CLI

  3. Enable the Identity and Access Management (IAM) and Resource Manager APIs.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

  4. 如需登录,您的 IdP 必须提供已签名的身份验证信息:OIDC IdP 必须提供 JWT,而 SAML IdP 响应必须经过签名。
  5. 如需接收有关贵组织或Google Cloud 产品的变更的重要信息,您必须提供必要的联系人。如需了解详情,请参阅员工身份联合概览

费用

员工身份联合是一项免费功能。不过,员工身份联合的详细审核日志记录使用 Cloud Logging。如需了解 Logging 价格,请参阅 Google Cloud Observability 价格

所需的角色

如需获得配置员工身份联合所需的权限,请让您的管理员为您授予组织的 Workforce Identity Pool Admin (roles/iam.workforcePoolAdmin) IAM 角色。如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限

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

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

配置员工身份联合

如需配置员工身份联合,您需要创建员工身份池员工身份池提供方

创建员工身份池

如需创建池,请执行以下命令:

gcloud

如需创建员工身份池,请运行以下命令:

gcloud iam workforce-pools create WORKFORCE_POOL_ID \
    --organization=ORGANIZATION_ID \
    --display-name="DISPLAY_NAME" \
    --description="DESCRIPTION" \
    --session-duration=SESSION_DURATION \
    --location=global

替换以下内容:

  • WORKFORCE_POOL_ID:您选择用于表示您的 Google Cloud 员工群组的 ID。如需了解如何设置 ID 的格式,请参阅 API 文档中的查询参数部分。
  • ORGANIZATION_ID:员工身份池所属 Google Cloud 组织的数字形式组织 ID。员工身份池可在组织中的所有项目和文件夹中使用。
  • DISPLAY_NAME:可选。您的员工身份池的显示名称。
  • DESCRIPTION:可选。员工身份池说明。
  • SESSION_DURATION:可选。会话时长,以在后面附加 s 的数字表示,例如 3600s。会话时长,用于确定来自此员工池的 Google Cloud 访问令牌、控制台(联合)登录会话和 gcloud CLI 登录会话的有效时长。会话时长默认为 1 小时(3600 秒)。会话时长值必须介于 15 分钟(900 秒)到 12 小时(43200 秒)之间。

控制台

如需创建员工身份池,请执行以下操作:

  1. 在 Google Cloud 控制台中,前往员工身份池页面:

    转到“员工身份池”

  2. 为员工身份池选择组织。员工身份池可在组织中的所有项目和文件夹中使用。

  3. 点击创建池,然后执行以下操作:

    1. 名称字段中,输入池的显示名称。池 ID 是根据您输入的名称自动派生的,并显示在名称字段下方。您可以点击池 ID 旁边的修改来更新池 ID。

    2. 可选:在说明中,输入池的说明。

    3. 如需创建员工身份池,请点击下一步

员工身份池的会话时长默认为 1 小时(3600 秒)。会话时长用于确定来自此员工池的 Google Cloud 访问令牌以及控制台(联合)和 gcloud CLI 登录会话的有效时长。创建池后,您可以更新池以设置自定义会话时长。会话时长必须介于 15 分钟(900 秒)到 12 小时(43200 秒)之间。

创建员工身份池提供方

本部分介绍如何创建员工身份池提供方,以便您的 IdP 用户能够访问 Google Cloud。您可以将提供方配置为使用 OIDC 或 SAML 协议。

创建 OIDC 员工池提供方

如需使用 OIDC 协议创建员工身份池提供方,请执行以下操作:

  1. 在您的 OIDC IdP 中,为 Google Cloud员工身份联合注册一个新应用。记下 IdP 提供的客户端 ID 和颁发者 URI。您在本文档中需要使用这些信息。

  2. 如果您打算设置用户对控制台的访问权限,请将以下重定向网址添加到 OIDC IdP:

    https://auth.cloud.google/signin-callback/locations/global/workforcePools/WORKFORCE_POOL_ID/providers/WORKFORCE_PROVIDER_ID
    

    替换以下内容:

    • WORKFORCE_POOL_ID:员工身份池 ID

    • WORKFORCE_PROVIDER_ID:您在本文档后面部分创建的员工身份池提供方的 ID。

    如需了解如何配置控制台(联合)登录,请参阅设置用户对控制台(联合)的访问权限

  3. 在 Google Cloud中,如需创建提供方,请执行以下操作:

    gcloud

    代码流

    如需创建使用授权代码流程进行 Web 登录的 OIDC 提供方,请运行以下命令:

    gcloud iam workforce-pools providers create-oidc WORKFORCE_PROVIDER_ID \
        --workforce-pool=WORKFORCE_POOL_ID \
        --display-name="DISPLAY_NAME" \
        --description="DESCRIPTION" \
        --issuer-uri="ISSUER_URI" \
        --client-id="OIDC_CLIENT_ID" \
    --client-secret-value="OIDC_CLIENT_SECRET" \ --web-sso-response-type="code" \ --web-sso-assertion-claims-behavior="merge-user-info-over-id-token-claims" \ --web-sso-additional-scopes="WEB_SSO_ADDITIONAL_SCOPES" \ --attribute-mapping="ATTRIBUTE_MAPPING" \ --attribute-condition="ATTRIBUTE_CONDITION" \ --jwk-json-path="JWK_JSON_PATH" \ --detailed-audit-logging \ --location=global

    请替换以下内容:

    • WORKFORCE_PROVIDER_ID:唯一的员工身份池提供方 ID。前缀 gcp- 已预留,因此不能在员工身份池或员工身份池提供方 ID 中使用。
    • WORKFORCE_POOL_ID:您的 IdP 所关联的员工身份池 ID。
    • DISPLAY_NAME:提供方的可选易记显示名;例如 idp-eu-employees
    • DESCRIPTION:可选的员工提供方说明;例如 IdP for Partner Example Organization employees
    • ISSUER_URI:OIDC 颁发者 URI,采用有效的 URI 格式且以 https 开头;例如 https://example.com/oidc。注意:出于安全原因,ISSUER_URI 必须使用 HTTPS 架构。
    • OIDC_CLIENT_ID:向 OIDC IdP 注册的 OIDC 客户端的 ID;该 ID 必须与您的 IdP 颁发的 JWT 的 aud 声明相匹配。
    • OIDC_CLIENT_SECRET:OIDC 客户端密钥。
    • WEB_SSO_ADDITIONAL_SCOPES:(可选)要发送到 OIDC IdP 以进行控制台(联合)或基于浏览器的 gcloud CLI 登录的额外范围。
    • ATTRIBUTE_MAPPING属性映射。以下是属性映射示例:
      google.subject=assertion.sub,
      google.groups=assertion.groups,
      attribute.costcenter=assertion.costcenter
      此示例会将 OIDC 断言中的 IdP 属性 subjectgroupscostcenter 分别映射到 google.subjectgoogle.groupsattribute.costcenter 属性。
    • ATTRIBUTE_CONDITION属性条件;例如 assertion.role == 'gcp-users'。本示例条件可确保仅具有 gcp-users 角色的用户才能使用此提供方登录。
    • JWK_JSON_PATH本地上传的 OIDC JWK 的可选路径。如果未提供此参数, Google Cloud 会改用您的 IdP 的 /.well-known/openid-configuration 路径来寻找包含公钥的 JWK。如需详细了解本地上传的 OIDC JWK,请参阅管理 OIDC JWK
    • 员工身份联合详细审核日志记录会将从 IdP 接收的信息记录到 Logging。详细的审核日志记录有助于排查员工身份池提供方配置的问题。如需了解如何通过详细审核日志记录来排查属性映射错误,请参阅一般属性映射错误。如需了解 Logging 价格,请参阅 Google Cloud Observability 价格

      如需为员工身份池提供方停用详细审核日志记录,请在运行 gcloud iam workforce-pools providers create 时省略 --detailed-audit-logging 标志。如需停用详细审核日志记录,您也可以更新提供方

    在命令响应中,POOL_RESOURCE_NAME 是池的名称;例如 locations/global/workforcePools/enterprise-example-organization-employees

    隐式流

    如需创建使用隐式流进行 Web 登录的 OIDC 提供方,请运行以下命令:

    gcloud iam workforce-pools providers create-oidc WORKFORCE_PROVIDER_ID \
        --workforce-pool=WORKFORCE_POOL_ID \
        --display-name="DISPLAY_NAME" \
        --description="DESCRIPTION" \
        --issuer-uri="ISSUER_URI" \
        --client-id="OIDC_CLIENT_ID" \
        --web-sso-response-type="id-token" \
        --web-sso-assertion-claims-behavior="only-id-token-claims" \
        --web-sso-additional-scopes="WEB_SSO_ADDITIONAL_SCOPES" \
        --attribute-mapping="ATTRIBUTE_MAPPING" \
        --attribute-condition="ATTRIBUTE_CONDITION" \
        --jwk-json-path="JWK_JSON_PATH" \
        --detailed-audit-logging \
        --location=global
    

    请替换以下内容:

    • WORKFORCE_PROVIDER_ID:唯一的员工身份池提供方 ID。前缀 gcp- 已预留,因此不能在员工身份池或员工身份池提供方 ID 中使用。
    • WORKFORCE_POOL_ID:您的 IdP 所关联的员工身份池 ID。
    • DISPLAY_NAME:提供方的可选易记显示名;例如 idp-eu-employees
    • DESCRIPTION:可选的员工提供方说明;例如 IdP for Partner Example Organization employees
    • ISSUER_URI:OIDC 颁发者 URI,采用有效的 URI 格式且以 https 开头;例如 https://example.com/oidc。注意:出于安全原因,ISSUER_URI 必须使用 HTTPS 架构。
    • OIDC_CLIENT_ID:向 OIDC IdP 注册的 OIDC 客户端的 ID;该 ID 必须与您的 IdP 颁发的 JWT 的 aud 声明相匹配。
    • WEB_SSO_ADDITIONAL_SCOPES:(可选)要发送到 OIDC IdP 以进行控制台(联合)或基于浏览器的 gcloud CLI 登录的额外范围。
    • ATTRIBUTE_MAPPING属性映射。以下是属性映射示例:
      google.subject=assertion.sub,
      google.groups=assertion.groups,
      attribute.costcenter=assertion.costcenter
      此示例会将 OIDC 断言中的 IdP 属性 subjectgroupscostcenter 分别映射到 google.subjectgoogle.groupsattribute.costcenter 属性。
    • ATTRIBUTE_CONDITION属性条件;例如 assertion.role == 'gcp-users'。本示例条件可确保仅具有 gcp-users 角色的用户才能使用此提供方登录。
    • JWK_JSON_PATH本地上传的 OIDC JWK 的可选路径。如果未提供此参数, Google Cloud 会改用您的 IdP 的 /.well-known/openid-configuration 路径来寻找包含公钥的 JWK。如需详细了解本地上传的 OIDC JWK,请参阅管理 OIDC JWK
    • 员工身份联合详细审核日志记录会将从 IdP 接收的信息记录到 Logging。详细的审核日志记录有助于排查员工身份池提供方配置的问题。如需了解如何通过详细审核日志记录来排查属性映射错误,请参阅一般属性映射错误。如需了解 Logging 价格,请参阅 Google Cloud Observability 价格

      如需为员工身份池提供方停用详细审核日志记录,请在运行 gcloud iam workforce-pools providers create 时省略 --detailed-audit-logging 标志。如需停用详细审核日志记录,您也可以更新提供方

    在命令响应中,POOL_RESOURCE_NAME 是池的名称;例如 locations/global/workforcePools/enterprise-example-organization-employees

    前缀 gcp- 已预留,因此不能在员工身份池或员工身份池提供方 ID 中使用。

    对于 OIDC 联合,您可以使用 assertion.NAME:一个字符串,该字符串等于 ID 令牌载荷中类似名称声明的值。

    控制台

    代码流

    在 Google Cloud 控制台中,如需创建使用授权代码流程的 OIDC 提供方,请执行以下操作:

    1. 在 Google Cloud 控制台中,前往员工身份池页面:

      进入“员工身份池”

    2. 员工身份池表中,选择要为其创建提供方的池。

    3. 提供方部分中,点击 添加提供方

    4. 选择提供方供应商列表中,选择您的 IdP。

      如果您的 IdP 未列出,请选择通用身份提供方

    5. 选择身份验证协议中,选择 OpenID Connect (OIDC)

    6. 创建提供方部分中,执行以下操作:

      1. 名称中,输入提供方的名称。
      2. 说明中,输入提供方的说明。
      3. 颁发者 (网址) 中,输入颁发者 URI。OIDC 颁发者 URI 必须采用有效的 URI 格式,并以 https 开头;例如 https://example.com/oidc
      4. 客户端 ID 中,输入注册到 OIDC IdP 的 OIDC 客户端 ID,该 ID 必须与 IdP 颁发的 JWT 的 aud 声明相匹配。
      5. 如需创建状态为已启用的提供方,请确保启用提供方处于开启状态。

      6. 点击继续
    7. 与 IdP 分享提供方信息部分,复制相应网址。 在您的 IdP 中,将此网址配置为重定向 URI,以便 IdP 知晓在您登录后应将断言令牌发送到何处。

    8. 点击继续

    9. 配置 OIDC Web 登录部分中,执行以下操作:

      1. 流程类型列表中,选择代码
      2. 断言声明行为列表中,选择以下任一选项:

        • 用户信息和 ID 令牌
        • 仅 ID 令牌
      3. 客户端密钥字段中,输入 IdP 提供的客户端密钥。

      4. 可选:如果您选择 Okta 作为 IdP,请在 OpenID、个人资料和邮箱之外的其他范围字段中添加任何额外的 OIDC 范围。

    10. 点击继续

    11. 配置提供方中,您可以配置属性映射和属性条件。如需创建属性映射,请执行以下操作。您可以提供 IdP 字段名称,也可以提供返回字符串的 CEL 格式表达式。

      1. 必需:在 OIDC 1 中,输入 IdP 中的主题,例如 assertion.sub

      2. 可选:如需添加其他属性映射,请执行以下操作:

        1. 点击添加映射
        2. Google n 中(其中 n 为数字),输入一个 Google Cloud支持的密钥
        3. 在相应的 OIDC n 字段中,以 CEL 格式输入要映射的 IdP 特定字段的名称。
      3. 如果您选择 Microsoft Entra ID 作为 IdP,则可以增加群组数量。

        1. 选择使用额外属性
        2. 额外属性颁发者 URI 字段中,输入颁发者网址。
        3. 额外属性客户端 ID 字段中,输入客户端 ID。
        4. 额外属性客户端密钥字段中,输入客户端密钥。
        5. 额外属性类型列表中,选择额外属性的属性类型。
        6. 额外属性过滤条件字段中,输入在查询 Microsoft Graph API 以获取群组时使用的过滤表达式。
      4. 如需创建属性条件,请执行以下操作:

        1. 点击添加条件
        2. 属性条件字段中,以 CEL 格式输入条件;例如 assertion.role == 'gcp-users'。本示例条件可确保仅具有 gcp-users 角色的用户才能使用此提供方登录。
      5. 如需启用详细审核日志记录,请在详细日志记录中点击启用属性值审核日志记录切换开关。

        员工身份联合详细审核日志记录会将从 IdP 接收的信息记录到 Logging。详细的审核日志记录有助于排查员工身份池提供方配置的问题。如需了解如何通过详细审核日志记录来排查属性映射错误,请参阅一般属性映射错误。如需了解 Logging 价格,请参阅 Google Cloud Observability 价格

        如需为员工身份池提供方停用详细审核日志记录,请在运行 gcloud iam workforce-pools providers create 时省略 --detailed-audit-logging 标志。如需停用详细审核日志记录,您也可以更新提供方

    12. 如需创建提供方,请点击提交

    隐式流

    在 Google Cloud 控制台中,如需创建使用隐式流的 OIDC 提供方,请执行以下操作:

    1. 在 Google Cloud 控制台中,前往员工身份池页面:

      进入“员工身份池”

    2. 员工身份池表中,选择要为其创建提供方的池。

    3. 提供方部分,点击 添加提供方

    4. 选择提供方供应商列表中,选择您的 IdP。

      如果您的 IdP 未列出,请选择通用身份提供方

    5. 选择身份验证协议中,选择 OpenID Connect (OIDC)

    6. 创建提供方部分中,执行以下操作:

      1. 名称中,输入提供方的名称。
      2. 说明中,输入提供方的说明。
      3. 颁发者 (网址) 中,输入颁发者 URI。OIDC 颁发者 URI 必须采用有效的 URI 格式,并以 https 开头;例如 https://example.com/oidc
      4. 客户端 ID 中,输入注册到 OIDC IdP 的 OIDC 客户端 ID,该 ID 必须与 IdP 颁发的 JWT 的 aud 声明相匹配。
      5. 如需创建状态为已启用的提供方,请确保启用提供方处于开启状态。
      6. 点击继续
    7. 与 IdP 分享提供方信息部分,复制相应网址。 在您的 IdP 中,将此网址配置为重定向 URI,以便 IdP 知晓在您登录后应将断言令牌发送到何处。

    8. 点击继续

    9. 配置 OIDC Web 登录部分中,执行以下操作:

      1. 流程类型列表中,选择 ID 令牌

      2. 断言声明行为列表中,ID 令牌处于选中状态。

      3. 可选:如果您选择 Okta 作为 IdP,请在 OpenID、个人资料和邮箱之外的其他范围字段中添加任何额外的 OIDC 范围。

    10. 点击继续

    11. 配置提供方中,您可以配置属性映射和属性条件。如需创建属性映射,请执行以下操作。您可以提供 IdP 字段名称,也可以提供返回字符串的 CEL 格式表达式。

      1. 必需:在 OIDC 1 中,输入 IdP 中的主题;例如 assertion.sub

      2. 可选:如需添加其他属性映射,请执行以下操作:

        1. 点击添加映射
        2. Google n 中(其中 n 为数字),输入一个 Google Cloud支持的密钥
        3. 在相应的 OIDC n 字段中,以 CEL 格式输入要映射的 IdP 特定字段的名称。
      3. 如果您选择 Microsoft Entra ID 作为 IdP,则可以增加群组数量。

        1. 选择使用额外属性
        2. 额外属性颁发者 URI 字段中,输入颁发者网址。
        3. 额外属性客户端 ID 字段中,输入客户端 ID。
        4. 额外属性客户端密钥字段中,输入客户端密钥。
        5. 额外属性类型列表中,选择额外属性的属性类型。
        6. 额外属性过滤条件字段中,输入在查询 Microsoft Graph API 以获取群组时使用的过滤表达式。
      4. 如需创建属性条件,请执行以下操作:

        1. 点击添加条件
        2. 属性条件字段中,以 CEL 格式输入条件;例如 assertion.role == 'gcp-users'。本示例条件可确保仅具有 gcp-users 角色的用户才能使用此提供方登录。
      5. 如需启用详细审核日志记录,请在详细日志记录中点击启用属性值审核日志记录切换开关。

        员工身份联合详细审核日志记录会将从 IdP 接收的信息记录到 Logging。详细的审核日志记录有助于排查员工身份池提供方配置的问题。如需了解如何通过详细审核日志记录来排查属性映射错误,请参阅一般属性映射错误。如需了解 Logging 价格,请参阅 Google Cloud Observability 价格

        如需为员工身份池提供方停用详细审核日志记录,请在运行 gcloud iam workforce-pools providers create 时省略 --detailed-audit-logging 标志。如需停用详细审核日志记录,您还可以更新提供方

    12. 如需创建提供方,请点击提交

创建 SAML 员工池提供方

  1. 在您的 SAML IdP 中,为 Google Cloud员工身份联合注册一个新应用。

  2. 设置 SAML 断言的目标对象。它通常是 IdP 配置中的 SP Entity ID 字段。您必须将其设置为以下网址:

    https://iam.googleapis.com/locations/global/workforcePools/WORKFORCE_POOL_ID/providers/WORKFORCE_PROVIDER_ID
    
  3. 设置重定向网址,也称为断言使用方服务 (ACS) 网址。如需设置重定向网址,请在 SAML IdP 中找到重定向网址字段,然后执行以下操作之一:

    • 如需通过 Google Cloud 控制台或其他基于浏览器的登录方法来设置基于浏览器的登录,请输入以下网址:

      https://auth.cloud.google/signin-callback/locations/global/workforcePools/WORKFORCE_POOL_ID/providers/WORKFORCE_PROVIDER_ID
      

      替换以下内容:

      • WORKFORCE_POOL_ID:员工身份池 ID

      • WORKFORCE_PROVIDER_ID:您在本文档后面部分创建的员工身份池提供方的 ID。

    • 如需通过 IdP 设置程序化登录,请输入以下网址:

      localhost
      

    如需详细了解如何配置控制台登录,请参阅设置用户对控制台的访问权限

  4. 在 Google Cloud中,使用 IdP 的 SAML 元数据文档创建 SAML 员工身份池提供方。您可以从 IdP 下载 SAML 元数据 XML 文档。该文档必须至少包含以下内容:

    • 您的 IdP 的 SAML 实体 ID。
    • 您的 IdP 的单点登录网址。
    • 至少一个签名公钥。 如需详细了解签名密钥,请参阅本指南后面部分的密钥要求

gcloud

如需使用 gcloud CLI 配置 SAML 提供方,请执行以下操作:

  gcloud iam workforce-pools providers create-saml WORKFORCE_PROVIDER_ID \
      --workforce-pool=WORKFORCE_POOL_ID \
      --display-name="DISPLAY_NAME" \
      --description="DESCRIPTION" \
      --idp-metadata-path=METADATA_FILE_PATH \
      --attribute-mapping="ATTRIBUTE_MAPPING" \
      --attribute-condition="ATTRIBUTE_CONDITION" \
      --location=global

替换以下内容:

  • WORKFORCE_PROVIDER_ID:员工身份池提供方 ID。
  • WORKFORCE_POOL_ID:员工身份池 ID。
  • DISPLAY_NAME:提供方的显示名;例如 idp-eu-employees
  • DESCRIPTION:员工身份池提供方的说明;例如 IdP for Partner Example Organization EU employees
  • METADATA_FILE_PATH:SAML 元数据文件的路径。
  • ATTRIBUTE_MAPPING属性映射,例如:

    google.subject=assertion.subject,
    google.groups=assertion.attributes['https://example.com/aliases'],
    attribute.costcenter=assertion.attributes.costcenter[0]
    此示例会将 IdP 属性 assertion.subjectassertion.attributes['https://example.com/aliases']assertion.attributes.costcenter[0] 分别映射到 Google Cloud属性 google.subjectgoogle.groupsgoogle.costcenter

  • ATTRIBUTE_CONDITION属性条件。例如,要将 ipaddr 属性限制为特定 IP 范围,您可以设置条件 assertion.attributes.ipaddr.startsWith('98.11.12.')。此示例条件可确保只有 IP 地址以 98.11.12. 开头的用户才能使用此员工提供方登录。

提供方可能需要几分钟才能开始接受请求。

对于 SAML 联合,您可以在属性映射和条件中使用以下关键字:

  • assertion.subject:一个字符串,等于 SAML 断言中的 NameID 属性。
  • assertion.attributes.NAME:一个字符串列表,等于 SAML 断言中类似名称属性的值。

可选:接受来自 IdP 的加密 SAML 断言

如需让您的 SAML 2.0 IdP 能够生成员工身份联合可接受的加密 SAML 断言,请执行以下操作:

  • 在员工身份联合中,执行以下操作:
    • 为您的员工身份池提供方创建非对称密钥对。
    • 下载包含公钥的证书文件。
    • 配置您的 SAML IdP,以使用公钥加密颁发的 SAML 断言。
  • 在 IdP 中,执行以下操作:
    • 启用断言加密(也称为令牌加密)。
    • 上传您在员工身份联合中创建的公钥。
    • 确认您的 IdP 生成加密的 SAML 断言。
请注意,即使配置了 SAML 加密提供方密钥,员工身份联合仍然可以处理明文断言。

创建员工身份联合 SAML 断言加密密钥

本部分将指导您创建非对称密钥对,使员工身份联合能够接受加密的 SAML 断言。

Google Cloud 使用私钥来解密 IdP 发出的 SAML 断言。如需创建用于 SAML 加密的非对称密钥对,请运行以下命令。如需了解详情,请参阅支持的 SAML 加密算法

gcloud iam workforce-pools providers keys create KEY_ID \
    --workforce-pool WORKFORCE_POOL_ID \
    --provider WORKFORCE_PROVIDER_ID \
    --location global \
    --use encryption \
    --spec KEY_SPECIFICATION

请替换以下内容:

  • KEY_ID:您选择的键名称
  • WORKFORCE_POOL_ID:池 ID
  • WORKFORCE_PROVIDER_ID:员工身份池提供方 ID
  • KEY_SPECIFICATION:密钥规范,可以是 rsa-2048rsa-3072rsa-4096 之一。

创建密钥对后,如需将公钥下载到证书文件中,请执行以下命令。只有员工身份联合可以访问私钥。

gcloud iam workforce-pools providers keys describe KEY_ID \
    --workforce-pool WORKFORCE_POOL_ID \
    --provider WORKFORCE_PROVIDER_ID \
    --location global \
    --format "value(keyData.key)" \
    > CERTIFICATE_PATH

替换以下内容:

  • KEY_ID:密钥名称
  • WORKFORCE_POOL_ID:池 ID
  • WORKFORCE_PROVIDER_ID:员工身份池提供方 ID
  • CERTIFICATE_PATH:要将证书写入的路径,例如 saml-certificate.cersaml-certificate.pem

配置符合 SAML 2.0 标准的 IdP,以发出加密的 SAML 断言

配置您的 SAML IdP,以使用上一步中下载的公共证书来加密颁发的 SAML 断言。如需了解具体说明,请咨询您的 IdP 团队。

将 IdP 配置为加密 SAML 断言后,我们建议您检查以确保其生成的断言确实已加密。即使配置了 SAML 断言加密,员工身份联合仍然可以处理明文断言。

删除员工身份联合加密密钥

如需删除 SAML 加密密钥,请运行以下命令:
  gcloud iam workforce-pools providers keys delete KEY_ID \
      --workforce-pool WORKFORCE_POOL_ID \
      --provider WORKFORCE_PROVIDER_ID \
      --location global

请替换以下内容:

  • KEY_ID:密钥名称
  • WORKFORCE_POOL_ID:池 ID
  • WORKFORCE_PROVIDER_ID:员工身份池提供方 ID

支持的 SAML 加密算法

员工身份联合支持以下密钥传输算法:

员工身份联合支持以下块加密算法:

SAML X.509 签名密钥要求

以下密钥规范适用于 SAML X.509 签名密钥:

  • 封装在 X.509 v3 证书中的 RSA 公钥。

  • 证书有效性要求:

    • notBefore:不超过未来 7 天的时间戳
    • notAfter:不超过未来 25 年的时间戳
  • 推荐的算法:

在给定时间,员工身份池提供方最多可以同时配置 3 个签名密钥。如果存在多个密钥, Google Cloud会遍历这些密钥,并尝试使用每个未过期的密钥来履行令牌交换请求。

出于安全方面的考虑,我们强烈建议您不要在其他服务中重复使用相同的密钥对。

密钥管理

如需更新 IdP 的签名密钥,请执行以下操作:

  1. 创建新的非对称密钥对,并使用密钥对配置 SAML 身份提供方。您需要首先将其标记为无效,然后在后续步骤中将其激活。

  2. 从 IdP 下载 SAML 元数据 XML 文档。

  3. 使用 SAML 元数据文档更新员工身份池提供方资源。如果存在多个密钥, Google Cloud 会遍历每个未过期的密钥,并尝试使用每个密钥来履行令牌交换请求。

    如需使用 SAML 元数据更新员工身份池提供方,请执行以下命令。

    gcloud iam workforce-pools providers update-saml WORKFORCE_PROVIDER_ID \
        --workforce-pool=WORKFORCE_POOL_ID \
        --idp-metadata-path=SAML_METADATA_FILE_PATH \
        --location=global
    

    替换以下内容:

    • WORKFORCE_PROVIDER_ID:员工身份池提供方 ID
    • WORKFORCE_POOL_ID:员工身份池 ID
    • SAML_METADATA_FILE_PATH:SAML 元数据文件的路径
  4. 等待上一步返回的操作完成(该操作标记为已完成),然后在 SAML IdP 中激活新的签名密钥。旧签名密钥会被标记为无效。您的 IdP 发出的断言会使用新密钥进行签名。

以下步骤不是强制性的,但我们建议您最好执行这些步骤:

  1. 从 IdP 中删除现已失效的旧签名密钥。
  2. 从 IdP 下载 SAML 元数据 XML 文档。
  3. 使用 SAML 元数据文档更新员工身份池提供方资源。 Google Cloud 会拒绝使用过期签名密钥签名的断言。如需更新文档,请执行以下命令:

    gcloud iam workforce-pools providers update-saml WORKFORCE_PROVIDER_ID \
        --workforce-pool=WORKFORCE_POOL_ID \
        --idp-metadata-path=SAML_METADATA_FILE_PATH \
        --location=global
    

    替换以下内容:

    • WORKFORCE_PROVIDER_ID:员工身份池提供方 ID
    • WORKFORCE_POOL_ID:员工身份池 ID
    • SAML_METADATA_FILE_PATH:SAML 元数据路径

密钥删除限制条件

Google Cloud 会拒绝使用已删除密钥签名的断言。

控制台

如需使用 Google Cloud 控制台配置 SAML 提供方,请执行以下操作:

  1. 在 Google Cloud 控制台中,前往员工身份池页面:

    转到“员工身份池”

  2. 员工身份池表中,选择要为其创建提供方的池。

  3. 提供方部分,点击添加提供方

  4. 选择提供方供应商列表中,选择您的 IdP。

    如果您的 IdP 未列出,请选择通用身份提供方

  5. 选择身份验证协议中,选择 SAML

  6. 创建提供方部分中,执行以下操作:

    1. 名称中,输入提供方的名称。

    2. 可选:在说明中,输入提供方的说明。

    3. IDP 元数据文件 (XML) 中,选择您在本指南前面部分生成的元数据 XML 文件。

    4. 如需创建状态为已启用的提供方,请确保启用提供方处于开启状态。

    5. 点击继续

  7. 分享提供方信息部分,复制网址。 在您的 IdP 中,将第一个网址配置为实体 ID,用于向 IdP 标识您的应用。 将另一个网址配置为重定向 URI,以便告知您的 IdP 在用户登录后应将断言令牌发送到何处。

  8. 点击继续

  9. 配置提供方部分,执行以下操作:

    1. 属性映射中,输入 google.subject 的 CEL 表达式。

    2. 可选:如需输入其他映射,请点击添加映射,然后输入其他映射,例如:

      google.subject=assertion.subject,
      google.groups=assertion.attributes['https://example.com/aliases'],
      attribute.costcenter=assertion.attributes.costcenter[0]
      此示例会将 IdP 属性 assertion.subjectassertion.attributes['https://example.com/aliases']assertion.attributes.costcenter[0] 分别映射到 Google Cloud属性 google.subjectgoogle.groupsgoogle.costcenter

    3. 如果您选择 Microsoft Entra ID 作为 IdP,则可以通过执行以下操作来增加群组数量:

      1. 选择使用额外属性
      2. 额外属性颁发者 URI 字段中,输入颁发者网址。
      3. 额外属性客户端 ID 字段中,输入客户端 ID。
      4. 额外属性客户端密钥字段中,输入客户端密钥。
      5. 额外属性类型列表中,选择额外属性的属性类型。
      6. 额外属性过滤条件字段中,输入在查询 Microsoft Graph API 以获取群组时使用的过滤表达式。
    4. 可选:如需添加属性条件,请点击添加条件,然后输入表示属性条件的 CEL 表达式。 例如,要将 ipaddr 属性限制为特定 IP 范围,您可以设置条件 assertion.attributes.ipaddr.startsWith('98.11.12.')。此示例条件可确保只有 IP 地址以 98.11.12. 开头的用户才能使用此员工提供方登录。

    5. 点击继续

    6. 如需启用详细审核日志记录,请在详细日志记录中点击启用属性值审核日志记录切换开关。

      员工身份联合详细审核日志记录会将从 IdP 接收的信息记录到 Logging。详细的审核日志记录有助于排查员工身份池提供方配置的问题。如需了解如何通过详细审核日志记录来排查属性映射错误,请参阅一般属性映射错误。如需了解 Logging 价格,请参阅 Google Cloud Observability 价格

      如需为员工身份池提供方停用详细审核日志记录,请在运行 gcloud iam workforce-pools providers create 时省略 --detailed-audit-logging 标志。如需停用详细审核日志记录,您也可以更新提供方

  10. 如需创建提供方,请点击提交

IAM 政策的员工主账号标识符

下表显示了可用于向单个用户和用户群组授予角色的主账号标识符。

身份 标识符格式
员工身份池中的单个身份 principal://iam.googleapis.com/locations/global/workforcePools/POOL_ID/subject/SUBJECT_ATTRIBUTE_VALUE
群组中的所有员工身份 principalSet://iam.googleapis.com/locations/global/workforcePools/POOL_ID/group/GROUP_ID
具有特定属性值的所有员工身份 principalSet://iam.googleapis.com/locations/global/workforcePools/POOL_ID/attribute.ATTRIBUTE_NAME/ATTRIBUTE_VALUE
员工身份池中的所有身份 principalSet://iam.googleapis.com/locations/global/workforcePools/POOL_ID/*

如需查看主账号标识符的完整列表,请参阅主账号标识符

向主账号授予 IAM 角色

您可以为主账号(例如单个身份、身份群组或整个池)授予角色。

如需向主账号授予项目角色,请执行以下命令:

gcloud projects add-iam-policy-binding PROJECT_ID \
    --role="ROLE" \
    --member="PRINCIPAL"

请替换以下内容:

  • PROJECT_ID:项目 ID
  • ROLE:要授予的角色
  • PRINCIPAL:主账号;请参阅员工身份联合的主账号标识符

在以下示例中,该命令会将 Storage Admin 角色 (roles/storage.admin) 授予 GROUP_ID 群组中的所有身份:

gcloud projects add-iam-policy-binding my-project \
    --role="roles/storage.admin" \
    --member="principalSet://iam.googleapis.com/locations/global/workforcePools/WORKFORCE_POOL_ID/group/GROUP_ID"

如需详细了解主账号格式,请参阅员工身份联合的主账号标识符

删除用户

员工身份联合为联合用户身份创建用户元数据和资源。如果您选择在 IdP 中删除用户,则还必须在 Google Cloud中明确删除这些资源。为此,请参阅删除员工身份联合用户及其数据

您可能会看到资源仍与已删除的用户关联。这是因为删除用户元数据和资源需要长时间运行的操作。在您启动用户身份删除后,用户在删除操作之前启动的进程可以继续运行,直到这些进程完成或取消。

配置 SCIM

本部分介绍如何在员工身份池中配置 SCIM 租户。

每个员工身份池仅支持一个 SCIM 租户。如需在已有一个 SCIM 租户的身份池中配置新的 SCIM 租户,您必须先硬删除现有租户

SCIM 租户的 --claim-mapping 标志只能包含特定的通用表达式语言 (CEL) 表达式。如需了解支持哪些表达式,请参阅映射令牌和 SCIM 属性

如需配置跨网域身份管理系统(SCIM),您必须执行以下操作:

在 Google Cloud中配置 SCIM 租户和令牌

如需在 Google Cloud中配置 SCIM 租户,请执行以下操作:

  1. 创建 SCIM 租户。

        gcloud iam workforce-pools providers scim-tenants create SCIM_TENANT_ID \
            --workforce-pool="WORKFORCE_POOL_ID" \
            --provider="PROVIDER_ID" \
            --display-name="SCIM_TENANT_DISPLAY_NAME" \
            --description="SCIM_TENANT_DESCRIPTION" \
            --claim-mapping="CLAIM_MAPPING" \
            --location="global"
        

    请替换以下内容:

    • SCIM_TENANT_ID:SCIM 租户的 ID。
    • WORKFORCE_POOL_ID:您在本文档前面部分创建的员工池的 ID。
    • PROVIDER_ID:您在本文档前面部分创建的员工身份池提供方的 ID。
    • SCIM_TENANT_DISPLAY_NAME:SCIM 租户的显示名称。
    • SCIM_TENANT_DESCRIPTION:SCIM 租户的说明。
    • CLAIM_MAPPING:以英文逗号分隔的属性映射列表。我们建议您使用以下属性映射:
      google.subject=user.externalId,google.group=group.externalId
      您在 SCIM 租户中映射的 google.subject 属性必须使用 --attribute-mapping 标志唯一引用在员工身份池提供方的 google.subject 属性中映射的相同身份。 创建 SCIM 租户后,您将无法更新声明映射。如需替换,您可以硬删除 SCIM 租户,然后立即创建一个新的租户。如需详细了解使用 SCIM 的注意事项,请参阅 SCIM 支持
  2. 命令完成后,执行以下操作:

    1. 在输出的 baseUri 字段中,保存整个 URI,其格式为 https://iamscim.googleapis.com/v1alpha1/tenants/SCIM_TENANT_UID。您需要向 IdP 提供此 URI。
    2. 此外,从 URI 中,仅保存 SCIM_TENANT_UID。 您需要在本文档后面部分使用此 UID 设置相应 SCIM 租户的 IAM 政策。
  3. 创建 SCIM 令牌:

        gcloud iam workforce-pools providers scim-tenants tokens create SCIM_TOKEN_ID \
            --display-name DISPLAY_NAME \
            --scim-tenant SCIM_TENANT_ID \
            --workforce-pool WORKFORCE_POOL_ID \
            --provider PROVIDER_ID \
            --location global
        

    请替换以下内容:

    • SCIM_TOKEN_ID:SCIM 令牌的 ID
    • DISPLAY_NAME:SCIM 令牌的显示名称
    • WORKFORCE_POOL_ID:员工池的 ID
    • SCIM_TENANT_ID:SCIM 租户的 ID
    • PROVIDER_ID:员工身份池提供方的 ID
  4. gcloud iam workforce-pools providers scim-tenants tokens create 命令完成后,执行以下操作:

    1. 在输出中,保存 securityToken 字段中 SCIM_TOKEN 的值。您需要向 IdP 提供此安全令牌。安全令牌仅在此输出中显示,如果丢失,您必须创建新的 SCIM 令牌。
    2. 如需检查 SCIM_TOKEN 是否因组织政策而被拒绝,请运行以下命令:
      curl -v -H "Authorization: Bearer SCIM_TOKEN"  https://iamscim.googleapis.com/v1alpha1/tenants/SCIM_TENANT_UID/Users
      如果该命令因权限相关错误而失败,请运行 gcloud organizations add-iam-policy-binding,如后续步骤中所述。如果该命令成功执行,则可以跳过该步骤。
  5. 为 SCIM 租户和令牌设置 IAM 政策。如果上一步中的 curl 命令因权限相关错误而失败,则必须运行以下命令:

        gcloud organizations add-iam-policy-binding ORGANIZATION_ID \
            --member=serviceAccount:SERVICE_AGENT_EMAIL \
            --role roles/iam.scimSyncer
        

    请替换以下内容:

    • ORGANIZATION_ID:组织的 ID。
    • SERVICE_AGENT_EMAIL:服务代理的邮箱。该邮箱的格式如下:o-ORGANIZATION_ID-SCIM_TENANT_UID@gcp-sa-iamscim.iam.gserviceaccount.com。创建 SCIM 租户时,系统会返回 SCIM_TENANT_UID

在 IdP 中配置群组时,确保每个群组的显示名称(在 displayName 字段中提供)在 SCIM 租户中都是唯一的。如需详细了解 Microsoft Entra ID 中的群组和 SCIM,请参阅群组

在 OIDC 或 SAML IdP 中配置 SCIM

在 IdP 中,按照 IdP 文档中的说明配置 SCIM。使用在上一步中获得的 SCIM 网址和 SCIM 令牌。

更新提供方以启用 SCIM

如需为提供方启用 SCIM,请执行以下操作:

OIDC

      gcloud iam workforce-pools providers update-oidc PROVIDER_ID \
          --workforce-pool=WORKFORCE_POOL_ID \
          --location=LOCATION \
          --scim-usage=enabled-for-groups
    

请替换以下内容:

  • PROVIDER_ID:员工身份池提供方的 ID
  • WORKFORCE_POOL_ID:员工池的 ID
  • LOCATION:员工池的位置

SAML

      gcloud iam workforce-pools providers update-saml PROVIDER_ID \
          --workforce-pool=WORKFORCE_POOL_ID \
          --location=LOCATION \
          --scim-usage=enabled-for-groups
    

请替换以下内容:

  • PROVIDER_ID:员工身份池提供方的 ID
  • WORKFORCE_POOL_ID:员工池的 ID
  • LOCATION:员工池的位置

映射令牌和 SCIM 属性

您必须在员工身份池提供方和为该提供方配置的 SCIM 租户中保持特性映射的一致性。对于员工身份池提供方,您可以使用 --attribute-mapping 标志;对于 SCIM 租户,您可以使用 --claim-mapping 标志。映射到用户的 google.subject 的 IdP 属性必须唯一地引用同一身份,无论是在令牌中还是在 SCIM 映射中定义。如需详细了解在使用 SCIM 时如何映射属性,请参阅 SCIM 支持部分。 下表显示了如何映射令牌声明中的属性和 SCIM 属性:

Google 属性 员工身份池提供方映射 SCIM 租户映射
google.subject assertion.oid user.externalId
google.subject assertion.email user.emails[0].value
google.subject assertion.email.lowerAscii() user.emails[0].value.lowerAscii()
google.subject assertion.preferred_username user.userName
google.group 请务必向提供方更新 --scim-usage=enabled-for-groups N/A group.externalId

强制删除 SCIM 租户

如需强制删除 SCIM 租户,请执行以下操作:

  gcloud iam workforce-pools providers scim-tenants delete SCIM_TENANT_ID \
      --workforce-pool=WORKFORCE_POOL_ID \
      --provider=PROVIDER_ID \
      --hard-delete \
      --location=global

请替换以下内容:

  • SCIM_TENANT_ID:要删除的 SCIM 租户的 ID
  • WORKFORCE_POOL_ID:员工池的 ID
  • PROVIDER_ID:员工身份池提供方的 ID
如需详细了解 SCIM(包括删除 SCIM 租户),请参阅 SCIM 支持

后续步骤