本页面介绍如何从 Cloud Run 启用 IAP,以及如何通过将流量路由到 IAP 进行身份验证来保护发往 Cloud Run 服务的流量。通过从 Cloud Run 启用 IAP,您可以一键路由来自所有入站流量路径(包括默认 run.app
网址和负载均衡器)的流量。
已知限制
- 项目必须位于组织内。
- 身份必须来自同一组织。
- 您无法同时在负载均衡器和 Cloud Run 服务上配置 IAP。
- 如果启用了 IAP,某些集成(例如 Pub/Sub)可能会停止运行。
准备工作
启用 IAP API。
所需的角色
如需获得启用 IAP 所需的权限,请让您的管理员为您授予以下 IAM 角色:
-
项目的 Cloud Run Admin (
roles/run.admin
) 角色 -
授予对启用 IAP 的服务的访问权限:
项目的 IAP Policy Admin (
roles/iap.admin
) -
创建已启用 IAP 的服务,或更新现有服务以启用 IAP:
-
已部署容器映像的 Artifact Registry Reader (
roles/artifactregistry.reader
) 角色 -
服务身份的 Service Account User (
roles/iam.serviceAccountUser
) 角色
-
已部署容器映像的 Artifact Registry Reader (
如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限。
从 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,请执行以下操作:
在 Google Cloud 控制台中,前往 Cloud Run 页面:
如果您要配置和部署新服务,请选择部署容器,然后选择服务。如果您要配置和部署现有服务,请点击该服务,然后点击修改和部署新的修订版本。
如果您要配置新服务,请根据需要填写初始服务设置页面,然后选择使用 Identity-Aware Proxy (IAP) 进行高级身份验证。
如果您要配置和部署现有服务,请点击该服务,然后选择使用 Identity-Aware Proxy (IAP) 进行高级身份验证。
点击修改政策以创建情境感知访问权限政策:
添加一个或多个主账号,并可选择添加每个主账号为进行应用访问而需要满足的访问权限级别。
点击保存。
点击保存。
gcloud
如需直接从 Cloud Run 启用 IAP,请在部署应用时添加 --iap
标志,并向 IAP 服务代理授予调用方权限:
使用以下命令之一部署 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 项目编号。
向 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 项目编号。
如需验证您的服务是否已配置为启用 IAP,请运行以下命令:
gcloud beta run services describe SERVICE_NAME
输出应该包含以下字符串:
Iap Enabled: true
您现在是先将所有发往已配置 Cloud Run 服务的流量路由到 IAP 进行身份验证,然后再传递到容器。
Terraform
如需了解如何应用或移除 Terraform 配置,请参阅基本 Terraform 命令。
如需使用 Terraform 启用 IAP,您必须更新服务定义并添加 IAM 政策绑定,以向 IAP 授予调用方权限。
将
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" } } }
添加以下内容,以向 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 替换为您的项目编号。
可选。如需检索当前的 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,请执行以下操作:
在 Google Cloud 控制台中,前往 Cloud Run 页面:
点击要修改的现有服务。
点击安全,然后清除使用 Identity-Aware Proxy (IAP) 进行高级身份验证。
点击保存。
gcloud
如需直接从 Cloud Run 停用 IAP,请在部署应用时添加 --no-iap
标志:
使用以下任一命令部署 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
格式。
如需验证您的服务是否已不再配置为启用 IAP,请运行以下命令:
gcloud beta run services describe SERVICE_NAME
输出中不应再包含以下字符串:
Iap Enabled: true
您不再先将所有发往已配置 Cloud Run 服务的流量路由到 IAP 进行身份验证,然后再传递到容器。
管理用户或群组访问权限
默认情况下,Cloud Run 的 IAP 将组织内身份与 Google 账号搭配使用。您可以使用 Google Cloud 控制台或 gcloud CLI 添加或移除对 Cloud Run 服务的访问权限。
控制台
如需添加或移除访问权限,请执行以下操作:
在 Google Cloud 控制台中,前往 Cloud Run 页面:
点击要修改的现有服务,然后点击安全。
在 IAP 下,点击修改政策。
如需添加访问权限,请输入主账号,并可选择输入要添加的访问权限级别。
如需从现有主账号移除访问权限,请点击访问权限级别旁边的删除政策图标。
点击保存。
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 政策。
后续步骤
- 如需了解如何通过后端服务或负载均衡器启用 IAP,请参阅为 Cloud Run 启用 IAP。
- 对于为 Cloud Run 启用 IAP 时遇到的问题,请参阅排查错误。
- 启用外部身份。
- 启用 OAuth 配置。
- 管理对受 IAP 保护的资源的访问权限。
- 使用组织政策控制 IAP 启用。