自定义受众群体(服务)

本页面介绍了如何使用自定义受众群体进行授权。在 Cloud Run 服务上设置自定义受众群体,这些受众群体不允许公开(未经身份验证)访问,并且通过自定义网域接收请求。

了解自定义受众群体

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 编码为字符串列表不超过 32768 个字节即可。

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

命令行

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

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

替换

  • SERVICE 替换为您的 Cloud Run 服务的名称
  • AUDIENCE 替换为您要支持的自定义受众群体的字符串,例如 example.comaud1

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

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

YAML

您可以使用 gcloud run services describe --format export 命令下载并查看现有服务配置,该命令会生成清理后的 YAML 格式的结果。然后按照后续说明修改字段,最后使用 gcloud run services replace 命令上传修改后的 YAML。请务必严格按照说明修改字段。

  1. 如需查看和下载配置,请运行以下命令:

    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","AUDIENCE2"]'
        run.googleapis.com/launch-stage: BETA
    spec:
      template:
        ...

    替换

    • SERVICE 替换为您的 Cloud Run 服务的名称
    • AUDIENCEAUDIENCE2 替换为您要支持的自定义受众群体的字符串,例如 example.comaud1

    请注意,属性值是带英文引号的 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. 确认请求已获得授权,并且您会看到服务的预期响应。