服务帐号

本页面介绍服务帐号和服务帐号权限,这些权限受适用于虚拟机实例的访问权限范围以及适用于服务帐号的 Cloud Identity and Access Management (IAM) 角色的限制。如需了解如何创建和使用服务帐号,请阅读为实例创建和启用服务帐号这篇文档。

服务帐号是一种特殊帐号,Compute Engine 实例上运行的服务和应用可以使用此帐号与其他 Google Cloud Platform API 进行交互。应用可以使用服务帐号凭据向自身授权使用一组 API,并在已授予服务帐号和虚拟机实例的权限范围内执行操作。此外,您还可以创建防火墙规则,按照与每个实例相关联的服务帐号来允许或拒绝传入和传出实例的流量。

什么是服务帐号?

服务帐号是某个实例或应用可用来代表您运行 API 请求的身份标识。

此标识用于让其他 Google Cloud Platform 服务能够识别出虚拟机实例上运行的应用。例如,如果您编写的应用需要在 Cloud Storage 上读取和写入文件,则该应用必须首先向 Cloud Storage API 进行身份验证。您可以创建一个服务帐号并向该服务帐号授予对 Cloud Storage API 的访问权限。然后,您需要更新应用以将服务帐号凭据传递给 Cloud Storage API。您的应用可以无缝地向该 API 进行身份验证,而无需在实例、映像或应用代码中嵌入任何密钥或用户凭据。

如果您的服务帐号具有必要的 IAM 权限,则这些服务帐号可以创建和管理实例和其他资源。仅当您在项目或资源级层向服务帐号授予必要的 IAM 权限时,服务帐号才能修改或删除资源。您还可以更改与实例关联的服务帐号。

一个实例只能有一个服务帐号,并且该服务帐号必须是在与实例相同的项目中创建的。

Compute Engine 实例可以使用两种类型的服务帐号:

  • 用户管理的服务帐号
  • Google 管理的服务帐号

用户管理的服务帐号

用户管理的服务帐号包括您明确创建的新的服务帐号和 Compute Engine 默认服务帐号。

新的服务帐号

您可以使用 Cloud Identity and Access Management 创建和管理自己的服务帐号。在您创建了某个帐号后,请向该帐号授予 IAM 角色,并将实例设置为以该服务帐号的身份运行。在启用了服务帐号的实例上运行的应用可以使用该帐号的凭据向其他 Google API 发出请求。

如需创建和设置新的服务帐号,请参阅为实例创建和启用服务帐号

Compute Engine 默认服务帐号

新项目附带 Compute Engine 默认服务帐号,该帐号采用了如下电子邮件地址形式:

[PROJECT_NUMBER]-compute@developer.gserviceaccount.com

Google 会创建 Compute Engine 默认服务帐号并将其自动添加到您的项目中,但您可以完全控制此帐号。

虽然 Compute Engine 默认服务帐号是使用 Cloud IAM Project Editor 角色创建的,但您可以修改服务帐号的角色,从而安全地限制服务帐号可以访问哪些 Google API。

您可以从项目中删除此服务帐号,但这样做可能会导致依赖于该服务帐号的凭据的任何应用运行失败。如果您不小心删除了 Compute Engine 默认服务帐号,可以尝试在 30 天内恢复该帐号。如需了解详情,请参阅创建和管理服务帐号

概括来讲,Compute Engine 默认服务帐号具有以下特性:

  • 由 Google Cloud Platform Console 项目自动创建,并具有一个自动生成的名称和电子邮件地址。
  • 使用 Cloud IAM Project Editor 角色自动添加到项目中。
  • gcloud 命令行工具和 GCP Console 创建的所有实例上默认启用。您可以在创建实例时指定其他服务帐号或明确为实例停用服务帐号,从而替换此设置。

将服务帐号与实例相关联

使用 gcloud 命令行工具或 Google Cloud Platform Console 创建实例时,您可以指定该实例在调用 GCP API 时使用的服务帐号。系统将自动为该实例配置以下访问权限范围

  • 对 Cloud Storage 的只读权限:
    https://www.googleapis.com/auth/devstorage.read_only
  • 记录 Compute Engine 日志的写入权限:
    https://www.googleapis.com/auth/logging.write
  • 将指标数据发布到您的 Google Cloud 项目的写入权限:
    https://www.googleapis.com/auth/monitoring.write
  • 对 Google Cloud Endpoints(Alpha 版)所需的 Service Management 功能的只读权限:
    https://www.googleapis.com/auth/service.management.readonly
  • 对 Google Cloud Endpoints(Alpha 版)所需的 Service Control 功能的读/写权限:
    https://www.googleapis.com/auth/servicecontrol

针对通过客户端库和 gcloud 发出的请求,访问权限范围定义了其默认的 OAuth 范围。因此,在通过 OAuth 进行身份验证时,访问权限范围可能会限制对 API 方法的访问权限,但不会扩展到其他身份验证协议(如 gRPC)。因此,最佳做法是在实例上设置完整的 cloud-platform 访问权限范围,然后向服务帐号授予 IAM 角色,从而安全地限制服务帐号的访问权限。如需了解详情,请参阅服务帐号权限

如果您不使用 gcloud 命令行工具或 Google Cloud Platform Console 而是通过直接向 API 发出请求来创建一个实例,则该实例不会启用默认服务帐号。但是,您仍然可以通过将默认服务帐号明确指定为请求负载的一部分来启用此帐号。

Google 管理的服务帐号

这些服务帐号由 Google 创建和管理,并自动分配给您的项目。这些帐号代表了不同的 Google 服务,每个帐号都对您的 Google Cloud Platform 项目拥有某种级别的访问权限。

Google API 服务帐号

除默认服务帐号外,所有启用了 Compute Engine 的项目都附带有一个 Google API 服务帐号,该帐号采用了如下电子邮件地址形式:

[PROJECT_NUMBER]@cloudservices.gserviceaccount.com

此服务帐号专门用于代表您运行内部 Google 流程。此帐号归 Google 所有,而且并未列在 GCP Console 的服务帐号部分中。默认情况下,此帐号会自动获得项目的 Editor 角色,并列在 GCP Console 的 IAM 部分中。只有当项目被删除时,系统才会删除此服务帐号。但是,您可以更改已授予此帐号的角色,包括撤消对您项目的所有访问权限。

某些资源依赖于此服务帐号以及已授予此服务帐号的默认 Editor 权限。例如,托管实例组和自动调节功能使用此帐号的凭据来创建、删除和管理实例。如果您撤消了已授予此服务帐号的权限,或者修改权限时未授予创建实例的权限,则会导致托管实例组和自动调节功能停止工作。

出于这些原因,建议您不要修改此服务帐号的角色。

Compute Engine 系统服务帐号

所有启用了 Compute Engine API 的项目都有一个 Compute Engine System 服务帐号,该帐号采用了如下电子邮件地址形式:

service-[PROJECT_NUMBER]@compute-system.iam.gserviceaccount.com

此服务帐号专为 Compute Engine 在您的项目中执行其服务任务而设计。它依赖于您的 Google Cloud 项目上授予的服务代理 IAM 政策。它也是 Compute Engine 用于访问虚拟机实例上由客户拥有的服务帐号的一种服务帐号。此帐号为 Google 拥有,但专供您的项目使用,并会列在 GCP Console 的“服务帐号”和“IAM”部分中。默认情况下,此帐号会自动获得项目的 compute.serviceAgent 角色。

只有在删除项目时才会删除此服务帐号。您可以更改已授予此帐号的角色,也可以撤消此帐号对项目的所有访问权限。撤消或更改此服务帐号的权限会导致 Compute Engine 无法访问您的虚拟机上的服务帐号的身份,并可能导致在虚拟机内运行的软件中断。

出于这些原因,建议您不要修改此服务帐号的角色。

服务帐号权限

在设置要以服务帐号的身份运行的实例时,您可以通过授予该服务帐号的 IAM 角色确定服务帐号的访问权限级别。如果服务帐号没有 IAM 角色,则无法在该实例上运行任何 API 方法。

此外,针对通过 gcloud 工具和实例上的客户端库发出的请求,实例的访问权限范围决定了其默认的 OAuth 范围。因此,通过 OAuth 进行身份验证时,访问权限范围可能会进一步限制对 API 方法的访问权限,但不会扩展到其他身份验证协议(如 gRPC)。

最佳做法是在实例上设置完整的 cloud-platform 访问权限范围,然后使用 IAM 角色安全地限制服务帐号的访问权限。

实质上来讲:

  • IAM 根据授予该服务帐号的 IAM 角色限制对 API 的访问权限。
  • 通过 OAuth 进行身份验证时,访问权限范围可能会进一步限制对 API 方法的访问权限。

访问权限范围和 IAM 角色在以下部分中详细介绍。

您可以从多个访问权限范围中进行选择,但也可以只设置 cloud-platform 访问权限范围(这是所有 Google Cloud Platform 服务的 OAuth 范围),然后通过向服务帐号授予 IAM 角色安全地限制其访问权限。

https://www.googleapis.com/auth/cloud-platform

例如,如果您在某个实例上启用了 cloud-platform 访问权限范围,然后授予了以下预定义 IAM 角色

  • roles/compute.instanceAdmin.v1
  • roles/storage.objectViewer
  • roles/compute.networkAdmin

那么该服务帐号只拥有这三种 IAM 角色所包含的权限。尽管存在 Google Cloud Platform 访问权限范围,但该帐号无法执行这些角色之外的操作。

另一方面,如果您在实例上授予限制性更高的范围,例如 Cloud Storage 只读范围 (https://www.googleapis.com/auth/devstorage.read_only),然后在服务帐号中设置 roles/storage.objectAdmin 管理员角色,那么默认情况下,来自 gcloud 工具和客户端库的请求将无法管理该实例中的 Cloud Storage 对象,即使您向服务帐号授予了 roles/storage.ObjectAdmin 角色也是如此。这是因为 Cloud Storage 只读范围不会授予实例处理 Cloud Storage 数据的权限。

通常,每个 API 方法的文档都会列出该方法所需的范围。例如,instances.insert 方法在其授权部分中提供了有效范围的列表。

IAM 角色

您必须向服务帐号授予相应的 IAM 角色,该服务帐号才能访问相关的 API 方法。

例如,您可以向服务帐号授予 IAM 角色,以管理 Cloud Storage 对象和/或 Cloud Storage 存储分区,从而限定该帐号拥有这些角色授予的权限。

IAM 角色是授予帐号的。这意味着,在您将 IAM 角色授予某个服务帐号后,任何以该服务帐号身份运行的实例都可以使用该角色。另外,请注意:

  • 一些 IAM 角色目前处于测试阶段。

    如果您没有所需访问权限级别的预定义 IAM 角色,则可以授予一个原初角色(例如 Project Editor),也可以创建和授予自定义角色

  • 您必须在实例上设置访问权限范围才能授予访问权限。

    虽然服务帐号的访问权限级别是由授予该服务帐号的 IAM 角色决定的,但针对通过 gcloud 工具和实例上的客户端库发出的请求,实例的访问权限范围决定了其默认的 OAuth 范围。因此,通过 OAuth 进行身份验证时,访问权限范围可能会进一步限制对 API 方法的访问权限。

访问权限范围

访问权限范围是为实例指定权限的传统方法。 访问权限范围不是安全机制,而是定义来自 gcloud 工具或客户端库的请求中使用的默认 OAuth 范围。注意,在发出未通过 OAuth 进行身份验证的请求(例如 gRPCSignBlob API)时,访问权限范围不起作用。

在配置要以服务帐号身份运行的实例时,您必须设置访问权限范围

最佳做法是在实例上设置完整的 cloud-platform 访问权限范围,然后使用 Cloud IAM 角色安全地限制服务帐号的 API 访问权限。

访问权限范围作用于单个实例。您可以在创建实例时设置访问权限范围,而该访问权限范围只会在该实例的生命周期内保留。

如果您未对该服务帐号所属的项目启用相关 API,那么访问权限范围将不起作用。例如,在虚拟机实例上授予 Cloud Storage 的访问权限范围后,只有对项目启用了 Cloud Storage API 时,实例才能调用 Cloud Storage API。

访问权限范围的示例如下:

  • https://www.googleapis.com/auth/cloud-platform - 对所有 GCP 资源的完全访问权限。
  • https://www.googleapis.com/auth/compute - 对 Compute Engine 方法的完全控制权限。
  • https://www.googleapis.com/auth/compute.readonly - 对 Compute Engine 方法的只读权限。
  • https://www.googleapis.com/auth/devstorage.read_only - 对 Cloud Storage 的只读权限。
  • https://www.googleapis.com/auth/logging.write - 对 Compute Engine 日志的写入权限。

后续步骤

此页内容是否有用?请给出您的反馈和评价:

发送以下问题的反馈:

此网页
Compute Engine 文档