服务帐号

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

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

什么是服务帐号?

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

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

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

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

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

用户管理的服务帐号

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

新的服务帐号

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

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

Compute Engine 默认服务帐号

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

[PROJECT_NUMBER]-compute@developer.gserviceaccount.com

默认服务帐号是由 Google 自动创建并添加到您的帐号中的,但您拥有该帐号的完全控制权限。

当您使用 gcloud 命令行工具或 Google Cloud Platform Console 创建实例时,系统会自动启用以具有以下访问权限范围的默认服务帐号来运行该实例:

  • 对 Google 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 版)所需的服务管理功能的只读权限:
    https://www.googleapis.com/auth/service.management.readonly
  • 对 Google Cloud Endpoints(Alpha 版)所需的服务控制功能的读/写权限:
    https://www.googleapis.com/auth/servicecontrol

您可以在 Google Cloud Platform Console 中更改默认服务帐号。

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

您可以从项目中删除此服务帐号,但这样做可能会导致依赖于该服务帐号的凭据的任何应用运行失败。如果您不小心删除了默认服务帐号,则可以与 Compute Engine 团队联系以尝试将该帐号重新添加到您的项目中。

总之,默认服务帐号具有以下特点:

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

Google 管理的服务帐号

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

Google API 服务帐号

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

[PROJECT_NUMBER]@cloudservices.gserviceaccount.com

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

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

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

Compute Engine 系统服务帐号

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

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

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

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

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

服务帐号权限

设置要作为服务帐号运行的实例时,服务帐号的访问级别由授予实例的访问权限范围和授予服务帐号的 IAM 角色的组合决定。您需要配置访问权限范围和 IAM 角色,才能成功设置要以服务帐号身份运行的实例。实质上来讲:

  • 访问权限范围授予实例对 API 方法的潜在访问权限。
  • IAM 限制只有授予服务帐号的角色拥有这些权限。

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

您可以从许多访问权限范围中进行选择,但您也可以设置 cloud-platform 访问权限范围,从而授权访问所有 Cloud Platform 服务,然后通过授予 IAM 角色来限制访问权限:

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

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

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

服务帐号仅具有由三个 IAM 角色授予的权限。尽管存在 Cloud Platform 访问权限范围,但该帐号无法执行这些角色之外的操作。

相反,如果您授予限制性更高的范围,例如 Cloud Storage 只读范围 (https://www.googleapis.com/auth/devstorage.read_only),然后在服务帐号中设置 roles/storage.objectAdmin 角色,则该实例将无法管理 Google Cloud Storage 对象,即使您为其授予 roles/storage.ObjectAdmin 角色也是如此。这是因为 Cloud Storage 只读范围不授权实例操作 Cloud Storage 数据。

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

访问权限范围

访问权限范围是为实例指定权限的传统方法。在存在 IAM 角色之前,访问权限范围是授予服务帐号权限的唯一机制。尽管它们现在不是授予权限的主要方式,但在将实例配置为以服务帐号的身份运行时,您仍必须设置访问权限范围

访问权限范围适用于每个实例:在创建实例时设置访问权限范围,访问权限范围仅在实例的生命周期内持续存在。仅当您在服务帐号所属的项目上启用了相应的 API 时,访问权限范围才有效。例如,在虚拟机实例上授予 Google Cloud Storage 的访问权限范围,只有在项目上启用了 Cloud Storage API 后,实例才会调用 Cloud Storage API。如果项目未启用 API,则访问权限范围无效。

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

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

IAM 角色

除了设置访问权限范围外,还必须向服务帐号授予正确的 IAM 角色,来决定该帐号拥有的访问级别。例如,您可以向服务帐号授予 IAM 角色,以管理 Google Cloud Storage 对象和/或管理 Google Cloud Storage 存储分区,从而限制该帐号只能拥有这些角色授予的权限。

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

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

    如果没有您所需访问级别的 IAM 角色,则可以授予原始角色中的一个,例如项目编辑者。

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

    在创建虚拟机实例时,不能仅在服务帐号上设置 IAM 角色而省略访问权限范围。服务帐号的访问级别由访问权限范围和 IAM 角色共同决定,因此您必须配置访问权限范围和 IAM 角色才能使服务帐号正常工作。

后续步骤

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

发送以下问题的反馈:

此网页
Compute Engine 文档