为 Cloud Run 配置 IAP

本页面介绍如何从 Cloud Run 启用 IAP,以及如何通过将流量路由到 IAP 进行身份验证来保护发往 Cloud Run 服务的流量。通过从 Cloud Run 启用 IAP,您可以一键路由来自所有入站流量路径(包括默认 run.app 网址和负载均衡器)的流量。

已知限制

  • 项目必须位于组织内。
  • 身份必须来自同一组织。
  • 您无法同时在负载均衡器和 Cloud Run 服务上配置 IAP。
  • 如果启用了 IAP,某些集成(例如 Pub/Sub)可能会停止运行。

准备工作

所需的角色

如需获得启用 IAP 所需的权限,请让您的管理员为您授予以下 IAM 角色:

如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限

您也可以通过自定义角色或其他预定义角色来获取所需的权限。

从 Cloud Run 启用 IAP

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

如果您在同一 Cloud Run 服务上同时使用 IAP 和 Identity and Access Management (IAM),请注意以下条件:

  • IAP 和 IAM 检查都会执行。

  • IAP 检查会先进行,并根据 IAP 配置接受或阻止请求。

  • 如果请求通过了 IAP 检查,IAP 会使用自己的服务账号向 Cloud Run 的 IAM 检查进行身份验证。

  • 由于 IAP 检查会先进行,因此某些服务(例如 Pub/Sub)可能无法正确向其进行身份验证。

可使用 Google Cloud 控制台、Google Cloud CLI 或 Terraform 从 Cloud Run 启用 IAP。

控制台

为 Cloud Run 启用 IAP 后,IAP 需要获得调用 Cloud Run 服务的权限。如果您使用 Google Cloud 控制台启用 IAP,则系统会自动向 IAP 服务代理分配 Cloud Run Invoker 角色 (roles/run.invoker),从而授予此权限。

如需从 Cloud Run 启用 IAP,请执行以下操作:

  1. 在 Google Cloud 控制台中,前往 Cloud Run 页面:

    转到 Cloud Run

  2. 如果您要配置和部署新服务,请选择部署容器,然后选择服务。如果您要配置和部署现有服务,请点击该服务,然后点击修改和部署新的修订版本

  3. 如果您要配置新服务,请根据需要填写初始服务设置页面,然后选择使用 Identity-Aware Proxy (IAP) 进行高级身份验证

  4. 如果您要配置和部署现有服务,请点击该服务,然后选择使用 Identity-Aware Proxy (IAP) 进行高级身份验证

  5. 点击修改政策以创建情境感知访问权限政策:

    • 添加一个或多个主账号,并可选择添加每个主账号为进行应用访问而需要满足的访问权限级别。

    • 点击保存

  6. 点击保存

gcloud

如需直接从 Cloud Run 启用 IAP,请在部署应用时添加 --iap 标志,并向 IAP 服务代理授予调用方权限:

  1. 使用以下命令之一部署 Cloud Run 服务:

    对于新服务:

    gcloud beta run deploy SERVICE_NAME \
    --region=REGION \
    --image=IMAGE_URL \
    --no-allow-unauthenticated \
    --iap

    对于现有服务:

    gcloud beta run services update SERVICE_NAME \
    --region=REGION \
    --iap

    替换以下内容:

    • SERVICE_NAME:Cloud Run 服务的名称。
    • REGION:Cloud Run 区域的名称。例如 europe-west1
    • IMAGE_URL:对容器映像的引用,例如 us-docker.pkg.dev/cloudrun/container/hello:latest。如果您使用 Artifact Registry,则必须预先创建制品库 REPO_NAME。网址采用 LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG 格式。
    • PROJECT_NUMBER:您的 Google Cloud 项目编号。
  2. 向 IAP 服务代理授予调用方权限:

    gcloud run services add-iam-policy-binding SERVICE_NAME \
    --region=REGION \
    --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-iap.iam.gserviceaccount.com \
    --role=roles/run.invoker

    替换以下内容:

    • SERVICE_NAME:Cloud Run 服务的名称。
    • REGION:Cloud Run 区域的名称。例如 europe-west1
    • PROJECT_NUMBER:您的 Google Cloud 项目编号。
  3. 如需验证您的服务是否已配置为启用 IAP,请运行以下命令:

    gcloud beta run services describe SERVICE_NAME

    输出应该包含以下字符串:

    Iap Enabled: true

您现在是先将所有发往已配置 Cloud Run 服务的流量路由到 IAP 进行身份验证,然后再传递到容器。

Terraform

如需了解如何应用或移除 Terraform 配置,请参阅基本 Terraform 命令

如需使用 Terraform 启用 IAP,您必须更新服务定义并添加 IAM 政策绑定,以向 IAP 授予调用方权限。

  1. iap_enabled = true 添加到 Terraform 配置中的 google_cloud_run_v2_service 资源,以在服务上启用 IAP:

    resource "google_cloud_run_v2_service" "default" {
      provider = google-beta
      name     = "cloudrun-iap-service"
      location = "europe-west1"
      ingress      = "INGRESS_TRAFFIC_ALL"
      launch_stage = "BETA"
      iap_enabled  = true
    
      template {
        containers {
          image = "us-docker.pkg.dev/cloudrun/container/hello"
        }
      }
    }
    
  2. 添加以下内容,以向 IAP 服务代理授予 roles/run.invoker 角色。

    resource "google_cloud_run_v2_service_iam_member" "iap_invoker" {
      provider = google-beta
      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.iam.gserviceaccount.com"
    }
    

    PROJECT_NUMBER 替换为您的项目编号。

  3. 可选。如需检索当前的 IAM 政策数据,请将以下内容添加到 Terraform 配置中的 google_cloud_run_v2_service_iam_policy 资源。

    data "google_cloud_run_v2_service_iam_policy" "policy" {
      project = google_cloud_run_v2_service.default.project
      location = google_cloud_run_v2_service.default.location
      name = google_cloud_run_v2_service.default.name
    }
    

从 Cloud Run 停用 IAP

您可以使用 Google Cloud 控制台或 gcloud CLI 停用 IAP。

控制台

如需从 Cloud Run 停用 IAP,请执行以下操作:

  1. 在 Google Cloud 控制台中,前往 Cloud Run 页面:

    转到 Cloud Run

  2. 点击要修改的现有服务。

  3. 点击安全,然后清除使用 Identity-Aware Proxy (IAP) 进行高级身份验证

  4. 点击保存

gcloud

如需直接从 Cloud Run 停用 IAP,请在部署应用时添加 --no-iap 标志:

  1. 使用以下任一命令部署 Cloud Run 服务:

    对于新服务:

    gcloud beta run deploy SERVICE_NAME \
    --region=REGION \
    --image=IMAGE_URL \
    --no-iap

    对于现有服务:

    gcloud beta run services update SERVICE_NAME \
    --region=REGION \
    --no-iap

    替换以下内容:

    • SERVICE_NAME:Cloud Run 服务的名称。
    • REGION:Cloud Run 区域的名称。
    • IMAGE_URL:对容器映像的引用,例如 us-docker.pkg.dev/cloudrun/container/hello:latest。如果您使用 Artifact Registry,则必须预先创建制品库 REPO_NAME。网址采用 LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG 格式。
  2. 如需验证您的服务是否已不再配置为启用 IAP,请运行以下命令:

    gcloud beta run services describe SERVICE_NAME

    输出中不应再包含以下字符串:

    Iap Enabled: true

您不再先将所有发往已配置 Cloud Run 服务的流量路由到 IAP 进行身份验证,然后再传递到容器。

管理用户或群组访问权限

默认情况下,Cloud Run 的 IAP 将组织内身份与 Google 账号搭配使用。您可以使用 Google Cloud 控制台或 gcloud CLI 添加或移除对 Cloud Run 服务的访问权限。

控制台

如需添加或移除访问权限,请执行以下操作:

  1. 在 Google Cloud 控制台中,前往 Cloud Run 页面:

    转到 Cloud Run

  2. 点击要修改的现有服务,然后点击安全

  3. IAP 下,点击修改政策

  4. 如需添加访问权限,请输入主账号,并可选择输入要添加的访问权限级别。

  5. 如需从现有主账号移除访问权限,请点击访问权限级别旁边的删除政策图标。

  6. 点击保存

gcloud

如需为组织内的个别用户或群组添加或移除对 Cloud Run 服务的访问权限,请运行以下命令之一:

  • 添加访问权限:

    gcloud beta iap web add-iam-policy-binding \
    --member=user:USER_EMAIL \
    --role=roles/iap.httpsResourceAccessor \
    --region=REGION \
    --resource-type=cloud-run \
    --service=SERVICE_NAME
  • 移除访问权限:

    gcloud beta iap web remove-iam-policy-binding \
    --member=user:USER_EMAIL \
    --role=roles/iap.httpsResourceAccessor \
    --region=REGION \
    --resource-type=cloud-run \
    --service=SERVICE_NAME
  • 查看访问权限:

    gcloud beta iap web get-iam-policy \
    --region=REGION \
    --resource-type=cloud-run \
    --service=SERVICE_NAME

替换以下内容:

  • USER_EMAIL:用户的电子邮件地址。
  • REGION:Cloud Run 区域的名称。
  • SERVICE_NAME:Cloud Run 服务的名称。

问题排查

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

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

Setting IAM permissions failed

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

后续步骤