本页介绍了如何与组织内的其他应用共享 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 登录应用。如需了解详情,请参阅程序化身份验证。
浏览器访问
如需通过Google Cloud 控制台启用 IAP 以使用您的客户端 ID 和密钥,请完成以下说明:
- 为 Compute Engine 配置 OAuth 客户端 (Compute Engine)
- 为 Google Kubernetes Engine (GKE) 配置 OAuth 客户端
- 为 App Engine 配置 OAuth 客户端
- 为 Cloud Run 配置 OAuth 客户端
风险
虽然在应用之间共享客户端很方便,但存在风险。 本部分简单介绍共享客户端时的潜在风险以及如何缓解风险。
单点故障
为多个应用使用一个 OAuth 客户端会造成单点依赖。如果客户端被删除或修改不当,则使用该客户端的每个应用都会受到影响。您可以在 30 天内恢复已删除的 OAuth 客户端。
为了有效管理此运营风险,请执行以下操作:
- 实施适当的访问权限控制,以防止意外更改或删除
- 使用
clientauthconfig.clients.*权限限制对 OAuth 客户端的访问权限 - 使用Google Cloud 审核日志跟踪涉及 OAuth 客户端的管理活动
这主要是运营风险,而不是安全风险。在适当的访问权限控制和监控措施到位的情况下,共享 OAuth 客户端的便利性和管理优势通常会超过这一考虑因素。
客户端密钥泄露
共享客户端需要与他人和脚本共享您的客户端密钥, 这会增加您的客户端密钥泄露的风险。IAP 无法区分从您的应用创建的令牌和从泄露的客户端密钥创建的令牌。
如需缓解此风险,请执行以下操作:
- 像密码一样保护客户端密钥,切勿以纯文本形式存储
- 使用 Secret Manager 实现安全的凭据管理
- 使用 Cloud Audit Logging 监控对 IAP 资源的访问
- 泄露的客户端密钥只会影响身份验证,而不会影响对资源的访问授权。如果您怀疑自己的密钥已泄露,请立即重置密钥。
如需以程序化方式访问受 IAP 保护的资源,请考虑使用服务账号 JWT 身份验证,而不是与个人用户共享 OAuth 客户端密钥。这种方法可提供更好的安全隔离,同时保持共享 OAuth 客户端对应用的益处。
权限范围注意事项
共享 OAuth 客户端时,所有应用都使用相同的权限范围。对于 IAP,openid 和 email 是唯一必需的范围。这种考虑本身并不是重大风险,但务必要了解:
- OAuth 仅用于 IAP 中的身份验证(验证身份);授权(资源访问)通过 IAM 政策单独处理
- 即使身份验证凭证遭到入侵,攻击者仍需要拥有适当的 IAM 权限才能访问受保护的资源
- 将客户端限制为仅使用所需的
openid和email范围有助于限制潜在的安全影响