为 Cloud Run 启用 IAP

您可以通过两种方式为 Cloud Run 服务启用 Identity-Aware Proxy。

  1. 建议: 直接在 Cloud Run 服务上:
    • 直接保护 run.app 端点,因此您无需预配负载均衡器资源。
    • 提供更简单的设置,并避免额外的负载均衡器费用。
    • 如果您选择在 Cloud Run 前面放置负载均衡器,则负载均衡器的端点也会受到保护。
  2. 在面向 Cloud Run 服务的后端服务上:如果您在多个区域运行 Cloud Run,这些区域连接到同一个负载均衡器全局后端服务,并且您需要集中式访问管理,请按照此页面上的说明操作。否则,我们建议您直接在 Cloud Run 服务上启用 IAP。

已知限制

  • IAP 无法同时用于 Cloud Run 服务和负载均衡器。如果您在负载均衡器上启用 IAP,IAP 将仅通过负载均衡器来保护流量,而不会保护可能通过 Cloud Run 服务的 run.app 网址到达该服务的流量。如需仅允许经过 IAP 授权的流量,请参阅配置 Cloud Run 以限制访问权限。

  • IAP 使用 X-Serverless-Authorization 标头向 Cloud Run 进行身份验证。Cloud Run 会在剥离此标头的签名后将其传递给您的服务。如果您的服务旨在将请求转发到需要 IAM 身份验证的其他 Cloud Run 服务,请先更新您的服务以移除此标头。

  • IAP 与 Cloud CDN 不兼容。

  • IAP 会增加延迟时间。仅为对延迟时间不敏感的实例启用 IAP。

准备工作

我们建议您直接在 Cloud Run 上启用 IAP。

如果您选择在负载均衡器上为 Cloud Run 资源启用 IAP,而不是直接在 Cloud Run 上启用,则必须具备以下条件:

通过后端服务或负载均衡器启用 IAP

如果您必须通过后端服务或负载均衡器后面的 IAP 启用 IAP,请按照以下说明操作。

控制台

如果您尚未配置项目的 OAuth 权限请求页面,系统会提示您执行此操作。如需配置 OAuth 权限请求页面,请参阅设置 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 或其他一些 Workspace 网域。
    • Google 群组:<管理员>@googlegroups.com
    • 服务账号:server@example.
    • Google Workspace 网域:example.com
  6. 从角色下拉列表中选择 Cloud IAP > IAP-secured Web App Use。

  7. 点击保存。

允许组织外部的用户访问

默认情况下,启用 IAP 后,系统会使用 Google 管理的 OAuth 客户端对用户进行身份验证。这样一来,只有组织内的用户才能访问启用 IAP 的应用。

如需允许组织外部或没有组织的用户访问,请更新 OAuth 客户端配置以使用自定义 OAuth 客户端,如为外部应用启用 IAP 中所述。

启用 IAP

  1. 在 IAP 页面上的应用下,找到您要限制访问的负载均衡器后端服务。如需为某资源开启 IAP,请点击 IAP 切换开关。 如需启用 IAP,需要满足以下条件:
    • 负载均衡器前端配置中至少一个协议必须是 HTTPS。了解设置负载均衡器。
    • 您需要 compute.backendServices.update、clientauthconfig.clients.create 和 clientauthconfig.clients.getWithSecret 权限。这些权限由 Project Editor 等角色授予。 如需了解详情,请参阅管理对受 IAP 保护的资源的访问权限。
  2. 在出现的开启 IAP 窗口中,点击开启以确认您希望使用 IAP 保护资源。开启 IAP 后,它需要与负载均衡器的所有连接的登录凭据。只有具有项目的 IAP-Secured Web App User 角色的账号才能获得访问权限。
  3. 按照 IAM 访问权限控制中的说明,授权 IAP 向后端 Cloud Run 服务发送流量。

    • Principal:service-[PROJECT-NUMBER]@gcp-sa-iap.
    • 角色:Cloud Run Invoker

    启用 IAP 时,系统会创建 IAP 服务账号。如果 IAP 服务账号不在主账号列表中,您可以通过运行以下 gcloud 命令来创建该账号:

    gcloud services identity create \
        --service=iap.googleapis.com \
        --project=PROJECT_ID
    

gcloud

  1. 如果您之前未在项目中执行此操作,请运行以下命令创建 IAP 服务代理。如果您之前已创建服务代理,则运行该命令不会重复创建服务代理。
    gcloud services identity create --service=iap.googleapis.com --project=[PROJECT_ID]
  2. 运行以下命令,向在上一步中创建的服务账号授予调用方权限。
    gcloud run services add-iam-policy-binding [SERVICE-NAME] \
    --member='serviceAccount:service-[PROJECT-NUMBER]@gcp-sa-iap.'  \
    --role='roles/run.invoker'
    
  3. 通过运行全局范围或区域范围的命令来启用 IAP,具体取决于您的负载均衡器后端服务是全球性还是区域性。使用上一步中的 OAuth 客户端 ID 和 Secret。

    全局范围

    gcloud compute backend-services update BACKEND_SERVICE_NAME --global --iap=enabled
    

    区域范围

    gcloud compute backend-services update BACKEND_SERVICE_NAME --region REGION_NAME --iap=enabled
    
    请替换以下内容:

    • BACKEND_SERVICE_NAME:后端服务的名称。
    • REGION_NAME:要在其中启用 IAP 的区域。

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

Terraform

  1. 如果您之前未在项目中创建 IAP 服务代理,请运行以下命令进行创建。如果您之前已创建服务代理,则运行该命令不会重复创建服务代理。
    resource "google_project_service" "project" {
      project = "your-project-id"
      service = "iap.googleapis.com"
    }
    
  2. 添加以下内容,以向 IAP 服务代理授予 roles/run.invoker 角色。

    resource "google_cloud_run_v2_service_iam_member" "iap_invoker" {
      project = google_cloud_run_v2_service.default.project
      location = google_cloud_run_v2_service.default.location
      name = google_cloud_run_v2_service.default.name
      role   = "roles/run.invoker"
      member = "serviceAccount:service-"PROJECT_NUMBER@gcp-sa-iap."
    }
    

    将 PROJECT_NUMBER 替换为您的项目编号。

  3. 通过运行全局命令或区域命令来启用 IAP,具体取决于您的负载均衡器。使用上一步中的 OAuth 客户端 ID 和 Secret。

    • 全局范围

      resource "google_compute_backend_service" "default" {
        name                  = "tf-test-backend-service-external"
        protocol              = "HTTPS"
        load_balancing_scheme = "EXTERNAL_MANAGED"
        iap {
          enabled              = true
          oauth2_client_id     = "abc"
          oauth2_client_secret = "xyz"
        }
      }
      

    • 区域范围

      resource "google_compute_region_backend_service" "default" {
        name                  = "tf-test-backend-service-external"
        protocol              = "HTTPS"
        load_balancing_scheme = "EXTERNAL_MANAGED"
        iap {
          enabled              = true
          oauth2_client_id     = "abc"
          oauth2_client_secret = "xyz"
        }
      }
      

配置 Cloud Run 以限制访问权限

如需防止流量通过 Cloud Run 服务的默认 run.app 网址进行路由,请停用默认网址。否则,请配置入站流量设置,以限制 Cloud Run 的网络入站流量。

排查错误

访问 Cloud Run 时权限被拒绝

 Your client does not have permission to get URL from this server 
  • IAP 使用 IAP 服务账号权限来调用您的 Cloud Run 服务。请确保您已向以下服务账号授予 Cloud Run Invoker 角色:service-[PROJECT-NUMBER]@gcp-sa-iap.。

  • 如果您已向上述服务账号授予 Cloud Run Invoker 角色,但仍遇到此问题,请重新部署 Cloud Run 服务。

服务代理失败导致设置 IAM 错误

首次对新项目启用 IAP 时,可能会导致以下错误:

Setting IAM permissions failed

这是因为 Cloud Run 服务代理失败。如需解决此问题,请重新启用 IAP 或手动设置 IAM 政策。

无法通过 gcloud CLI 设置 IAP

 The IAP service account is not provisioned 

如果您看到此错误,请运行以下命令:

gcloud services identity create --service=iap.googleapis.com --project=[PROJECT_ID]

IAP 服务账号不需要 run.routes.invoke 权限

在 Cloud Run 的 IAP 预览版期间,Cloud Run 不会针对来自使用 Cloud Run Invoker 角色的 IAP 的调用执行 run.routes.invoke 权限检查。在正式版 (GA) 中,Cloud Run 会执行此权限检查。

为避免出现重大变更,在预览期间依赖此行为的部分客户项目被列入许可名单,以便系统不检查相应权限。请与 Cloud Run 支持团队联系,以从仅限预览的许可名单中移除此类项目。

后续步骤

为 Cloud Run 配置 IAP