如何共享 OAuth 客户端

本页介绍如何与组织内的其他应用共享 OAuth 客户端。

概览

在项目之间共享 OAuth 客户端意味着,您可以为多个 Identity-Aware Proxy (IAP) 保护的应用使用单个自定义 OAuth 客户端,而无需为每个应用创建新的 OAuth 客户端。这种方法可以简化管理,尤其适用于拥有大量应用的组织。

配置 IAP 时,您可以使用以下两种 OAuth 客户端类型之一:

  • Google 管理的 OAuth 客户端:IAP 默认使用 此客户端。此内置选项无需手动创建客户端,但有两个主要限制:

    • 仅允许组织内的用户(内部用户)访问
    • 在权限请求页面上显示 Google Cloud 品牌,而不是您的 组织的品牌
  • 自定义 OAuth 客户端:您自行创建和管理此客户端。此选项:

    • 可在多个应用之间共享
    • 允许自定义权限请求页面上的品牌
    • 支持外部用户(组织外部)访问

创建自定义 OAuth 客户端后,您可以灵活地将其用于单个应用,也可以在多个应用之间共享。共享自定义 OAuth 客户端具有以下几项优势:

  • 减少管理多个客户端的管理开销
  • 简化了为不应有权访问“凭据”页面的团队成员启用 IAP 的过程
  • 有助于以编程方式(非浏览器)访问受 IAP 保护的应用

如需了解如何创建 OAuth 客户端,请参阅 为 IAP 创建 OAuth 客户端。 如需详细了解 Google 管理的 OAuth 客户端,请参阅 自定义 OAuth 配置以启用 IAP

准备工作

按照 OAuth 客户端创建中的步骤创建新的 OAuth 客户端,或使用现有的 OAuth 客户端。

以编程方式使用

为以编程方式使用配置 OAuth 客户端 ,以允许非浏览器应用使用受 IAP 保护的资源进行身份验证。这样,脚本、自动作业和后端服务就可以安全地访问受保护的应用,而无需用户以交互方式登录。

您可以在资源 层次结构中的任何级别(组织文件夹项目)应用这些身份验证设置。

如需了解实现步骤,请参阅 程序化身份验证指南IAP 设置管理 文档。

gcloud

  1. 准备一个包含 OAuth 客户端 ID 的设置文件:

    cat << EOF > SETTINGS_FILENAME
      access_settings:
        oauth_settings:
          programmatic_clients: [clientId1, clientId2, ..]
    EOF
    
  2. 使用 gcloud iap settings set 命令应用设置:

    gcloud iap settings set SETTINGS_FILENAME \
      [--organization=ORGANIZATION | --folder=FOLDER | --project=PROJECT] \
      [--resource-type=RESOURCE_TYPE] \
      [--service=SERVICE] \
      [--version=VERSION]
    

    示例命令:

    # Organization level
    gcloud iap settings set SETTINGS_FILENAME --organization=ORGANIZATION
    
    # Folder level
    gcloud iap settings set SETTINGS_FILENAME --folder=FOLDER
    
    # Project level (web resources)
    gcloud iap settings set SETTINGS_FILENAME \
      --project=PROJECT \
      --resource-type=iap_web
    
    # App Engine service in a project
    gcloud iap settings set SETTINGS_FILENAME \
      --project=PROJECT \
      --resource-type=app-engine \
      --service=SERVICE
    

    其中:

    • SETTINGS_FILENAME:您准备的 YAML 文件。
    • ORGANIZATION:组织 ID
    • FOLDER:文件夹 ID
    • PROJECT:项目 ID
    • RESOURCE_TYPE:IAP 资源类型 (app-engineiap_webcomputeorganizationfolder
    • SERVICE:服务名称(对于 computeapp-engine 资源类型,此参数是可选的)
    • VERSION:版本名称(不适用于 compute, 对于 app-engine,此参数是可选的)

API

  1. 准备一个设置 JSON 文件:

    cat << EOF > iap_settings.json
    {
      "access_settings": {
        "oauth_settings": {
          programmatic_clients: [clientId1, clientId2, ..]
        }
      }
    }
    EOF
    
  2. 获取资源名称:

    gcloud iap settings get \
      [--organization=ORGANIZATION | --folder=FOLDER | --project=PROJECT] \
      [--resource-type=RESOURCE_TYPE] \
      [--service=SERVICE] \
      [--version=VERSION]
    
  3. 使用资源名称更新设置:

    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.oauthSettings.programmaticClients"
    

    其中:

    • ORGANIZATION:组织 ID
    • FOLDER:文件夹 ID
    • PROJECT:项目 ID
    • RESOURCE_TYPE:IAP 资源类型 (app-engineiap_webcomputeorganizationfolder
    • SERVICE:服务名称(对于 computeapp-engine 资源类型,此参数是可选的)
    • VERSION:版本名称(不适用于 compute, 对于 app-engine,此参数是可选的)

配置完成后,使用您配置的任何一个 OAuth 客户端 ID 登录应用。如需了解详情,请参阅 程序化身份验证

浏览器访问

如需让 IAP 通过 Google Cloud 控制台使用您的客户端 ID 和密钥,请按照以下说明操作:

风险

在应用之间共享客户端很方便,但存在风险。 本部分简单介绍共享客户端时的潜在风险以及如何缓解风险。

单点故障

对许多应用使用一个 OAuth 客户端会造成单点依赖项。如果客户端被删除或修改不正确,则使用该客户端的每个应用都会受到影响。被删除的 OAuth 客户端可以在 30 天内恢复。

如需有效管理此运营风险,请执行以下操作:

这主要是运营风险,而不是安全风险。在实施适当的访问权限控制和监控后,共享 OAuth 客户端的便利性和管理优势通常会超过此考虑因素。

客户端密钥泄露

共享客户端需要与他人和脚本共享您的客户端密钥, 这会增加您的客户端密钥泄露的风险。令牌是通过您的应用创建还是通过被泄露的客户端密钥创建的,IAP 无法区分。

如需缓解此风险,请执行以下操作:

  • 像保护密码一样保护客户端密钥,并且绝不要将其以明文形式存储
  • 使用 Secret Manager实现安全的凭据管理
  • 使用 Cloud Audit Logging监控对 IAP 资源的访问
  • 泄露的客户端密钥只会影响身份验证,而不会影响访问资源的授权。如果您怀疑密钥已泄露,请立即重置密钥。

如需以编程方式访问受 IAP 保护的资源,请考虑 使用 服务账号 JWT 身份验证 ,而不是与个人用户共享 OAuth 客户端密钥。这种方法可以提供更好的安全隔离,同时保留共享 OAuth 客户端为应用带来的优势。

权限范围注意事项

共享 OAuth 客户端时,所有应用都使用相同的权限范围。对于 IAP,openidemail 是唯一必需的范围。此考虑因素本身并不是重大风险,但了解以下内容非常重要:

  • 在 IAP 中,OAuth 仅用于身份验证 (验证身份);授权 (资源访问)通过 IAM 政策单独处理
  • 即使身份验证凭据遭到入侵,攻击者仍然需要适当的 IAM 权限才能访问受保护的资源
  • 将客户端限制为仅使用必需的 openidemail 范围有助于限制潜在的安全影响