为 Cloud Run 启用 IAP

本页介绍了如何通过后端服务或负载平衡器使用 IAP 保护 Cloud Run 服务。如果您在连接到同一负载平衡器全球后端服务的多个区域中运行 Cloud Run,请按照本页中的说明为后端服务配置一次 IAP。

如果您在单个区域运行 Cloud Run,我们建议您为 Cloud Run 配置 IAP,以便通过 Cloud Run 启用 IAP。这样,您就可以一键保护来自所有入站流量路径(包括默认 run.app 网址和负载平衡器)的流量。

已知限制

  • 在负载平衡器上启用 IAP 后,IAP 仅通过负载平衡器保护流量,而不会保护可能通过 run.app 网址到达 Cloud Run 服务的流量。如需仅允许 IAP 授权的流量,请参阅配置 Cloud Run 以限制访问权限

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

  • IAP 与 Cloud CDN 不兼容。

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

准备工作

如需在 IAP 中为 Cloud Run 资源启用 IAP,您需要满足以下条件:

IAP 使用 Google 管理的 OAuth 客户端对用户进行身份验证。只有组织内的用户才能访问启用了 IAP 的应用。如果您想允许组织外部的用户访问,请参阅为外部应用启用 IAP

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

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

控制台

使用 Google Cloud 控制台启用 IAP 时,Google 管理的 OAuth 客户端不可用。

如果您尚未配置项目的 OAuth 同意屏幕,系统会提示您执行此操作。如需配置 OAuth 同意屏幕,请参阅设置 OAuth 同意屏幕

设置 IAP 访问权限

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

  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 进行访问控制中的说明,授权 IAP 将流量发送到后端 Cloud Run 服务。

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

    启用 IAP 后,系统会创建 IAP 服务账号。如果 IAP 服务账号不在正文名单中,您可以通过运行以下 gcloud 命令创建该账号:

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

gcloud

  1. 如果您之前未在项目中执行此操作,请运行以下命令创建 IAP 服务代理。如果您之前创建了服务代理,运行该命令不会复制该代理。
    gcloud beta 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.iam.gserviceaccount.com'  \
    --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. 运行以下命令,向在上一步中创建的服务代理授予调用方权限。
    resource "google_cloud_run_service_iam_binding" "binding" {
      location = google_cloud_run_v2_service.default.location
      service  = google_cloud_run_v2_service.default.name
      role = "roles/invoker"
      members = [
        "serviceAccount:service-[PROJECT-NUMBER]@gcp-sa-iap.gserviceaccount.com",
      ]
    }
    
  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.iam.gserviceaccount.com

  • 如果您已向上述服务账号授予 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 beta services identity create --service=iap.googleapis.com --project=[PROJECT_ID]

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

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

为避免破坏性更改,在预览期间,我们将一些依赖于此行为的客户项目列入了许可名单,以免系统检查该权限。请与 Cloud Run 支持团队联系,将此类项目从“仅限预览版”许可名单中移除。

后续步骤

如需了解如何使用 Terraform 为 Cloud Run 设置 IAP,请浏览 Terraform 代码示例