为 Cloud Run 启用 IAP

使用集合让一切井井有条 根据您的偏好保存内容并对其进行分类。

本页面介绍如何使用 Identity-Aware Proxy (IAP) 保护 Cloud Run 服务。

已知限制

  • 必须配置 IAM 以向 allUsers 授予 Cloud Run 服务的 Invoker 角色。您仍然可以在网络级层上锁定访问权限,因此必须通过 IAP 授权所有外部请求。如需了解详情,请参阅配置 Cloud Run 以限制访问权限。我们正在解决此限制,使得您能够明确授予对 Cloud Run 服务的特定于项目的 IAP 访问权限。

  • 使用 IAP 保护时,已启用 HTTP/2 的 Cloud Run 服务会在请求时遇到无限重定向循环。此行为并非预期行为,Google 预计在以后解决此问题。目前,为了避免这种行为,我们建议在服务位于 IAP 之后停用 HTTP/2 配置(默认设置)。

  • 基于 Envoy 的负载均衡器模式 (Global external HTTP(S) load balancer) 提供的 Cloud Run 服务没有 X-Goog-IAP-JWT-Assertion IAP 标头。为避免此行为,建议您使用 Global external HTTP(S) load balancer (classic) 模式。

  • 具有内部负载均衡器的 Cloud Run 需要订阅 BeyondCorp Enterprise。

准备工作

如需为 Cloud Run 启用 IAP,您需要以下各项:

  • 启用了结算功能的 Google Cloud 控制台项目。
  • 由负载均衡器提供服务的一组(一个或多个)Cloud Run 服务。
  • 用于验证所有请求都拥有一个身份的应用代码。

启用 IAP

控制台

如果您尚未配置项目的 OAuth 权限请求页面,则需要进行配置。您需要在 OAuth 权限请求页面上使用电子邮件地址和产品名称。

  1. 转到 OAuth 权限请求页面
  2. 支持电子邮件地址下,选择要显示为公开联系人的电子邮件地址。该电子邮件地址必须是您自己的电子邮件地址或您拥有的某一 Google 群组的电子邮件地址。
  3. 输入您要显示的应用名称
  4. 添加任何可选详细信息。
  5. 点击保存

如需稍后更改 OAuth 权限请求页面上的信息(例如产品名称或电子邮件地址),请重复上述步骤来配置权限请求页面。

设置 IAP 访问权限

  1. 转到 Identity-Aware Proxy 页面
  2. 选择要使用 IAP 保护的项目。
  3. 应用下,选中您要向其添加成员的负载均衡器后端服务旁边的复选框。
  4. 在右侧面板上,点击添加成员
  5. 添加成员对话框中,输入应具有项目的 IAP-secured Web App User 角色的群组或个人的帐号。可以添加以下种类的帐号作为成员:

    • Google 帐号:user@gmail.com - 也可以是 Google Workspace 帐号,例如 user@google.com 或其他一些工作区网域。
    • Google 群组:<管理员>@googlegroups.com
    • 服务帐号:<服务器>@<示例>.gserviceaccount.com
    • Google Workspace 网域:example.com
  6. 角色下拉列表中选择 Cloud IAP > IAP-secured Web App Use

  7. 点击保存

启用 IAP

  1. IAP 页面应用下,找到要限制访问的负载均衡器后端服务。如需为资源开启 IAP,请点击 IAP 切换开关。 如需启用 IAP,请执行以下操作:
    • 负载均衡器前端配置中至少有一个协议必须为 HTTPS。了解如何设置负载均衡器
    • 您需要 compute.backendServices.updateclientauthconfig.clients.createclientauthconfig.clients.getWithSecret 权限。这些权限由 Project Editor 等角色授予。 如需了解详情,请参阅管理对受 IAP 保护的资源的访问权限
  2. 在出现的开启 IAP 窗口中,点击开启以确认您希望使用 IAP 保护资源。开启 IAP 后,它需要与负载均衡器的所有连接的登录凭据。只有具有项目的 IAP-Secured Web App User 角色的帐号才能获得访问权限。
  3. IAM 页面上,添加具有以下配置的新权限:

    • 主帐号service-[PROJECT-NUMBER]@gcp-sa-iap.iam.gserviceaccount.com
    • 角色Cloud Run Invoker

    您可以添加条件,将此角色限制为所需的 Cloud Run 服务。

    转到 IAM 页面

gcloud

  1. 按照以编程方式为 IAP 创建 OAuth 客户端中的说明配置 OAuth 权限请求页面和创建 OAuth 客户端。
  2. 保存 OAuth 客户端 ID 和 Secret。
  3. 如果您之前未创建过服务帐号,请运行以下命令创建一个。如果您之前创建服务帐号,则运行此命令不会创建重复的服务帐号。
    gcloud beta services identity create --service=iap.googleapis.com --project=[PROJECT_ID]
  4. 运行以下命令,向调用者在上一步中创建的服务帐号授予权限:
    gcloud run services add-iam-policy-binding [SERVICE-NAME] \
    --member=`serviceAccount:service-[PROJECT-NUMBER]@gcp-sa-iap.iam.gserviceaccount.com`  \
    --role=`roles/run.invoker`
    
  5. 通过运行全局范围或区域范围的命令来启用 IAP,具体取决于您的负载均衡器后端服务是全球性还是区域性。使用上一步中的 OAuth 客户端 ID 和 Secret。

    全球范围:

    gcloud compute backend-services update BACKEND_SERVICE_NAME --global --iap=enabled,oauth2-client-id=CLIENT_ID,oauth2-client-secret=CLIENT_SECRET
    

    区域范围:

    gcloud compute backend-services update BACKEND_SERVICE_NAME --region REGION_NAME --iap=enabled,oauth2-client-id=CLIENT_ID,oauth2-client-secret=CLIENT_SECRET
    
    请替换以下内容:

    • BACKEND_SERVICE_NAME:后端服务的名称。
    • CLIENT_ID:上一步中的 OAuth 客户端 ID。
    • CLIENT_SECRET:上一步中的 OAuth 客户端 Secret。
    • REGION_NAME:要在其中启用 IAP 的区域。

启用 IAP 后,您可以使用 Google Cloud CLI 通过 Identity and Access Management 角色 roles/iap.httpsResourceAccessor 操纵 IAP 访问权限政策。如需了解详情,请参阅管理角色和权限

配置 Cloud Run 以限制访问权限

完成以下步骤以配置对 Cloud Run 服务的访问权限。

  1. 配置 Cloud Run 服务并将入站流量设置为内部和 Cloud Load Balancing。如需了解详情,请参阅限制 Cloud Run 的入站流量

    此步骤可确保只有内部客户端和外部负载均衡器可以调用 Cloud Run 服务,并且来自公共互联网的直接请求会被阻止。

  2. 对于 Cloud Run 服务,请为 allUsers 授予 Invoker 角色。如需了解详情,请参阅允许公开(未经身份验证)访问

    此步骤可确保您的 IAP 配置正常运行,因为它会将 Cloud Run 配置为不尝试自行对请求进行身份验证和授权。IAP 会完成身份验证和授权。

请注意,此配置允许被视为内部客户端的所有客户端(根据限制 Cloud Run 的入站流量中的定义)访问 Cloud Run 服务,而无需进行身份验证。通过外部负载均衡器传入的所有其他客户端通过 IAP 进行身份验证。这是将来会解决的一种已知限制。