为员工身份联合配置延长会话时长

默认情况下,员工身份联合会话的时长上限为 12 小时。延长会话时长功能可让组织为 Looker (Google Cloud Core) 客户配置长达 90 天的持久会话。

延长会话时长后,员工用户无需每天针对外部身份提供方 (IdP) 重新进行身份验证,即可保持与 Looker (Google Cloud Core)的不间断连接。Looker (Google Cloud Core) 中的用户互动仍受 Looker (Google Core) 会话时长配置的约束。为了在整个延长会话期间保持安全性, Google Cloud 会定期在后台直接从外部身份提供方 (IdP) 同步用户属性和群组成员资格。

本文档介绍了如何使用 Access Context Manager API 和项目级控制措施来定义扩展会话政策、配置工作区提供方,以及管理有效绑定。


概览

Workforce Identity Federation 使用 Access Context Manager Google Cloud 访问权限绑定来配置延长会话时长:

  • Google Cloud 访问权限绑定:管理员可以使用 Access Context Manager 定义会话时长政策,该政策适用于组织中所有员工池的整个组织。使用 restricted_project 范围时,该政策会授予最长 90 天的延长会话时间,但只会影响相应项目拥有的 Looker (Google Cloud Core) 实例。
  • 后台属性同步
    • OIDC:支持使用 OIDC 授权码流程(使用刷新令牌在后台定期从外部 IdP 刷新用户属性和群组成员资格)或通过 SCIM 预配进行支持。offline_access
    • SAML:对于 SAML 提供商,系统会使用 SCIM 预配功能来确保用户属性和群组成员资格保持最新状态。
  • 过时保护:如果无法在 24 小时内从外部 IdP 刷新用户属性(例如,如果用户在 IdP 中被取消配置或凭据被撤消),则 Google Cloud 终止会话。

准备工作

在配置延长会话时长之前,请确保您拥有所需的 Identity and Access Management 权限,并且已启用相关 API:

所需的角色和权限

如需获得配置延长会话时长所需的权限,请让您的管理员为您授予以下 IAM 角色:

启用 API

在项目中启用 Access Context Manager 和 IAM API:

gcloud services enable \
    accesscontextmanager.googleapis.com \
    iam.googleapis.com

限制和要求

在配置延长会话时长之前,请查看以下要求和限制:

  • 支持的应用:延长会话时长仅适用于 Looker (Google Cloud Core)
  • 强制性项目范围 (restricted_project):必须在 scopedAccessSettings 内配置会话设置,使用 restricted_project 客户端范围指定拥有 Looker (Google Cloud Core) 实例的 Google Cloud 项目 (projects/{PROJECT_NUMBER})。
    • 只有指定项目拥有的 Looker (Google Cloud Core) 应用会受到 ESL 政策的影响。
    • 所有其他应用(以及其他项目拥有的 Looker (Google Cloud Core) 应用)不会受到该政策的影响。
  • 会话时长范围:会话时长必须介于最短 1 小时 (3600s) 和最长 90 天 (7776000s) 之间。
  • 会话设置参数要求
    • session_length_enabled:必须设置为 true
    • session_length:所需时长介于 1 小时 (3600s) 和 90 天 (7776000s) 之间。
    • session_reauth_method:必须未设置或设置为 LOGIN
    • use_oidc_max_age:必须未设置或设置为 false
    • max_inactivity:必须未设置(或默认值 0s)。restricted_project 绑定不支持空闲会话超时。
  • 支持的身份提供商
    • OIDC:需要配置了授权代码流程offline_access 范围以颁发刷新令牌的 OIDC 提供方,或者配置了 SCIM 配置
    • SAML 2.0:需要在员工池提供方上启用 SCIM 配置
  • 属性过时阈值:系统会强制执行固定的 24 小时过时阈值。如果 Google Cloud 在 24 小时内无法从您的 IdP 刷新用户属性,则会话将失效,用户必须重新进行身份验证。
  • Access Context Manager 限制
    • 单个组织绑定:员工身份池的延长会话时长绑定必须以组织的“所有员工身份池”主账号 (principalSet://cloudresourcemanager.googleapis.com/organizations/{ORG_ID}/type/WorkforcePool) 为目标。由于此联合主账号标识符适用于组织中的所有员工身份池,因此每个组织只能存在一个此类绑定。如需为多个员工池中的多个 Looker (Google Cloud Core) 项目配置扩展会话,请在单个绑定的 scopedAccessSettings 列表中添加多个 restricted_project 范围块。
    • 员工池绑定不支持访问权限级别(access_levelsdry_run_access_levels)。
    • 员工池绑定不支持直接位于 GcpUserAccessBinding 上的顶级 sessionSettings;设置必须在 scopedAccessSettings.activeSettings.sessionSettings 内定义。

配置员工池提供方

如需延长会话时长,必须将员工池提供方配置为支持后台属性刷新。您可以将提供方配置为使用 OIDC 或 SAML 协议。

配置 OIDC 提供方

OIDC 提供商的属性后台刷新可以使用刷新令牌(offline_access 范围)或 SCIM 配置来处理。如果使用基于令牌的属性刷新:

  1. 在外部 IdP 中,配置一个采用授权代码流程的 OIDC 应用,并启用离线访问,以便返回刷新令牌。
  2. 在 Google Cloud中,将 offline_access 添加到 OIDC 员工池提供方的其他范围。

必须在 Google Cloud 组织中的所有员工身份池上配置离线访问权限,延长会话时长的政策才能发挥预期效果。

gcloud

如果您的提供程序已具有其他现有范围,请将它们与 offline_access 一起添加,以免被覆盖:

gcloud iam workforce-pools providers update-oidc PROVIDER_ID \
    --workforce-pool=WORKFORCE_POOL_NAME \
    --location=global \
    --web-sso-additional-scopes="offline_access[,EXISTING_ADDITIONAL_SCOPES]"

替换以下内容:

  • PROVIDER_ID:员工身份池提供方的名称。
  • WORKFORCE_POOL_NAME:员工身份池的名称。
  • EXISTING_ADDITIONAL_SCOPES:之前在提供方上配置的任何以逗号分隔的其他范围。如果您没有现有的其他作用域,请省略此参数。

REST API

发送 PATCH 请求以更新提供方。在 offline_access 旁边添加任何现有的其他范围:

PATCH https://iam.googleapis.com/v1/locations/global/workforcePools/WORKFORCE_POOL_NAME/providers/PROVIDER_ID?updateMask=oidc.webSsoConfig.additionalScopes

请求正文:

{
  "oidc": {
    "webSsoConfig": {
      "additionalScopes": [
        "offline_access"
      ]
    }
  }
}

替换以下内容:

  • WORKFORCE_POOL_NAME:员工身份池的名称。
  • PROVIDER_ID:员工身份池提供方的 ID。

配置 SAML 提供方

对于 SAML 提供方,后台属性刷新需要 SCIM 配置:

  1. 为员工池提供方设置 SCIM 租户。
  2. 配置从 SAML 身份提供商到 SCIM 端点的用户和群组预配。

如需查看分步说明,请参阅针对员工身份联合的 SCIM 预配


Looker (Google Cloud Core) 的政策配置示例

创建 GcpUserAccessBinding 资源,将延长会话时长的政策分配给组织的员工池,并将政策范围限定为托管 Looker (Google Cloud Core)实例的项目。

gcloud

在名为 esl-binding.yaml 的 YAML 文件中定义政策:

scopedAccessSettings:
- scope:
    clientScope:
      restrictedProject:
        name: projects/PROJECT_NUMBER
  activeSettings:
    sessionSettings:
      sessionLength: 7776000s
      sessionLengthEnabled: true
      sessionReauthMethod: LOGIN

创建访问权限绑定:

gcloud access-context-manager cloud-bindings create \
    --organization=ORG_ID \
    --federated-principal="principalSet://cloudresourcemanager.googleapis.com/organizations/ORG_ID/type/WorkforcePool" \
    --binding-file="esl-binding.yaml"

替换以下内容:

  • ORG_ID:您的 Google Cloud 组织 ID(例如 123456789012)。
  • PROJECT_NUMBER:拥有目标 Looker (Google Cloud Core) 实例的项目编号(例如 987654321098)。只有归此项目所有的 Looker (Google Cloud Core) 应用才能获得延长的会话时长。
  • sessionLength:会话时长(以秒为单位),后跟 s。例如,7776000s 表示 90 天的会话。
  • sessionLengthEnabled:设置为 true
  • sessionReauthMethod:设置为 LOGIN(或保持未设置状态)。

REST API

向 Access Context Manager API 发送 POST 请求:

POST https://accesscontextmanager.googleapis.com/v1/organizations/ORG_ID/gcpUserAccessBindings

JSON 请求正文:

{
  "principal": {
    "federatedPrincipal": "principalSet://cloudresourcemanager.googleapis.com/organizations/ORG_ID/type/WorkforcePool"
  },
  "scopedAccessSettings": [
    {
      "scope": {
        "clientScope": {
          "restrictedProject": {
            "name": "projects/PROJECT_NUMBER"
          }
        }
      },
      "activeSettings": {
        "sessionSettings": {
          "sessionLength": "7776000s",
          "sessionLengthEnabled": true,
          "sessionReauthMethod": "LOGIN"
        }
      }
    }
  ]
}

替换以下内容:

  • ORG_ID:您的 Google Cloud 组织 ID(例如 123456789012)。
  • PROJECT_NUMBER:拥有目标 Looker (Google Cloud Core) 实例的项目编号(例如 987654321098)。只有归此项目所有的 Looker (Google Cloud Core) 应用才能获得延长的会话时长。
  • sessionLength:会话时长(以秒为单位),后跟 s。例如,7776000s 表示 90 天的会话。
  • sessionLengthEnabled:设置为 true
  • sessionReauthMethod:设置为 LOGIN(或保持未设置状态)。

查看和列出绑定

由于绑定适用于组织中的所有员工池,因此每个组织最多只能有一个访问权限绑定。

列出有效绑定

如需列出组织中的员工池访问权限绑定,请使用 principal:federatedPrincipal 过滤条件:

gcloud

gcloud access-context-manager cloud-bindings list \
    --organization=ORG_ID \
    --filter="principal:federatedPrincipal"

REST API

GET https://accesscontextmanager.googleapis.com/v1/organizations/ORG_ID/gcpUserAccessBindings?filter=principal:federated_principal

获取绑定详细信息

如需查看特定员工池访问权限绑定的详细信息,请执行以下操作:

gcloud

gcloud access-context-manager cloud-bindings describe \
    --binding=BINDING_NAME

BINDING_NAME 替换为绑定的完整资源名称(例如 organizations/123456789012/gcpUserAccessBindings/b1234567890)。

REST API

GET https://accesscontextmanager.googleapis.com/v1/organizations/ORG_ID/gcpUserAccessBindings/BINDING_ID

替换以下内容:

  • ORG_ID:您的 Google Cloud 组织 ID(例如 123456789012)。
  • BINDING_ID:访问权限绑定的 ID(例如 b1234567890)。

更新访问权限绑定

您可以更新现有劳动力池访问权限绑定,以修改会话时长、添加新的项目范围或移除现有项目范围。

gcloud

  1. 在名为 updated-esl-binding.yaml 的 YAML 文件中定义更新后的政策:

    scopedAccessSettings:
    - scope:
        clientScope:
          restrictedProject:
            name: projects/PROJECT_NUMBER
      activeSettings:
        sessionSettings:
          sessionLength: 2592000s
          sessionLengthEnabled: true
          sessionReauthMethod: LOGIN
    
  2. 应用更新后的政策:

    • 替换范围限定的访问权限设置:如需使用 updated-esl-binding.yaml 中定义的配置覆盖现有项目范围,请执行以下操作:
    gcloud access-context-manager cloud-bindings update \
        --binding=BINDING_NAME \
        --binding-file="updated-esl-binding.yaml"
    
    • 附加到现有设置:如需将 updated-esl-binding.yaml 中定义的项目范围附加到绑定的现有项目范围,而不覆盖这些范围,请传递 --append 标志:
    gcloud access-context-manager cloud-bindings update \
        --binding=BINDING_NAME \
        --binding-file="updated-esl-binding.yaml" \
        --append
    

替换以下内容:* BINDING_NAME:绑定的完整资源名称(例如 organizations/123456789012/gcpUserAccessBindings/b1234567890)。 * PROJECT_NUMBER:目标 Looker (Google Cloud Core) 实例所属的项目编号。 * sessionLength:更新后的会话时长(例如,2592000s 表示 30 天)。

REST API

发送 PATCH 请求以更新绑定。

  • 替换范围限定的访问权限设置:如需覆盖现有项目范围,请执行以下操作:
PATCH https://accesscontextmanager.googleapis.com/v1/organizations/ORG_ID/gcpUserAccessBindings/BINDING_ID?updateMask=scopedAccessSettings
  • 附加到现有设置:如需附加新的项目范围而不覆盖现有范围,请设置 append=true 查询参数:
PATCH https://accesscontextmanager.googleapis.com/v1/organizations/ORG_ID/gcpUserAccessBindings/BINDING_ID?updateMask=scopedAccessSettings&append=true

JSON 请求正文:

{
"scopedAccessSettings": [
  {
    "scope": {
      "clientScope": {
        "restrictedProject": {
          "name": "projects/PROJECT_NUMBER"
        }
      }
    },
    "activeSettings": {
      "sessionSettings": {
        "sessionLength": "2592000s",
        "sessionLengthEnabled": true,
        "sessionReauthMethod": "LOGIN"
      }
    }
  }
]
}

替换以下内容: * ORG_ID:您的 Google Cloud 组织 ID(例如 123456789012)。 * BINDING_ID:您的访问权限绑定的 ID(例如 b1234567890)。 * PROJECT_NUMBER:目标 Looker (Google Cloud Core) 实例所属的项目编号。 * sessionLength:更新后的会话时长(例如,2592000s 表示 30 天)。


删除访问权限绑定

如果您删除员工池访问权限绑定,则贵组织中的所有员工池都会停用延长会话时长功能。

gcloud

gcloud access-context-manager cloud-bindings delete \
    --binding=BINDING_NAME

BINDING_NAME 替换为绑定的完整资源名称。

REST API

发送 DELETE 请求以移除绑定:

DELETE https://accesscontextmanager.googleapis.com/v1/organizations/ORG_ID/gcpUserAccessBindings/BINDING_ID

替换以下内容:

  • ORG_ID:您的 Google Cloud 组织 ID。
  • BINDING_ID:要删除的访问权限绑定的 ID。