配置 IAP 与员工身份联合

本页面介绍了如何将 Identity-Aware Proxy (IAP) 配置为使用员工身份联合

通过 IAP 配置员工身份联合时,您可以使用外部身份提供方 (IdP) 通过 Identity and Access Management (IAM) 对员工(一组用户,例如员工、合作伙伴和承包商)进行身份验证和授权,以便用户可以安全地访问部署在 Google Cloud 或本地的服务。

通过使用员工身份联合配置 IAP,您可以针对受 IAP 保护的应用执行以下操作:

  • 将最终用户重定向到外部 IdP(例如 Okta)进行登录。
  • 将登录会话配置为介于 15 分钟到 12 小时之间。
  • 仅允许 IdP 中的特定最终用户或最终用户集访问您的应用。
  • 指定最终用户可在什么情境下访问应用。例如,仅允许在一天中的特定时间访问。

您可以在 IAP 支持的所有现有资源和负载平衡器上将 IAP 与员工身份联合搭配使用。

为应用配置 IAP 与员工身份联合

使用员工身份联合配置 IAP 包括以下主要任务:

  1. 设置员工池和提供方。
  2. 创建 OAuth 客户端 ID 和密钥。
  3. 启用 IAP 并将其配置为使用员工身份联合。

设置员工池和提供方

如需设置员工池和提供方,请按照员工身份联合中的说明操作,并在设置会话时长时参阅使用员工身份联合会话管理 IAP

如果要将电子邮件地址从第三方 IdP 映射到 Google Cloud,您必须在员工池提供方中为 google.email 添加属性映射。示例:google.email=assertion.email

创建 OAuth 客户端 ID 和密钥

  1. 按照说明,在将用于此配置的员工池所属组织中的项目下创建 OAuth 客户端 ID 和密钥。项目不必与受 IAP 保护的资源所在的项目相同。创建 OAuth 客户端 ID 和密钥时,请执行以下操作:

    1. 创建客户端 ID 时,为重定向 URI 使用占位符。创建客户端 ID 后,运行 describe 一个 OAuth 客户端以获取生成的 clientID

    2. 获得 clientID 后,运行 update OAuth 客户端,将 allowed-redirect-uris 更新为以下内容:https://iap.googleapis.com/v1/oauth/clientIds/$CLIENT_ID:handleRedirect

      其中 CLIENT_ID 是在上一步中检索到的 clientID

    3. 创建客户端密钥后,运行 describe OAuth 客户端凭据以获取生成的 clientSecret

    请保存 clientIdclientSecret,因为您在后续步骤中会用到它们。

启用 IAP 以使用员工身份联合

控制台

  1. 在 Google Cloud 控制台中,打开 IAP 页面。
    转到“IAP”页面
  2. 选择一个项目。项目必须与您之前创建的员工池位于同一组织中。该项目不必是您在其中创建了 OAuth 客户端 ID 和密钥的项目。
  3. 点击应用标签页,然后找到您要限制其使用 IAP 进行访问的应用。
  4. 在 IAP 列中,将开关切换为开启

gcloud

如需使用 gcloud CLI 启用 IAP,请按照适用服务的步骤进行操作:

API

  1. 创建 settings.json 文件。

    cat << EOF > settings.json
    {
    "iap":
      {
        "enabled":true,
     }
    }
    EOF
    
  2. 在 App Engine 上启用 IAP。

    curl -X PATCH \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Accept: application/json" \
    -H "Content-Type: application/json" \
    -d @settings.json \
    "https://appengine.googleapis.com/v1/apps/PROJECT_ID?updateMask=iap.enabled"
    

    如需在 Compute Engine 上启用 IAP,请使用以下网址:https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/REGION/backendServices/BACKEND_SERVICE_NAME?updateMask=iap.enabled

更新 IAP 设置

如需将 IAP 配置为使用员工身份联合,您必须配置以下设置:

  • WorkforceIdentitySettings:之前创建的 OAuth 客户端 ID 和密钥。
  • IdentitySources:身份源。

如需了解详情,请参阅 IAP API

gcloud

  1. 请参考以下示例,创建一个 iap_settings.yaml 文件。

    CLIENT_ID=clientId
    CLIENT_SECRET=clientSecret
    WORKFORCE_POOL_NAME=locations/global/workforcePools/test-pool
    cat <<EOF > iap_settings.yaml
    access_settings:
      identity_sources: ["WORKFORCE_IDENTITY_FEDERATION"]
      workforce_identity_settings:
        workforce_pools: ["$WORKFORCE_POOL_NAME"]
        oauth2:
          client_id: "$CLIENT_ID"
          client_secret: "$CLIENT_SECRET"
    EOF
    
  2. 运行以下命令,更新资源的 IAP 设置。

    gcloud iap settings set iap_settings.yaml --project=PROJECT --resource-type=RESOURCE_TYPE --service=SERVICE
    

    请替换以下内容:

    • PROJECT:项目 ID。
    • RESOURCE_TYPE:IAP 资源类型。资源类型必须是 app-engineiap_webcomputeorganizationfolder
    • SERVICE:服务名称。对于 app-enginecompute 来说,此字段都是可选的。

    如需详细了解该命令,请参阅 gcloud iap settings set

API

  1. 您可以参考以下示例,创建一个 iap_settings.json 设置文件。

    CLIENT_ID=clientId
    CLIENT_SECRET=clientSecret
    WORKFORCE_POOL_NAME=locations/global/workforcePools/test-pool
    cat <<EOF > iap_settings.json
    {
       "access_settings": {
         "identity_sources": ["WORKFORCE_IDENTITY_FEDERATION"],
         "workforce_identity_settings": {
           "workforce_pools": ["$WORKFORCE_POOL_NAME"],
           "oauth2": {
             "client_id": "$CLIENT_ID",
             "client_secret": "$CLIENT_SECRET",
           }
        }
      }
    }
    EOF
    
  2. 使用 gcloud CLI 获取资源的名称,然后从输出结果中复制 RESOURCE_NAME,因为您在下面的步骤中需要用到它。

    gcloud iap settings get \
        --project=PROJECT \
        --resource-type=RESOURCE_TYPE \
        --service=SERVICE
    

    请替换以下内容:

    • PROJECT:项目 ID。
    • RESOURCE_TYPE:IAP 资源类型。资源类型必须是 app-engineiap_webcomputeorganizationfolder
    • SERVICE:服务名称。对于 app-enginecompute 来说,此字段都是可选的。
  3. 将以下命令中的 RESOURCE_NAME 替换为上一步中的 RESOURCE_NAME

    curl -X PATCH \
     -H "Authorization: Bearer $(gcloud auth print-access-token)" \
     -H "Accept: application/json" \
     -H "Content-Type: application/json" \
     -d @iap_settings.json \
    "https://iap.googleapis.com/v1/RESOURCE_NAME:iapSettings?updateMask=iapSettings.accessSettings.identitySources,iapSettings.accessSettings.workforceIdentitySettings.workforcePools,iapSettings.accessSettings.workforceIdentitySettings.oauth2.clientId,iapSettings.accessSettings.workforceIdentitySettings.oauth2.clientSecret" 
    

授予对受 IAP 保护的资源的访问权限

如需访问受 IAP 保护的资源,最终用户必须拥有该资源的 IAP-Secured Web App User 角色。您可以将受 IAP 保护的 Web 应用用户角色授予单个用户(主账号)或一组用户(主账号集,该主账号集映射到一个群组、特定属性或整个用户池)。

不支持对受 IAP 保护的资源不受限制地访问。

控制台

  1. 在 Google Cloud 控制台中,打开 IAP 页面。
    转到“IAP”页面
  2. 选择要使用 IAP 保护的资源。
  3. 点击添加主账号,然后添加要为其授予资源 IAM 角色的群组或个人的主账号标识符
  4. 分配角色中,选择受 IAP 保护的 Web 应用用户
  5. 点击添加

gcloud

运行以下命令:

gcloud iap web add-iam-policy-binding \
    --member=PRINCIPAL_IDENTIFIER \
    --role='roles/iap.httpsResourceAccessor' \
    --project=PROJECT_ID \
    --resource-type=RESOURCE_TYPE \
    --service=SERVICE \
    --condition=CONDITION

替换以下内容:

  • PRINCIPAL_IDENTIFIER主账号标识符
  • PROJECT_ID:项目 ID。
  • RESOURCE_TYPE:IAP 资源类型,可以是 app-enginebackend-services
  • SERVICE:服务名称。当 resource-typeapp-engine 时,此字段是可选的。
  • CONDITION:(可选)IAM Conditions。 以下是配置了访问权限级别的条件示例:
expression="accessPolicies/12345678/accessLevels/iap_test_access_level" in request.auth.access_levels,title=iap-test-access-level,description=only access in weekdays

API

不建议使用此方法,因为它涉及资源的整个 IAM 政策。错误可能会从资源中移除政策。

  1. 获取现有的 IAM 政策绑定。

    curl -X POST \
      -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Accept: application/json" \
      -H "Content-Type: application/json" \
      -d {} \
    "https://iap.googleapis.com/v1/RESOURCE_NAME:getIamPolicy" -o iam_policy_bindings.json
    

    RESOURCE_NAME 替换为您在之前的步骤中获得的 RESOURCE_NAME

  2. 在上一步中获取的 iam_policy_bindings.json 文件中,移除 version 行和 etag 行,然后添加要为主帐号标识符添加的绑定。如需了解详情,请参阅了解允许政策

    {
      "bindings": [
        {
          // existing bindings
        },
        {
          "role": "roles/iap.httpsResourceAccessor",
          "members": [
          "principal://iam.googleapis.com/locations/global/workforcePools/iap-test-pool/subject/iap-test-subject"
          ],
          "condition": {
            "expression": "\"accessPolicies/12345678/accessLevels/iap_test_access_level\" in request.auth.access_levels",
            "title": "iap-test-access-level",
            "description": "only access in week days"
          }
        }
      ]
    }
    
  3. 更新 IAM 政策绑定。

    curl -X POST \
      -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Accept: application/json" \
      -H "Content-Type: application/json" \
      -d "{"policy":$(cat iam_policy_bindings.json)}" \
    "https://iap.googleapis.com/v1/RESOURCE_NAME:setIamPolicy"
    

    RESOURCE_NAME 替换为您在之前的步骤中获得的 RESOURCE_NAME

如需了解详情,请参阅 GetIamPolicySetIamPolicy

(可选)设置情境感知访问权限

(可选)您可以为高级授权设置情境感知访问权限规则。

如需设置访问权限级别,请参阅创建和应用访问权限级别。使用员工身份联合时,基于设备信息的访问权限级别不可用。您仍然可以使用基于请求情境的访问权限级别,但具有 IP 地址、时间和日期等条件。

使用员工池时的限制

  • IAP 仅支持一个员工池,并且员工池只能包含一个提供方。
  • 员工池、OAuth 客户端 ID 和密钥以及已启用 IAP 的应用必须位于同一组织中。
  • 设备相关信息的访问权限级别不受支持。
  • 仅支持以下 IAP 设置配置:
  • 不支持通过员工身份联合进行程序化访问。