为 Cloud Run 启用 IAP

本页面介绍如何使用 Identity-Aware Proxy (IAP) 保护 Cloud Run 服务。

已知限制

  • 传统应用负载平衡器后面启用 HTTP/2 且受 IAP 保护的 Cloud Run 服务在收到请求时会出现无限重定向循环。Google 建议您在使用受 IAP 保护且已启用 HTTP/2 的服务时使用全球外部应用负载平衡器。如需了解详情,请参阅负载均衡器模式

  • IAP 无法保护 Cloud Run 为已部署的服务提供的网域。为确保只有 IAP 有权访问该服务,请在 Cloud Run 服务上使用 IAM 身份验证。如需允许 IAP 访问 Cloud Run 服务,请向 IAP 服务帐号角色 service-[PROJECT_NUMBER]@gcp-sa-iap.iam.gserviceaccount.com 授予 Cloud Run Invoker 角色。IAP 生成 ID 令牌,并使用该令牌通过 X-Serverless-Authorization 标头向 Cloud Run 进行身份验证。

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

  • IAP 与 Cloud CDN 不兼容。

准备工作

如需为 Cloud Run 启用 IAP,您需要以下各项:

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

启用 IAP

控制台

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

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

设置 IAP 访问权限

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

    • Google 账号:user@gmail.com - 也可以是 Google Workspace 账号,例如 user@google.com 或其他一些工作区网域。
    • Google 群组:<管理员>@googlegroups.com
    • 服务账号:<服务器>@<示例>.gserviceaccount.com
    • Google Workspace 网域:example.com
  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

gcloud

  1. 如果您之前没有创建过服务帐号,请运行以下命令创建一个。如果您之前已创建服务帐号,运行该命令不会创建重复的服务帐号。
    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 访问权限政策。如需了解详情,请参阅管理角色和权限

配置 Cloud Run 以限制访问权限

您可以将 Cloud Run 服务配置为仅允许内部客户端和外部负载均衡器访问,这会阻止来自公共互联网的所有直接请求。

按照限制 Cloud Run 的入站流量中的步骤,将 Cloud Run 服务的入站流量设置配置为内部和 Cloud Load Balancing

排查错误

 The IAP service account is not provisioned 
如果您看到此错误,则表示您正尝试通过 gcloud CLI 在 Cloud Run 服务上启用 IAP。通过 gcloud CLI 设置 IAP 时,还需要额外执行一个步骤,即使用以下命令在项目中预配 IAP 服务帐号: gcloud beta services identity create --service=iap.googleapis.com --project=[PROJECT_ID]
 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 服务。

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

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

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

后续步骤

为帮助您使用 Terraform 为 Cloud Run 设置 IAP,请浏览 Terraform 代码示例