服务身份简介

本页面介绍了两种 Cloud Run 身份,以及 Cloud 客户端库如何使用服务身份来调用 Google Cloud API。具有 Cloud 客户端库的 Google Cloud 产品示例包括 Cloud Storage、Firestore、Cloud SQL、Pub/Sub 和 Cloud Tasks。本页面适用于管理组织政策和用户访问权限的管理员、运维人员或开发者,或者想要了解此类主题的任何用户。

Cloud Run 身份

为了使用 Cloud Run,Google Cloud 要求 Cloud Run 用户和 Cloud Run 实例都具有一个身份。

  • Cloud Run 用户的身份称为 Cloud Run 部署者账号。管理修订版本或作业时,您可以使用此身份向 Cloud Run Admin API 发出请求。
  • Cloud Run 实例的身份称为 Cloud Run 服务身份。如果您编写的 Cloud Run 代码与 Cloud 客户端库交互,或调用其他 Cloud Run 服务以进行服务到服务的通信,则可以使用此身份从 Cloud Run 向 Google Cloud API 或其他 Cloud Run 服务提出请求。

如需访问 Google Cloud API 并向其提出请求或者在服务之间通信,每个身份都必须在 Identity and Access Management (IAM) 中获得适当的权限。

使用部署者账号调用 Cloud Run Admin API

您可以使用 Cloud Run 部署者账号从 Cloud Run 调用 Cloud Run Admin API。部署者账号可以是用户账号或服务账号,代表登录 Google Cloud 环境的账号。

当部署者账号使用 Cloud Run 时,IAM 会检查部署者账号是否具有执行 Cloud Run 操作所需的权限。下图展示了用户账号如何调用 Cloud Run Admin API 以从 Google Cloud 控制台中部署新修订版本:

从 Google Cloud 控制台调用 Cloud Run Admin API。
图 1:用户使用 Google Cloud 控制台通过向 Cloud Run Admin API 发送带有访问令牌的请求来部署新修订版本。IAM 会使用该访问令牌验证用户账号是否已通过身份验证,以便在执行操作之前访问 Cloud Run Admin API。

使用服务身份调用 Google Cloud API

如果 Cloud Run 实例与其他经过 IAM 身份验证的 Cloud Run 服务交互,或者通过应用代码或内置功能(例如 Cloud Run 集成Cloud Storage 卷装载)调用 Cloud 客户端库,Google Cloud 环境会使用应用默认凭据 (ADC) 自动检测 Cloud Run 服务身份是否已经过身份验证来执行 API 操作。Cloud Run 服务身份是在您部署修订版本或执行作业时分配为 Cloud Run 实例身份的服务账号。

用作部署者账号的服务账号将仅在您在 Cloud Run 配置中配置同一服务账号时用作服务身份。

本指南的其余部分介绍了 Cloud Run 服务或作业如何使用服务身份来调用和访问 Google 服务和 API。如需详细了解服务身份配置,请参阅服务作业的服务身份配置页面。

服务身份的服务账号类型

当您的 Cloud Run 实例调用 Google Cloud API 以执行所需的操作时,Cloud Run 会自动使用服务账号作为服务身份。可用作服务身份的两种类型的服务账号如下所示:

  • 用户管理的服务账号(推荐):您可以手动创建此服务账号并确定此服务账号访问特定 Google Cloud 资源所需的一组最低权限。用户管理的服务账号遵循 SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com 的格式。
  • Compute Engine 默认服务账号:Cloud Run 会自动提供 Compute Engine 默认服务账号作为默认服务身份。Compute Engine 默认服务账号遵循 PROJECT_NUMBER-compute@developer.gserviceaccount.com 格式。

配置服务身份时避免使用默认服务账号

默认情况下,系统会自动创建 Compute Engine 默认服务账号。如果您在创建 Cloud Run 服务或作业时未指定服务账号,则 Cloud Run 会使用此服务账号。

根据您的组织政策配置,默认服务账号可能会自动获得项目的 Editor 角色。我们强烈建议您通过强制执行 iam.automaticIamGrantsForDefaultServiceAccounts 组织政策限制条件来停用自动角色授予功能。如果您的组织是在 2024 年 5 月 3 日之后创建的,则默认情况下会强制执行此限制条件。

如果您停用自动角色授予功能,则必须决定向默认服务账号授予哪些角色,然后自行授予这些角色

如果默认服务账号已具有 Editor 角色,我们建议您将 Editor 角色替换为权限较少的角色。如需安全地修改服务账号的角色,请使用 Policy Simulator 查看更改的影响,然后授予和撤消相应的角色

服务身份的工作原理

当您的代码调用 Cloud 客户端库或向 Cloud 客户端库发出请求时,会发生以下情况:

  1. 客户端库检测到对 Google Cloud API 或 Cloud 客户端库发出请求,并从实例元数据服务器请求服务身份的 OAuth 2.0 访问令牌。
  2. 实例元数据服务器为配置为服务身份的服务账号提供 IAM 访问令牌。
  3. 向 Google Cloud API 发送的请求将通过 OAuth 2.0 访问令牌发送。
  4. IAM 会验证访问令牌中引用的服务身份是否具有必要的权限,并在将调用转发到 API 端点之前检查政策绑定。
  5. Google Cloud API 执行操作。
从 Cloud Run 调用 Google Cloud API。
图 1:Cloud Run 会从元数据服务器生成访问令牌,IAM 使用该访问令牌来验证分配的 Cloud Run 服务身份是否已通过身份验证,可以访问 Google Cloud API。

为 Cloud Run 请求生成访问令牌以调用 Google Cloud API

如果您的 Cloud Run 代码使用 Cloud 客户端库,您可以在部署或执行时分配服务账号,从而在 Cloud Run 中配置服务身份。这样,库就可以自动获取访问令牌以对代码的请求进行身份验证。如果您的 Cloud Run 代码与其他经过身份验证的 Cloud Run 服务通信,您必须将访问令牌添加到请求。

如需将服务账号指定为服务身份,请参阅以下指南:

不过,如果您使用自己的自定义代码或需要以编程方式发出请求,则可以直接使用元数据服务器手动提取下一部分所述的身份令牌和访问令牌。注意,您无法直接从本地机器查询此服务器,因为元数据服务器仅适用于在 Google Cloud 上运行的工作负载。

使用元数据服务器提取 ID 和访问令牌

您可以使用元数据服务器提取的两种类型的令牌如下所示:

如需提取令牌,请按照您使用的令牌类型对应的标签页中的说明操作:

访问令牌

例如,如果要创建 Pub/Sub 主题,请使用 projects.topics.create 方法。

  1. 使用计算元数据服务器来提取访问令牌

    curl "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token" \
        --header "Metadata-Flavor: Google"

    此端点会返回一个带有 access_token 属性的 JSON 响应。

  2. 在 HTTP 协议请求中,您必须使用 Authorization 标头中的访问令牌对请求进行身份验证:

    PUT https://pubsub.googleapis.com/v1/projects/PROJECT_ID/topics/TOPIC_ID
    Authorization: Bearer ACCESS_TOKEN
    

    其中:

    • PROJECT_ID 是项目 ID。
    • TOPIC_ID 是主题 ID。
    • ACCESS_TOKEN 是您在上一步中提取的访问令牌。

    响应:

    {
        "name": "projects/PROJECT_ID/topics/TOPIC_ID"
    }
    

ID 令牌

使用计算元数据服务器提取具有特定目标设备的身份令牌

curl "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/identity?audience=AUDIENCE" \
    --header "Metadata-Flavor: Google"

其中,AUDIENCE 是请求的 JWT 目标设备。

对于 Cloud Run 服务,受众群体应该是您要调用的服务的网址或为该服务配置的自定义受众群体(例如自定义网域)。

https://service.domain.com

对于其他资源,则可能是受 IAP 保护的资源的 OAuth 客户端 ID:

1234567890.apps.googleusercontent.com

后续步骤