为 Cloud Run 启用 IAP

您可以使用以下方法之一为 Cloud Run 服务启用 Identity-Aware Proxy:

  1. 推荐:直接在 Cloud Run 服务上启用 IAP,这具有以下优势:

    • 直接保护 run.app 端点,因此您无需预配负载均衡器资源。

    • 设置更简单,并可避免额外的负载均衡器费用。

    • 如果您选择在 Cloud Run 前面放置负载均衡器,则负载均衡器的端点也会受到保护。

  2. 在面向 Cloud Run 服务的后端服务上启用 IAP:如果您在连接到同一负载均衡器全球后端服务的多个区域中运行 Cloud Run,并且需要集中式访问管理,请按照本页面上的说明操作。否则,我们建议您直接在 Cloud Run 服务上启用 IAP。

    已知限制

    • IAP 不能同时在 Cloud Run 服务和负载均衡器上使用。如果您在负载均衡器上启用 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。

    准备工作

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

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

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

    注意:我们建议您直接在 Cloud Run 上启用 IAP,如 Cloud Run 文档中所述。

    如需在负载均衡器的后端服务上启用 IAP,请按照以下说明操作。

    控制台

    如果您尚未配置项目的 OAuth 权限请求页面,系统会提示您进行配置。如需配置 OAuth 权限请求页面,请参阅设置 OAuth 权限请求页面。

    设置 IAP 访问权限

    1. 转到 Identity-Aware Proxy 页面。
    2. 选择要使用 IAP 保护的项目。
    3. 在应用下,选中您要向其添加成员的负载均衡器后端服务旁边的复选框。
    4. 在右侧面板上,点击添加主账号。
    5. 在添加主体对话框中,输入应具有项目的 IAP-secured Web 应用 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 服务发送流量。

      • 主账号: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 权限

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

    为避免破坏性更改,在预览版期间依赖此行为的一些客户项目被列入许可清单,因此系统不会检查权限。请与 Cloud Run 支持团队联系,从仅限预览版许可清单中移除此类项目。

    后续步骤

    为 Cloud Run 配置 IAP