本页介绍如何与组织内的其他应用共享 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
准备一个包含 OAuth 客户端 ID 的设置文件:
cat << EOF > SETTINGS_FILENAME access_settings: oauth_settings: programmatic_clients: [clientId1, clientId2, ..] EOF使用
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-engine、iap_web、compute、organization或folder) - SERVICE:服务名称(对于
compute或app-engine资源类型,此参数是可选的) - VERSION:版本名称(不适用于
compute, 对于app-engine,此参数是可选的)
API
准备一个设置 JSON 文件:
cat << EOF > iap_settings.json { "access_settings": { "oauth_settings": { programmatic_clients: [clientId1, clientId2, ..] } } } EOF获取资源名称:
gcloud iap settings get \ [--organization=ORGANIZATION | --folder=FOLDER | --project=PROJECT] \ [--resource-type=RESOURCE_TYPE] \ [--service=SERVICE] \ [--version=VERSION]使用资源名称更新设置:
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-engine、iap_web、compute、organization或folder) - SERVICE:服务名称(对于
compute或app-engine资源类型,此参数是可选的) - VERSION:版本名称(不适用于
compute, 对于app-engine,此参数是可选的)
配置完成后,使用您配置的任何一个 OAuth 客户端 ID 登录应用。如需了解详情,请参阅 程序化身份验证。
浏览器访问
如需让 IAP 通过 Google Cloud 控制台使用您的客户端 ID 和密钥,请按照以下说明操作:
- 为 Compute Engine 配置 OAuth 客户端(Compute Engine)
- 为 Google Kubernetes Engine (GKE) 配置 OAuth 客户端
- 为 App Engine 配置 OAuth 客户端
- 为 Cloud Run 配置 OAuth 客户端
风险
在应用之间共享客户端很方便,但存在风险。 本部分简单介绍共享客户端时的潜在风险以及如何缓解风险。
单点故障
对许多应用使用一个 OAuth 客户端会造成单点依赖项。如果客户端被删除或修改不正确,则使用该客户端的每个应用都会受到影响。被删除的 OAuth 客户端可以在 30 天内恢复。
如需有效管理此运营风险,请执行以下操作:
- 实施适当的访问权限控制,以防止意外更改或删除
- 使用
clientauthconfig.clients.*权限限制对 OAuth 客户端的访问 - 使用 Google Cloud 审核日志 跟踪 涉及 OAuth 客户端的管理活动
这主要是运营风险,而不是安全风险。在实施适当的访问权限控制和监控后,共享 OAuth 客户端的便利性和管理优势通常会超过此考虑因素。
客户端密钥泄露
共享客户端需要与他人和脚本共享您的客户端密钥, 这会增加您的客户端密钥泄露的风险。令牌是通过您的应用创建还是通过被泄露的客户端密钥创建的,IAP 无法区分。
如需缓解此风险,请执行以下操作:
- 像保护密码一样保护客户端密钥,并且绝不要将其以明文形式存储
- 使用 Secret Manager实现安全的凭据管理
- 使用 Cloud Audit Logging监控对 IAP 资源的访问
- 泄露的客户端密钥只会影响身份验证,而不会影响访问资源的授权。如果您怀疑密钥已泄露,请立即重置密钥。
如需以编程方式访问受 IAP 保护的资源,请考虑 使用 服务账号 JWT 身份验证 ,而不是与个人用户共享 OAuth 客户端密钥。这种方法可以提供更好的安全隔离,同时保留共享 OAuth 客户端为应用带来的优势。
权限范围注意事项
共享 OAuth 客户端时,所有应用都使用相同的权限范围。对于 IAP,openid 和 email 是唯一必需的范围。此考虑因素本身并不是重大风险,但了解以下内容非常重要:
- 在 IAP 中,OAuth 仅用于身份验证 (验证身份);授权 (资源访问)通过 IAM 政策单独处理
- 即使身份验证凭据遭到入侵,攻击者仍然需要适当的 IAM 权限才能访问受保护的资源
- 将客户端限制为仅使用必需的
openid和email范围有助于限制潜在的安全影响