设置自定义受众群体(服务)

本页面介绍了如何使用自定义受众群体进行授权。

调用受 Identity and Access Management 保护的 Cloud Run 服务的客户端必须提供有效的 ID 令牌,其中包含与接收服务的 *.run.app 网址匹配的受众群体声明。对于不知道此网址的客户端,您可以使用自定义受众群体值。

了解自定义受众群体

Cloud Run 提供 Invoker (roles/run.invoker) 角色来支持使用 IAM 进行访问权限控制。IAM 访问权限控制使用 Google 签名的 ID 令牌,此类令牌打包为 JSON Web 令牌 (JWT)。 这些令牌的内容符合 OIDC 标准。

受众群体字段在此令牌中进行编码,以指定可以使用此令牌的预期目标。这样可以限制重放攻击的风险,即被拦截的令牌用于针对一项服务重放另一项服务。

按照惯例,受众群体是目标服务的完整网址。默认情况下,在 Cloud Run 中,此网址是 Google 生成的以 run.app 结尾的服务网址。

但是,Cloud Run 服务可能会位于非默认生成的网址后面,例如在以下情况下:

  • 使用自定义网域来访问客户端不知道 Google 生成的网址的服务时。
  • 负载均衡器后面部署多项服务时(其中客户端无法预测请求到达哪个区域服务)。Google 为服务生成的网址特定于区域,即使服务名称相同也不例外。

在这些情况中,您必须配置服务以接受允许客户端已知的其他目标的自定义受众群体值。Google 生成的默认网址始终保留为可接受的受众群体值。

设置和更新自定义受众群体

为 Cloud Run 设置自定义受众群体在服务级层进行,并且适用于所有服务修订版本,类似于 IAM 授权成员资格。

您可以设置多个自定义受众群体,只要将受众群体的 JSON 编码为字符串列表不超过 32,768 个字符即可。

任何配置更改都会导致新修订版本的创建。后续修订版本也将自动采用此配置设置,除非您进行了明确更新。

命令行

您可以使用以下命令在服务上设置自定义受众群体:

gcloud run services update SERVICE --add-custom-audiences=AUDIENCE

替换

  • SERVICE 替换为您的 Cloud Run 服务的名称
  • AUDIENCE 替换为您希望支持的自定义受众群体的字符串,例如 myservicehttps://myservice.example.com

您可以使用以下命令从服务中移除所有自定义受众群体:

gcloud run services update SERVICE --clear-custom-audiences

YAML

  1. 如果您要创建新的服务,请跳过此步骤。如果您要更新现有服务,请下载其 YAML 配置

    gcloud run services describe SERVICE --format export > service.yaml
  2. 在服务元数据上(而不是template 元数据上)设置 run.googleapis.com/custom-audiences 注解:

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: SERVICE
      annotations:
        run.googleapis.com/custom-audiences: '["AUDIENCE"]'
    spec:
      template:
        ...

    替换

    • SERVICE 替换为您的 Cloud Run 服务的名称
    • AUDIENCE 替换为您希望支持的自定义受众群体的字符串,例如 myservicehttps://myservice.example.com

    请注意,属性值是带英文引号的 JSON 字符串数组,需要同时使用英文双引号和英文单引号。

  3. 使用以下命令将服务替换为其新配置:

    gcloud run services replace service.yaml

验证自定义受众群体

  1. 获取具有 IAM 权限来调用服务的服务账号的 ID 令牌。请注意使用自定义受众群体 AUDIENCE

    export TOKEN=$(gcloud auth print-identity-token --impersonate-service-account SERVICE_ACCOUNT_EMAIL --audiences='AUDIENCE')

    您需要将其中的:

    • SERVICE_ACCOUNT_EMAIL 替换为服务账号的电子邮件地址。该地址以 .iam.gserviceaccount.com 结尾。
    • AUDIENCE 替换为您针对服务设置的自定义受众群体值。
  2. 使用该 ID 令牌调用服务的端点

    curl -H "Authorization: Bearer ${TOKEN}" ENDPOINT

    ENDPOINT 替换为访问服务的端点,例如其自定义网域或 .run.app 网址。

  3. 确认请求已获得授权,并且您看到服务的预期响应。