使用 Okta 配置员工身份联合并让用户登录

本指南介绍如何使用 Okta 作为身份提供方 (IdP) 来配置员工身份联合、管理访问权限以及让用户访问支持员工身份联合的 Google Cloud 服务。

准备工作

  1. 您必须设置一个 Google Cloud 组织。

  2. Install the Google Cloud CLI, then initialize it by running the following command:

    gcloud init

  3. 如需登录,您的 IdP 必须提供已签名的身份验证信息:OIDC IdP 必须提供 JWT,而 SAML IdP 响应必须经过签名。

  4. 如需接收有关贵组织或 Google Cloud 产品的变更的重要信息,您必须提供必要的联系人。如需了解详情,请参阅员工身份联合概览

所需的角色

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

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

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

创建员工身份池

控制台

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

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

    转到“员工身份池”

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

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

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

    3. 默认情况下已设置会话时长。如需输入自定义会话时长,请点击修改。会话时长,用于确定来自此员工池的 Google Cloud 访问令牌、控制台(联合)登录会话和 gcloud CLI 登录会话的有效时长。时长必须大于 15 分钟(900 秒)且小于 12 小时(43200 秒)。如果未设置会话时长,则默认为 1 小时(3600 秒)。

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

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

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:可选。会话时长,用于确定来自此员工池的 Google Cloud 访问令牌、控制台(联合)登录会话和 gcloud CLI 登录会话的有效时长。时长必须大于 15 分钟(900 秒)且小于 12 小时(43200 秒)。如果未设置会话时长,则默认为 1 小时(3600 秒)。

创建 Okta 应用集成

本部分介绍了使用 Okta 管理控制台创建 Okta 应用集成的步骤。如需了解详情,请参阅创建自定义应用集成

员工池支持使用 OIDC 和 SAML 协议进行联合。

如需了解详情,请参阅 Okta 的 OIDCSAML 集成指南。本部分介绍了基本配置。

OIDC

如需创建使用 OIDC 协议的 Okta 应用集成,请执行以下步骤:

  1. 登录 Okta 管理控制台。
  2. 转到应用 > 应用
  3. 如需开始配置应用集成,请执行以下操作:

    1. 点击创建应用集成
    2. 登录方法中,选择 OIDC - OpenID Connect
    3. 应用类型中,选择应用类型;例如 Web 应用
    4. 如需创建应用,请点击下一步
    5. 应用集成名称中,输入应用的名称。
    6. 授权类型部分中,选中隐式(混合)复选框。
    7. 登录重定向 URI 部分的文本字段中,输入重定向网址。用户成功登录后,系统会将用户重定向到此网址。如果您要配置对控制台(联合)的访问权限,请使用以下网址格式:

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

      请替换以下内容:

      • WORKFORCE_POOL_ID:您在本指南前面部分创建的员工池的 ID。
      • WORKFORCE_PROVIDER_ID:您选择的员工身份提供方 ID,例如:okta-oidc-provider。如需了解如何设置 ID 的格式,请参阅 API 文档中的查询参数部分。
    8. 选中Skip group assignment for now(暂时跳过群组分配)复选框。

    9. 如需保存应用集成,请点击保存

  4. 将应用集成分配给用户

  5. 可选:如需为 Okta 用户个人资料添加自定义属性,请执行以下操作:

    1. 数据类型中,选择 string
    2. 显示名称中,输入 Department
    3. 变量名称中,输入 department
    4. 如需保存映射,请点击保存

    如需详细了解如何添加自定义特性,请参阅向 Okta 用户个人资料添加自定义特性

  6. 可选:如需为 OIDC 令牌中发送的属性创建映射,请在目录中点击配置文件编辑器,然后执行以下操作:

    1. 找到您在本指南前面部分创建的 OIDC 应用。
    2. 点击映射
    3. 选择 Okta 用户到应用标签页。
    4. Okta 用户用户个人资料 标签页的一个可用组合框中,输入 department。Okta 会自动补全到 user.department
    5. 如需保存映射,请点击保存映射。如需了解详情,请参阅添加属性映射

    如需详细了解映射,请参阅在配置文件编辑器中将 Okta 特性映射到应用特性

  7. 可选:如需配置群组声明,请执行以下操作:

    1. 如果您使用组织授权服务器,请执行以下操作:
      1. 转到应用 > 应用
      2. 选择您在本部分前面创建的 OpenID Connect 客户端应用。
      3. 转到登录标签页
      4. OpenID Connect ID 令牌部分中,点击修改
      5. 群组声明类型部分中,您可以选择以下任一选项:
        • 选择表达式
        • 选择匹配正则表达式,然后输入 .*
      6. 如需保存群组声明,请点击保存
      7. 在本指南的后面部分中创建员工身份池提供方时,请添加 groups 作为从 Okta 请求群组声明以进行 Web 单点登录的额外范围。只有在您使用控制台(联合)或基于浏览器的 gcloud CLI 登录流程时,才需要执行此步骤。
    2. 如果您使用自定义授权服务器,请执行以下操作:
      1. 在管理控制台中,从安全性菜单中选择 API
      2. 选择要配置的自定义授权服务器。
      3. 转到版权主张标签页,然后点击添加版权主张
      4. 输入版权主张的名称。在此示例中,将其命名为 groups
      5. 在声明的包括在令牌类型中部分,选择 ID 令牌,然后选择始终
      6. 选择群组作为值类型
      7. 在“过滤条件”下拉框中,选择匹配正则表达式,然后在“值”中输入以下表达式:.*
      8. 点击创建

如需详细了解群组声明,请参阅添加群组声明

SAML

如需创建使用 SAML 协议的 Okta 应用集成,请执行以下步骤:

  1. 登录 Okta 管理控制台。
  2. 转到应用 > 应用
  3. 点击创建应用集成
  4. 登录方法中,选择 SAML 2.0,然后点击下一步
  5. 输入应用的名称,然后点击下一步以继续配置 SAML 选项。
  6. 单点登录网址中,输入重定向网址。这是用户成功登录后将被重定向到的网址。如果您要配置对控制台的访问权限,请使用以下网址格式。

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

  7. 输入目标对象 URI (SP Entity ID);该 ID 的格式如下:

    https://iam.googleapis.com/locations/global/workforcePools/WORKFORCE_POOL_ID/providers/WORKFORCE_PROVIDER_ID

    请替换以下内容:

    • WORKFORCE_POOL_ID:您在本指南前面部分创建的员工池的 ID。
    • WORKFORCE_PROVIDER_ID:您选择的员工身份提供方 ID,例如:okta-saml-provider

    如需了解如何设置 ID 的格式,请参阅 API 文档中的查询参数部分。

  8. 可选:使用特性语句指定要在 SAML 断言中发送的任何自定义特性。设置完成后,您可以在 Google Cloud 中使用这些特性来创建访问权限管理政策,也可以在 attribute_condition 中使用这些特性;例如,在本指南中,您可以按如下方式映射部门:

    名称
    department user.department

    可选:如需添加本指南后面会用到的群组声明,请参阅如何在 SAML 断言中传递用户的群组成员资格

  9. 完成 Okta 应用集成的创建。

创建员工身份池提供方

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

创建 OIDC 员工池提供方

如需使用 OIDC 协议为您的 Okta 应用集成创建员工身份池提供方,请执行以下操作:

  1. 如需获取 Okta 应用集成的客户端 ID,请执行以下操作:

    1. 打开 Okta 应用集成。
    2. 点击常规标签页。
    3. 复制客户端 ID 字段中的内容。
  2. 如需创建 OIDC 员工身份池提供方以基于网络进行登录,请执行以下操作:

    控制台

    代码流

    1. 在 Okta 中,执行以下操作:

      1. 客户端身份验证中,选择客户端密钥

      2. 客户端密文表中,找到密钥,然后点击 复制

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

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

        进入“员工身份池”

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

      3. 提供方表中,点击添加提供方

      4. 选择协议中,选择 OpenID Connect (OIDC)

      5. 创建池提供方中,执行以下操作:

        1. 名称中,输入提供方的名称。
        2. 颁发者 (网址) 中,输入颁发者 URI。OIDC 颁发者 URI 必须采用有效的 URI 格式,并以 https 开头;例如 https://example.com/oidc
        3. 输入客户端 ID,即注册到 OIDC IdP 的 OIDC 客户端 ID,该 ID 必须与 IdP 颁发的 JWT 的 aud 声明相匹配。
        4. 如需创建状态为已启用的提供方,请确保已启用提供方处于开启状态。
        5. 点击继续
      6. 响应类型中,执行以下操作。响应类型仅用于基于网络的单点登录流程。

        1. 响应类型中,选择代码
        2. 客户端密钥中,输入 IdP 提供的客户端密钥。
        3. 断言声明行为中,选择以下任一选项:

          • 用户信息和 ID 令牌
          • 仅 ID 令牌
        4. 点击继续

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

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

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

          1. 点击添加映射
          2. Google n(其中 n 为数字)中,输入一个 Google Cloud 支持的密钥
          3. 在相应的 OIDC n 字段中,以 CEL 格式输入要映射的 IdP 特定字段的名称。
        3. 如需创建属性条件,请执行以下操作:

          如果您的多租户 IdP 具有单个颁发者 URI,您必须使用属性条件来确保仅允许正确的租户访问。

          1. 点击添加条件
          2. 属性条件中,以 CEL 格式输入条件;例如:如果之前映射的 subject 的值包含以 @example.com 结尾的电子邮件地址,则为 assertion.subject.endsWith('@example.com')
      8. 如需创建提供方,请点击提交

    隐式流

    1. 在 Google Cloud 控制台中,执行以下操作:

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

        进入“员工身份池”

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

      3. 提供方表中,点击添加提供方

      4. 选择协议中,选择 OpenID Connect (OIDC)

      5. 创建池提供方中,执行以下操作:

        1. 名称中,输入提供方的名称。
        2. 颁发者 (网址) 中,输入颁发者 URI。OIDC 颁发者 URI 必须采用有效的 URI 格式,并以 https 开头;例如 https://example.com/oidc
        3. 输入客户端 ID,即注册到 OIDC IdP 的 OIDC 客户端 ID,该 ID 必须与 IdP 颁发的 JWT 的 aud 声明相匹配。
        4. 如需创建状态为已启用的提供方,请确保已启用提供方处于开启状态。
        5. 点击继续
      6. 响应类型中,执行以下操作。响应类型仅用于基于网络的单点登录流程。

        1. 响应类型中,选择 ID 令牌
        2. 点击继续
      7. 配置提供方中,您可以配置属性映射和属性条件。如需创建属性映射,请执行以下操作。您可以提供 IdP 字段名称,也可以提供返回字符串的 CEL 格式表达式。

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

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

          1. 点击添加映射
          2. Google n(其中 n 为数字)中,输入一个 Google Cloud 支持的密钥
          3. 在相应的 OIDC n 字段中,以 CEL 格式输入要映射的 IdP 特定字段的名称。
        3. 如需创建属性条件,请执行以下操作:

          1. 点击添加条件
          2. 属性条件中,以 CEL 格式输入条件;例如:如果之前映射的 subject 的值包含以 @example.com 结尾的电子邮件地址,则为 assertion.subject.endsWith('@example.com')

            如果您的多租户 IdP 具有单个颁发者 URI,您必须使用属性条件来确保仅允许正确的租户访问。

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

    gcloud

    代码流

    在 Okta 中,执行以下操作:

    1. 客户端身份验证中,选择客户端密钥

    2. 客户端密文表中,找到密钥,然后点击 复制

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

    gcloud iam workforce-pools providers create-oidc 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" \ --location=global

    请替换以下内容:

    • 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 登录的额外范围;例如 groups,用于在使用 Okta 的组织授权服务器时从 Okta 请求群组声明。
    • ATTRIBUTE_MAPPING属性映射。 以下是属性映射示例:
      google.subject=assertion.sub,
      google.groups=assertion.group1,
      attribute.costcenter=assertion.costcenter
      此示例会将 OIDC 断言中的 IdP 属性 subjectgroup1costcenter 分别映射到 google.subjectgoogle.groupsattribute.costcenter 属性。
    • ATTRIBUTE_CONDITION属性条件;例如:如果之前映射的 subject 的值包含以 @example.com 结尾的电子邮件地址,则为 assertion.subject.endsWith('@example.com')
    • 如果您的多租户 IdP 具有单个颁发者 URI,您必须使用属性条件来确保仅允许正确的租户访问。
    • JWK_JSON_PATH本地上传的 OIDC JWK 的可选路径。如果未提供此参数,Google Cloud 会改用您的 IdP 的 /.well-known/openid-configuration 路径来寻找包含公钥的 JWK。如需详细了解本地上传的 OIDC JWK,请参阅管理 OIDC JWK
    在命令响应中,POOL_RESOURCE_NAME 是池的名称;例如 locations/global/workforcePools/enterprise-example-organization-employees

    隐式流

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

    gcloud iam workforce-pools providers create-oidc 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" \
        --location=global
    

    请替换以下内容:

    • 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 登录的额外范围;例如 groups,用于在使用 Okta 的组织授权服务器时从 Okta 请求群组声明。
    • ATTRIBUTE_MAPPING属性映射。 以下是属性映射示例:
      google.subject=assertion.sub,
      google.groups=assertion.group1,
      attribute.costcenter=assertion.costcenter
      此示例会将 OIDC 断言中的 IdP 属性 subjectgroup1costcenter 分别映射到 google.subjectgoogle.groupsattribute.costcenter 属性。
    • ATTRIBUTE_CONDITION属性条件;例如:如果之前映射的 subject 的值包含以 @example.com 结尾的电子邮件地址,则为 assertion.subject.endsWith('@example.com')
    • 如果您的多租户 IdP 具有单个颁发者 URI,您必须使用属性条件来确保仅允许正确的租户访问。
    • JWK_JSON_PATH本地上传的 OIDC JWK 的可选路径。如果未提供此参数,Google Cloud 会改用您的 IdP 的 /.well-known/openid-configuration 路径来寻找包含公钥的 JWK。如需详细了解本地上传的 OIDC JWK,请参阅管理 OIDC JWK
    在命令响应中,POOL_RESOURCE_NAME 是池的名称;例如 locations/global/workforcePools/enterprise-example-organization-employees

创建 SAML 员工池提供方

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

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

    https://iam.googleapis.com/locations/global/workforcePools/WORKFORCE_POOL_ID/providers/PROVIDER_ID
    
  3. 如果您打算设置对控制台的用户访问权限,请在 SAML IdP 中将重定向网址或断言消费者服务 (ACS) 网址字段设置为以下网址:

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

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

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

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

控制台

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

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

    转到“员工身份池”

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

  3. 提供方表中,点击添加提供方

  4. 选择协议中,选择 SAML

  5. 创建池提供方中,执行以下操作:

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

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

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

    4. 确保已启用提供方处于启用状态。

    5. 点击继续

  6. 配置提供方中,执行以下操作:

    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. 可选:如需添加属性条件,请点击添加条件,然后输入表示属性条件的 CEL 表达式。 例如,要将 ipaddr 属性限制为特定 IP 范围,您可以设置条件 assertion.attributes.ipaddr.startsWith('98.11.12.')。此示例条件可确保只有 IP 地址以 98.11.12. 开头的用户才能使用此员工提供方登录。

      如果您的多租户 IdP 具有单个颁发者 URI,您必须使用属性条件来确保仅允许正确的租户访问。

    4. 点击继续

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

gcloud

如需使用 SAML 协议为 Okta 应用集成创建员工身份池提供方,请执行以下操作:

  1. 如需保存 Okta 应用的 SAML 元数据,请执行以下操作:

    1. 转到 Okta 应用。
    2. 点击登录标签页。
    3. SAML 签名证书部分,依次点击有效证书的操作 > 查看 IdP 元数据菜单项。
    4. 在打开的新页面中,复制 XML 元数据。
    5. 将元数据保存为本地 XML 文件。
  2. 如需为您的 Okta 应用创建员工提供方,请运行以下命令:

    gcloud iam workforce-pools providers create-saml WORKFORCE_PROVIDER_ID \
        --workforce-pool="WORKFORCE_POOL_ID" \
        --attribute-mapping="ATTRIBUTE_MAPPING" \
        --attribute-condition="ATTRIBUTE_CONDITION" \
        --idp-metadata-path="XML_METADATA_PATH" \
        --location="global"
    

    请替换以下内容:

    • WORKFORCE_PROVIDER_ID:您在本指南前面部分创建的员工提供方 ID。
    • WORKFORCE_POOL_ID:您在本指南前面部分创建的员工池 ID。
    • 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. 开头的用户才能使用此员工提供方登录。

    • XML_METADATA_PATH:您在本指南前面部分创建的 Okta 应用的 XML 格式元数据文件的路径。

    前缀 gcp- 已被保留,不能在池或提供方 ID 中使用。

    可选:接受来自 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 PROVIDER_ID \
        --location global \
        --use encryption \
        --spec KEY_SPECIFICATION

    请替换以下内容:

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

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

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

    替换以下内容:

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

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

    如需将 Okta 配置为加密 SAML 断言,请执行以下操作:

    • 前往 Okta 信息中心并登录。
    • 点击应用>应用
    • 点击您的应用。
    • 常规标签页的 SAML 设置部分中,点击修改
    • 点击下一步以查看 SAML Settings
    • 点击显示高级设置
    • SAML 设置中,执行以下操作:
      • 响应(首选)或断言签名中,选择 Signed
      • 签名算法摘要算法中,选择任一选项。
      • 设置以下值:
        • Assertion Encryption:已加密。
        • 加密算法:您选择的任何算法。
        • 加密证书:上传您之前在本指南中生成的证书文件。
    • 要保存配置,请点击下一步,然后点击完成

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

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

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

    请替换以下内容:

    • KEY_ID:密钥名称
    • WORKFORCE_POOL_ID:池 ID
    • PROVIDER_ID:提供方 ID

    支持的 SAML 加密算法

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

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

管理对 Google Cloud 资源的访问权限

本部分提供的示例展示了如何管理员工身份联合用户对 Google Cloud 资源的访问权限。

在此示例中,您需要授予对示例项目的 Identity and Access Management (IAM) 角色。然后,用户可以登录并使用此项目访问 Google Cloud 产品。

您可以管理单个身份、一组身份或整个池的 IAM 角色。如需了解详情,请参阅在 IAM 政策中表示员工身份池用户

对于单个身份

如需向单个身份授予项目 TEST_PROJECT_ID 的 Storage Admin (roles/storage.admin) 角色,请运行以下命令:

gcloud projects add-iam-policy-binding TEST_PROJECT_ID \
    --role="roles/storage.admin" \
    --member="principal://iam.googleapis.com/locations/global/workforcePools/WORKFORCE_POOL_ID/subject/SUBJECT_VALUE"

替换以下内容:

  • TEST_PROJECT_ID:项目的 ID
  • WORKFORCE_POOL_ID:员工身份池 ID
  • SUBJECT_VALUE:用户身份

使用映射的部门特性

如需向项目 TEST_PROJECT_ID 的特定部门中的所有身份授予 Storage Admin (roles/storage.admin) 角色,请运行以下命令:

gcloud projects add-iam-policy-binding TEST_PROJECT_ID \
    --role="roles/storage.admin" \
    --member="principalSet://iam.googleapis.com/locations/global/workforcePools/WORKFORCE_POOL_ID/attribute.department/DEPARTMENT_VALUE"

替换以下内容:

  • TEST_PROJECT_ID:项目的 ID
  • WORKFORCE_POOL_ID:员工池 ID
  • DEPARTMENT_VALUE:映射的 attribute.department

使用映射群组

如需向特定群组中的所有身份授予项目 TEST_PROJECT_ID 的 Storage Admin (roles/storage.admin) 角色,请运行以下命令:

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

请替换以下内容:

  • TEST_PROJECT_ID:项目的 ID
  • WORKFORCE_POOL_ID:员工池 ID
  • GROUP_ID:映射的 google.groups 声明中的群组。

登录并测试访问权限

在本部分中,您将以员工身份池用户的身份登录,并测试您是否有权访问 Google Cloud 产品。

登录

本部分介绍了如何以联合用户身份登录并访问 Google Cloud 资源。

控制台(联合)登录

如需登录 Google Cloud 员工身份联合控制台(也称为控制台 [联合]),请执行以下操作:

  1. 前往控制台(联合)登录页面。

    前往控制台(联合)

  2. 输入提供方名称,格式如下:
    locations/global/workforcePools/WORKFORCE_POOL_ID/providers/WORKFORCE_PROVIDER_ID
    1. 如果出现提示,请在 Okta 应用集成中输入用户凭据。

    如果您启动 IdP 发起的登录,请在 SAML 设置中将以下网址用于嵌套的默认 RelayState 参数:https://console.cloud.google/

基于浏览器的 gcloud CLI 登录

如需使用基于浏览器的登录流程登录 gcloud CLI,请执行以下操作:

创建配置文件

如需创建登录配置文件,请运行以下命令。您可以选择使用 --activate 标志激活文件,以作为 gcloud CLI 的默认设置。

gcloud iam workforce-pools create-login-config \
    locations/global/workforcePools/WORKFORCE_POOL_ID/providers/PROVIDER_ID \
    --output-file=LOGIN_CONFIG_FILE

替换以下内容:

  • WORKFORCE_POOL_ID:员工池 ID
  • PROVIDER_ID:提供方 ID
  • LOGIN_CONFIG_FILE:您指定的配置文件的路径,例如 login.json

该文件包含 gcloud CLI 用于启用基于浏览器的身份验证流程的端点,并将受众群体设置为您在本指南前面部分中创建的提供方。该文件不含机密信息。

输出类似于以下内容:

{
  "type": "external_account_authorized_user_login_config",
  "audience": "//iam.googleapis.com/locations/global/workforcePools/WORKFORCE_POOL_ID/providers/PROVIDER_ID",
  "auth_url": "https://auth.cloud.google/authorize",
  "token_url": "https://sts.googleapis.com/v1/oauthtoken",
  "token_info_url": "https://sts.googleapis.com/v1/introspect",
}

使用基于浏览器的身份验证登录

如需使用基于浏览器的登录身份验证来验证身份,您可以使用以下方法之一:

  • 如果您在创建配置文件时使用了 --activate 标志,或者使用 gcloud config set auth/LOGIN_CONFIG_FILE 激活了配置文件,gcloud CLI 会自动使用配置文件:

    gcloud auth login
  • 如需通过指定配置文件的位置进行登录,请运行以下命令:

    gcloud auth login --login-config=LOGIN_CONFIG_FILE
  • 如需使用环境变量来指定配置文件的位置,请将 CLOUDSDK_AUTH_LOGIN_CONFIG_FILE 设置为配置文件的路径。

停用基于浏览器的登录

如需停止使用登录配置文件,请执行以下操作:

  • 如果您在创建配置文件时使用了 --activate 标志,或者使用 gcloud config set auth/LOGIN_CONFIG_FILE 激活了配置文件,则必须运行以下命令以取消设置:

    gcloud config unset auth/login_config_file
  • 清除 CLOUDSDK_AUTH_LOGIN_CONFIG_FILE 环境变量(如果已设置)。

gcloud CLI 无头登录

如需使用无头流登录 gcloud CLI,请执行以下操作:

OIDC

  1. 让用户登录您的 Okta 应用,并从 Okta 获取 OIDC 令牌

  2. 将 Okta 返回的 OIDC 令牌保存在本地机器上的安全位置。

  3. 生成配置文件,如下所示。运行以下命令:

    gcloud iam workforce-pools create-cred-config \
        locations/global/workforcePools/WORKFORCE_POOL_ID/providers/PROVIDER_ID \
        --subject-token-type="urn:ietf:params:oauth:token-type:id_token" \
        --credential-source-file="PATH_TO_OIDC_ID_TOKEN" \
        --workforce-pool-user-project="WORKFORCE_POOL_USER_PROJECT" \
        --output-file="config.json"
    

请替换以下内容:

  • WORKFORCE_POOL_ID:员工池 ID
  • PROVIDER_ID:提供方 ID
  • PATH_TO_OIDC_TOKEN:OIDC IdP 凭据文件的路径
  • WORKFORCE_POOL_USER_PROJECT:与员工池用户项目关联的项目编号

主账号必须具有此项目的 serviceusage.services.use 权限。

运行该命令时,它会生成一个 OIDC IdP 配置文件,具有以下格式:

{
  "type": "external_account",
  "audience": "//iam.googleapis.com/locations/global/workforcePools/WORKFORCE_POOL_ID/providers/PROVIDER_ID",
  "subject_token_type": "urn:ietf:params:oauth:token-type:id_token",
  "token_url": "https://sts.googleapis.com/v1/token",
  "workforce_pool_user_project": "WORKFORCE_POOL_USER_PROJECT",
  "credential_source": {
    "file": "PATH_TO_OIDC_CREDENTIALS_FILE"
  }
}

SAML

  1. 让用户登录您的 Okta 应用,并从 Okta 获取 SAML 响应

  2. 将 Okta 返回的 SAML 响应保存到本地机器上的安全位置,然后存储该路径,如下所示:

    SAML_ASSERTION_PATH=SAML_ASSERTION_PATH
    
  3. 如需生成配置文件,请运行以下命令:

    gcloud iam workforce-pools create-cred-config \
        locations/global/workforcePools/WORKFORCE_POOL_ID/providers/WORKFORCE_PROVIDER_ID \
        --subject-token-type="urn:ietf:params:oauth:token-type:saml2" \
        --credential-source-file="SAML_ASSERTION_PATH"  \
        --workforce-pool-user-project="PROJECT_ID"  \
        --output-file="config.json"
    

    请替换以下内容:

    • WORKFORCE_PROVIDER_ID:您在本指南前面部分创建的员工提供方 ID。
    • WORKFORCE_POOL_ID:您在本指南前面部分创建的员工池 ID。
    • SAML_ASSERTION_PATH:SAML 断言文件的路径。
    • PROJECT_ID:项目 ID

    生成的配置文件类似于以下内容:

    {
      "type": "external_account",
      "audience": "//iam.googleapis.com/locations/global/workforcePools/WORKFORCE_POOL_ID/providers/WORKFORCE_PROVIDER_ID",
      "subject_token_type": "urn:ietf:params:oauth:token-type:saml2",
      "token_url": "https://sts.googleapis.com/v1/token",
      "credential_source": {
        "file": "SAML_ASSERTION_PATH"
      },
      "workforce_pool_user_project": "PROJECT_ID"
    }
    

如需使用令牌交换登录 gcloud,请运行以下命令:

gcloud auth login --cred-file="config.json"

然后,gcloud 会以透明方式将您的 Okta 凭据交换为临时的 Google Cloud 访问令牌,以便您对 Google Cloud 进行其他 gcloud 调用。

您将看到类似如下所示的输出:

Authenticated with external account user credentials for:
[principal://iam.googleapis.com/locations/global/workforcePools/WORKFORCE_POOL_ID/subject/USER_ID].

如需列出凭据账号和当前活跃的账号,请运行以下命令:

gcloud auth list

测试访问权限

您现在可以访问支持员工身份联合并且您有权访问的 Google Cloud 服务。在本指南的前面部分中,您向特定部门中的所有身份授予了项目 TEST_PROJECT_ID 的 Storage Admin (roles/storage.admin) 角色。现在,您可以通过列出 Cloud Storage 存储桶来测试您是否具有访问权限。

控制台(联合)

如需使用控制台(联合)列出 Cloud Storage 存储桶,请执行以下操作:

  • 转到 Cloud Storage 页面。
  • 验证您可以看到 TEST_PROJECT_ID 的现有存储桶列表

gcloud CLI

如需列出您有权访问的项目的 Cloud Storage 存储桶和对象,请运行以下命令:

gcloud storage ls --project="TEST_PROJECT_ID"

主账号必须具有指定项目的 serviceusage.services.use 权限。

删除用户

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

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

后续步骤