GCLB 背后的云 运行 - 使用 IAM 管理访问

Cloud Run behind GCLB - managing access using IAM

我正在尝试让 IAM policies for Cloud Run 在 Google Cloud Load Balancer 后面工作。

直接调用 Cloud 运行 服务时,我需要将目标受众设置为 Cloud 运行 服务的 URL,例如my-service-abcdef.a.run.app:

import { credentials } from '@grpc/grpc-js';
import { GoogleAuth } from 'google-auth-library';

const clientCredentials = await new GoogleAuth().getIdTokenClient(
  'https://my-service-abcdef.a.run.app',
);

const client = new MyServiceClient(
  'my-service-abcdef.a.run.app',
  credentials.combineChannelCredentials(
    credentials.createSsl(),
    credentials.createFromGoogleCredential(clientCredentials),
  ),
);

现在,当我将 Cloud 运行 服务放在 GCLB 后面时,当我提供链接到 GCLB 的域(例如 my-domain.com)时,我实际上仍然可以调用它,但我需要保持目标受众(对于 getIdTokenClient 调用)完整 (https://my-service-abcdef.a.run.app)。

一旦我在 GCLB 后面添加更多区域,这就会中断(这是完全可以理解的),这些区域具有不同的“本地”URL(在 .run.app 域中,因此需要不同的受众) .

Cloud 运行 服务是否接受任何其他受众?我可以指定我自己的吗?

I'm trying to make IAM policies for Cloud Run work behind Google Cloud Load Balancer.

使用Google授权,暂时没有解决办法

目前,IAP 不适用于无服务器 NEG(云 运行、云函数、App Engine)。

Serverless network endpoint groups - Limitations

Do Cloud Run services accept any other audiences?

不,观众由 GFE/IAP 前端验证。无效请求不会到达您的服务入口点。

Can I specify my own?

如果您指的是 IAP 验证的您自己的受众,则不是。如果您关闭授权,您可以实现自己的身份令牌/API 密钥/密码并在您的代码中进行验证。

存在支持额外受众的特殊情况。如果您查看 documentation for end user auth,如果您查看解码的 end-user 令牌的受众,它会提供线索。

您将看到,当您在项目的 credential section 中创建 Web 应用程序 OAuth 客户端时,您将拥有一个 client-id 形式的

nnn-xyz.apps.googleusercontent.com

您可以在通过服务帐户或 GCP 身份验证客户端库为身份验证 header 创建 JWT 时将其指定为受众。在对 GCLB 的请求中使用此 JWT 时,它将适用于任何区域的服务。调用者的身份仍然需要是每个服务的 IAM 调用者成员资格列表中的授权身份。

如果您使用 IAP 的 client-id(在同一凭据页面中列出),这可能会导致单个身份验证 header 通过 2 层验证:IAP 身份验证检查,以及Cloud 运行 的 IAM 调用程序检查(一旦 IAP 得到完全支持,部分已经到位)。

需要注意的一点是,必须在部署修订之前在项目中创建 client-id。为现有服务部署新修订版将选取最近创建的 client-ids。