服务身份

默认服务帐号简介

默认情况下,Cloud Run 修订版本作为 Compute Engine 默认服务帐号执行。Compute Engine 默认服务帐号具有 Project Editor IAM 角色,该角色可授予对 Google Cloud 项目中所有资源的读取和写入权限。

虽然这可能方便,而不是使用默认服务帐号,但 Google 建议您创建具有最精细的权限的用户管理服务帐号,并将该服务帐号指定为 Cloud Run 服务的身份。本文档介绍如何使用 Cloud Run 配置每项服务的身份。

使用每项服务的身份

Google 建议您为每个 Cloud Run 服务分配一个用户管理的服务帐号,而不是使用默认服务帐号,从而为该服务提供专用身份。通过用户管理的服务帐号,您可以使用 Identity and Access Management 授予一组最低权限来控制访问权限。

gcloud 命令行工具Google Cloud 客户端库会自动检测它们在 Google Cloud 上运行并使用运行时当前 Cloud Run 修订版本的服务帐号。这意味着,如果您的代码使用 gcloud 工具或官方 Google Cloud 客户端库,它将自动检测 Cloud Run 服务的运行时服务帐号并进行身份验证。此策略称为应用默认凭据,支持跨多个环境移植代码。

用户管理的服务帐号所需的权限

如需使用用户管理的服务帐号部署 Cloud Run 服务,您必须拥有模拟该服务帐号的权限 (iam.serviceAccounts.actAs)。此权限可通过 roles/iam.serviceAccountUser IAM 角色授予。所有主帐号(例如用户、服务帐号)必须具有用户管理的服务帐号此权限,才能将 Cloud Run 服务部署为用户管理的服务帐号。

您可以使用 Cloud Console、API (YAML) 或使用 gcloud 工具授予此权限,如下所示:

gcloud iam service-accounts add-iam-policy-binding "SERVICE_ACCOUNT_EMAIL" \
    --member "user@example.com" \
    --role "roles/iam.serviceAccountUser"

如需了解如何授予权限,请参阅授予、更改和撤消对资源的访问权限

使用用户管理的服务帐号部署新服务

如果您还没有用户管理的服务帐号,请先创建一个服务帐号

您可以在创建新服务时使用 Cloud Console、gcloud 工具或 API (YAML) 设置 Cloud Run 服务的服务帐号: 部署新修订版本

控制台

  1. 转到 Cloud Run

  2. 如果您是要配置一个新服务来作为部署目标,请点击创建服务。如果您要配置现有服务,请点击该服务,然后点击修改和部署新的修订版本

  3. 如果您要配置新服务,请根据需要填写初始服务设置页面,然后点击下一步 > 高级设置,以访问服务配置页面。

  4. 点击安全标签。

    图片

  5. 点击服务帐号下拉列表,然后选择所需的服务帐号。

  6. 点击创建部署

gcloud

您可以使用以下命令更新现有服务以拥有新的运行时服务帐号:

gcloud run services update SERVICE --service-account SERVICE_ACCOUNT

替换:

  • SERVICE 替换为您的服务名称。
  • SERVICE_ACCOUNT 替换为与新身份关联的服务帐号:此值是服务帐号的电子邮件地址,例如 example@myproject.iam.gserviceaccount.com

您还可以在部署期间使用以下命令设置服务帐号:

gcloud run deploy --image IMAGE_URL --service-account SERVICE_ACCOUNT

替换:

  • IMAGE_URL 替换为对容器映像的引用,例如 us-docker.pkg.dev/cloudrun/container/hello:latest
  • SERVICE_ACCOUNT 替换为与新身份关联的服务帐号:此值是服务帐号的电子邮件地址,例如 example@myservice.iam.gserviceaccount.com

YAML

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

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

    gcloud run services describe SERVICE --format export > service.yaml
  2. 更新 serviceAccountName: 特性:

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: SERVICE
    spec:
      template:
        spec:
          serviceAccountName: SERVICE_ACCOUNT

    替换

    • SERVICE 替换为您的 Cloud Run 服务的名称。
    • SERVICE_ACCOUNT 替换为与新身份关联的服务帐号:此值是服务帐号的电子邮件地址,例如 example@myproject.iam.gserviceaccount.com
  3. 使用以下命令将服务替换为其新配置:

    gcloud run services replace service.yaml

使用其他项目中的服务帐号

您还可以使用与 Cloud Run 服务位于不同 Google Cloud 项目中的用户管理的服务帐号。如果该服务帐号和 Cloud Run 服务位于不同的项目中:

  • 包含该服务帐号的项目要求将组织政策 iam.disableCrossProjectServiceAccountUsage 在文件夹级层设置为 false 或未实施,或从项目级层设置继承该配置。默认情况下,该设置为 true

  • 服务帐号要求 roles/iam.serviceAccountTokenCreator 具有部署项目服务代理的角色成员资格:

    service-PROJECT_NUMBER@serverless-robot-prod.iam.gserviceaccount.com
    

    其中,PROJECT_NUMBER 是项目的编号。

  • 该服务帐号要求对执行部署操作的身份(用户或自动化)具有 roles/iam.serviceAccountUser 的角色成员资格。

您可以将角色成员资格直接应用于服务帐号资源,也可以从资源层次结构中的更高级层继承。

提取身份和访问令牌

如果您的 Cloud Run 服务的代码使用 Google Cloud 客户端库,则无需提取身份或访问令牌。这些客户端库将使用 Cloud Run 服务的运行时服务帐号自动检测和进行身份验证。

在 Cloud Run 服务上运行的自定义代码可以使用元数据服务器来提取身份令牌和访问令牌。您无法直接从本地机器查询此元数据服务器,因为元数据服务器仅适用于在 Google Cloud 上运行的工作负载。

访问令牌

您可以使用 OAuth 2.0 访问令牌来调用大多数 Google API。如需生成访问令牌,请执行以下操作:

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

默认情况下,访问令牌具有 cloud-platform 范围,因此允许访问所有 Google Cloud Platform API(假设 IAM 也允许访问)。要访问其他 Google 服务或 Google Cloud API,您需要提取具有适当范围的访问令牌。要指定不同的范围,请执行以下操作:

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

其中,SCOPES 是所请求 OAuth 范围的列表(以英文逗号分隔),例如:

https://www.googleapis.com/auth/drive,https://www.googleapis.com/auth/spreadsheets

要查找所需的范围,请参阅完整的 Google OAuth 范围列表。 您还可以详细了解如何提取访问令牌

身份令牌

您可在调用其他 Cloud Run 服务或调用可验证身份令牌的服务时使用身份令牌。

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

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

获取创建专用服务帐号的建议

Recommender 服务会自动提供使用最低必需权限创建专用服务帐号的建议。

后续步骤

了解如何管理对服务的访问权限,或如何向服务对开发者、服务和最终用户进行安全身份验证

对于使用服务身份来最大程度降低安全风险的应用的端到端演示,请按照《教程:保护 Cloud Run 服务安全》执行操作。