您可以通过两种方式为 Cloud Run 服务启用 Identity-Aware Proxy。
- 推荐 :直接在 Cloud Run 服务上启用:
- 直接保护
run.app端点,这样您就不必预配负载均衡器资源。 - 提供更简单的设置,并避免额外的负载均衡器费用。
- 如果您选择在 Cloud Run 前面放置负载均衡器,则负载均衡器的端点也会受到保护。
- 直接保护
- 在 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 上启用,则必须具备以下条件:
- 启用了结算功能的 Google Cloud 控制台项目。
- 由负载均衡器提供服务的一组(一个或多个)Cloud Run 服务。
- 了解如何设置外部 HTTPS 负载均衡器。
- 了解如何设置内部 HTTPS 负载均衡器。
- 已注册到负载均衡器地址的域名。
- 用于验证所有请求都拥有一个身份的应用代码。
- 了解如何获取用户的身份。
通过后端服务或负载均衡器启用 IAP
如果您必须通过后端服务或负载均衡器后面的 IAP 启用 IAP,请按照以下说明操作。
控制台
如果您尚未配置项目的 OAuth 权限请求页面,系统将 提示您执行此操作。如需配置 OAuth 权限请求页面,请参阅设置 OAuth 权限请求页面。
设置 IAP 访问权限
- 转到 Identity-Aware Proxy 页面。
- 选择要使用 IAP 保护的项目。
- 在应用 下,选中您要向其添加成员的负载均衡器后端服务旁边的复选框。
- 在右侧面板上,点击添加主账号 。
在添加主账号 对话框中,输入应具有项目的 IAP-secured Web App User 角色的群组或个人的账号。可以添加以下种类的账号作为成员:
- Google 账号: [email protected] - 也可以是 Google Workspace 账号,例如 [email protected] 或其他一些 Workspace 网域。
- Google 群组:<管理员>@googlegroups.com
- 服务账号:<服务器>@<示例>。iam.gserviceaccount.com
- Google Workspace 网域:example.com
从角色下拉列表中选择 Cloud IAP > IAP-secured Web App Use。
点击保存 。
允许组织外的用户访问
默认情况下,当您启用 IAP 时,它会使用 Google 管理的 OAuth 客户端对用户进行身份验证。因此,只有组织内的用户才能访问已启用 IAP 的应用。
如需允许组织外的用户或没有 组织的用户访问,请更新 OAuth 客户端配置以使用自定义 OAuth 客户端,如为外部应用启用 IAP中所述。
启用 IAP
- 在 IAP 页面的应用下,找到您要限制访问的负载均衡器后端服务。如需为资源启用 IAP,请点击 IAP 开关。
如需启用 IAP,请执行以下操作:
- 负载均衡器前端配置中至少一个协议必须是 HTTPS。了解设置负载均衡器。了解设置负载均衡器。
- 您需要
compute.backendServices.update、clientauthconfig.clients.create和clientauthconfig.clients.getWithSecret权限。这些权限由 Project Editor 等角色授予。 如需了解详情,请参阅管理对受 IAP 保护的资源的访问权限。
- 在出现的开启 IAP 窗口中,点击开启以确认您希望使用 IAP 保护资源。开启 IAP 后,它需要与负载均衡器的所有连接的登录凭据。只有具有项目的 IAP-Secured Web App User 角色的账号才能获得访问权限。
按照使用 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
- 如果您之前未在项目中执行此操作,请运行以下命令来创建 IAP 服务代理。如果您之前创建了服务代理,则运行该命令不会重复创建。
gcloud beta services identity create --service=iap.googleapis.com --project=[PROJECT_ID]
- 运行以下命令,向在上一步中创建的服务帐号授予调用方权限。
gcloud run services add-iam-policy-binding [SERVICE-NAME] \ --member='serviceAccount:service-[PROJECT-NUMBER]@gcp-sa-iap.iam.gserviceaccount.com' \ --role='roles/run.invoker' 通过运行全局范围或区域范围的命令来启用 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
- 如果您之前未在项目中执行此操作,请运行以下命令来创建 IAP 服务代理。如果您之前创建了服务代理,则运行该命令不会重复创建。
resource "google_project_service" "project" { project = "your-project-id" service = "iap.googleapis.com" } 添加以下内容,以向 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.iam.gserviceaccount.com" }将 PROJECT_NUMBER 替换为您的项目编号。
通过运行全局或区域命令(具体取决于您的负载均衡器)来启用 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 权限
在 Cloud Run 版 IAP 预览期间,Cloud Run 不会对来自使用 Cloud Run Invoker 角色的 IAP 的调用执行 run.routes.invoke 权限检查。正式版 (GA) 发布后,Cloud Run 会执行此权限检查。
为避免重大更改,一些在预览期间依赖此行为的客户项目被放入了许可名单,因此系统不会检查权限。请与 Cloud Run 支持团队 联系,将 此类项目从仅限预览的许可名单中移除。