删除和恢复删除的服务账号

本页面介绍如何使用 Identity and Access Management (IAM) API、Google Cloud 控制台和 gcloud 命令行工具删除和恢复删除的服务账号。

准备工作

  • 启用 IAM API。

    启用 API

  • 设置身份验证。

    选择标签页以了解您打算如何使用本页面上的示例:

    控制台

    当您使用 Google Cloud 控制台访问 Google Cloud 服务和 API 时,无需设置身份验证。

    gcloud

    您可以从以下任一开发环境使用本页面上的 gcloud CLI 示例:

    • Cloud Shell:如需使用已设置 gcloud CLI 的在线终端,请激活 Cloud Shell。

      Cloud Shell 会话会在页面底部启动,并显示命令行提示符。该会话可能需要几秒钟来完成初始化。

    • 本地 shell:如需在本地开发环境中使用 gcloud CLI,请安装初始化 gcloud CLI。

    C++

    如需从本地开发环境使用本页面上的 C++ 示例,请安装并初始化 gcloud CLI,然后使用用户凭据设置应用默认凭据。

    1. 安装 Google Cloud CLI。
    2. 如需初始化 gcloud CLI,请运行以下命令:

      gcloud init
    3. 为您的 Google 账号创建本地身份验证凭据:

      gcloud auth application-default login

    如需了解详情,请参阅 Google Cloud 身份验证文档中的为本地开发环境设置身份验证

    C#

    如需从本地开发环境使用本页面上的 .NET 示例,请安装并初始化 gcloud CLI,然后使用用户凭据设置应用默认凭据。

    1. 安装 Google Cloud CLI。
    2. 如需初始化 gcloud CLI,请运行以下命令:

      gcloud init
    3. 为您的 Google 账号创建本地身份验证凭据:

      gcloud auth application-default login

    如需了解详情,请参阅 Google Cloud 身份验证文档中的为本地开发环境设置身份验证

    Go

    如需从本地开发环境使用本页面上的 Go 示例,请安装并初始化 gcloud CLI,然后使用用户凭据设置应用默认凭据。

    1. 安装 Google Cloud CLI。
    2. 如需初始化 gcloud CLI,请运行以下命令:

      gcloud init
    3. 为您的 Google 账号创建本地身份验证凭据:

      gcloud auth application-default login

    如需了解详情,请参阅 Google Cloud 身份验证文档中的为本地开发环境设置身份验证

    Java

    如需从本地开发环境使用本页面上的 Java 示例,请安装并初始化 gcloud CLI,然后使用用户凭据设置应用默认凭据。

    1. 安装 Google Cloud CLI。
    2. 如需初始化 gcloud CLI,请运行以下命令:

      gcloud init
    3. 为您的 Google 账号创建本地身份验证凭据:

      gcloud auth application-default login

    如需了解详情,请参阅 Google Cloud 身份验证文档中的为本地开发环境设置身份验证

    Python

    如需从本地开发环境使用本页面上的 Python 示例,请安装并初始化 gcloud CLI,然后使用用户凭据设置应用默认凭据。

    1. 安装 Google Cloud CLI。
    2. 如需初始化 gcloud CLI,请运行以下命令:

      gcloud init
    3. 为您的 Google 账号创建本地身份验证凭据:

      gcloud auth application-default login

    如需了解详情,请参阅 Google Cloud 身份验证文档中的为本地开发环境设置身份验证

    REST

    如需在本地开发环境中使用本页面上的 REST API 示例,请使用您提供给 gcloud CLI 的凭据。

      安装 Google Cloud CLI,然后通过运行以下命令初始化 Google Cloud CLI:

      gcloud init

  • 了解 IAM 服务账号

所需的角色

如需获得删除和恢复删除的服务账号所需的权限,请让管理员向您授予项目的以下 IAM 角色:

如需详细了解如何授予角色,请参阅管理访问权限

您也可以通过自定义角色或其他预定义角色来获取所需的权限。

如需详细了解这些角色,请参阅服务账号角色

IAM 基本角色也具有管理服务账号的权限。您不应在生产环境中授予基本角色,但可以在开发或测试环境中授予这些角色。

删除服务账号

您删除服务账号后,应用将无法再通过该服务账号访问 Google Cloud 资源。如果您删除默认的 App Engine 和 Compute Engine 服务账号,则使用这些服务账号的 App Engine 应用和 Compute Engine 虚拟机实例将无法再访问项目中的资源。

请谨慎删除服务账号。在删除之前,请确保您的关键应用不再使用该服务账号。如果您不确定某个服务账号是否正在使用,Google 建议您停用该服务账号,而不是将其删除。已停用的服务账号可以在需要时重新启用。

如果您要恢复已删除的服务账号,可以恢复删除(如果自删除服务账号后已过去 30 天或更短时间)。30 天后,IAM 会永久移除该服务账号。服务账号被永久移除后,即使您提交支持请求,Google Cloud 也无法将其恢复。

如需进一步降低删除必要服务账号的风险,您还可以启用更改风险建议。如果您尝试删除 Google Cloud 已确定为重要账号的服务账号,更改风险建议会生成警告。

如果您删除服务账号,然后创建一个具有相同名称的新服务账号,新服务账号将被视为单独的身份;它不会继承那些授予已删除的服务账号的角色。相反,如果您删除某个服务账号,然后恢复删除,那么该服务账号的身份不会更改,并且服务账号会保留其角色。

删除服务账号时,其角色绑定不会立即移除;它们将在 60 天内自动从系统中清除。在此之前,该服务账号显示在角色绑定中,并且带有 deleted: 前缀和 ?uid=NUMERIC_ID 后缀,其中 NUMERIC_ID 是服务账号的唯一数字 ID。

已删除的服务账号不计入您的服务账号配额

控制台

  1. 在 Google Cloud 控制台中,转到服务账号页面。

    转到“服务账号”

  2. 选择一个项目。

  3. 选择要删除的服务账号,然后点击删除

gcloud

  1. 在 Google Cloud 控制台中,激活 Cloud Shell。

    激活 Cloud Shell

    Cloud Shell 会话随即会在 Google Cloud 控制台的底部启动,并显示命令行提示符。Cloud Shell 是一个已安装 Google Cloud CLI 且已为当前项目设置值的 Shell 环境。该会话可能需要几秒钟时间来完成初始化。

  2. 执行 gcloud iam service-accounts delete 命令可删除服务账号。

    命令:

    gcloud iam service-accounts delete \
        SA_NAME@PROJECT_ID.iam.gserviceaccount.com

    输出如下:

    Deleted service account SA_NAME@PROJECT_ID.iam.gserviceaccount.com

C++

如需了解如何安装和使用 IAM 客户端库,请参阅 IAM 客户端库。如需了解详情,请参阅 IAM C++ API 参考文档

如需向 IAM 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅准备工作

namespace iam = ::google::cloud::iam_admin_v1;
[](std::string const& name) {
  iam::IAMClient client(iam::MakeIAMConnection());
  auto response = client.DeleteServiceAccount(name);
  if (!response.ok()) throw std::runtime_error(response.message());
  std::cout << "ServiceAccount successfully deleted.\n";
}

C#

如需了解如何安装和使用 IAM 客户端库,请参阅 IAM 客户端库。如需了解详情,请参阅 IAM C# API 参考文档

如需向 IAM 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅准备工作


using System;
using Google.Apis.Auth.OAuth2;
using Google.Apis.Iam.v1;

public partial class ServiceAccounts
{
    public static void DeleteServiceAccount(string email)
    {
        var credential = GoogleCredential.GetApplicationDefault()
            .CreateScoped(IamService.Scope.CloudPlatform);
        var service = new IamService(new IamService.Initializer
        {
            HttpClientInitializer = credential
        });

        string resource = "projects/-/serviceAccounts/" + email;
        service.Projects.ServiceAccounts.Delete(resource).Execute();
        Console.WriteLine("Deleted service account: " + email);
    }
}

Go

如需了解如何安装和使用 IAM 客户端库,请参阅 IAM 客户端库。如需了解详情,请参阅 IAM Go API 参考文档

如需向 IAM 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅准备工作

import (
	"context"
	"fmt"
	"io"

	iam "google.golang.org/api/iam/v1"
)

// deleteServiceAccount deletes a service account.
func deleteServiceAccount(w io.Writer, email string) error {
	ctx := context.Background()
	service, err := iam.NewService(ctx)
	if err != nil {
		return fmt.Errorf("iam.NewService: %w", err)
	}

	_, err = service.Projects.ServiceAccounts.Delete("projects/-/serviceAccounts/" + email).Do()
	if err != nil {
		return fmt.Errorf("Projects.ServiceAccounts.Delete: %w", err)
	}
	fmt.Fprintf(w, "Deleted service account: %v", email)
	return nil
}

Java

如需了解如何安装和使用 IAM 客户端库,请参阅 IAM 客户端库。如需了解详情,请参阅 IAM Java API 参考文档

如需向 IAM 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅准备工作

import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.json.gson.GsonFactory;
import com.google.api.services.iam.v1.Iam;
import com.google.api.services.iam.v1.IamScopes;
import com.google.auth.http.HttpCredentialsAdapter;
import com.google.auth.oauth2.GoogleCredentials;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.util.Collections;

public class DeleteServiceAccount {

  // Deletes a service account.
  public static void deleteServiceAccount(String projectId, String serviceAccountName) {
    // String projectId = "my-project-id";
    // String serviceAccountName = "my-service-account-name";

    Iam service = null;
    try {
      service = initService();
    } catch (IOException | GeneralSecurityException e) {
      System.out.println("Unable to initialize service: \n" + e.toString());
      return;
    }

    String serviceAccountEmail = serviceAccountName + "@" + projectId + ".iam.gserviceaccount.com";
    try {
      service
          .projects()
          .serviceAccounts()
          .delete("projects/-/serviceAccounts/" + serviceAccountEmail)
          .execute();

      System.out.println("Deleted service account: " + serviceAccountEmail);
    } catch (IOException e) {
      System.out.println("Unable to delete service account: \n" + e.toString());
    }
  }

  private static Iam initService() throws GeneralSecurityException, IOException {
    // Use the Application Default Credentials strategy for authentication. For more info, see:
    // https://cloud.google.com/docs/authentication/production#finding_credentials_automatically
    GoogleCredentials credential =
        GoogleCredentials.getApplicationDefault()
            .createScoped(Collections.singleton(IamScopes.CLOUD_PLATFORM));
    // Initialize the IAM service, which can be used to send requests to the IAM API.
    Iam service =
        new Iam.Builder(
                GoogleNetHttpTransport.newTrustedTransport(),
                GsonFactory.getDefaultInstance(),
                new HttpCredentialsAdapter(credential))
            .setApplicationName("service-accounts")
            .build();
    return service;
  }
}

Python

如需了解如何安装和使用 IAM 客户端库,请参阅 IAM 客户端库。如需了解详情,请参阅 IAM Python API 参考文档

如需向 IAM 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅准备工作

import os

from google.oauth2 import service_account  # type: ignore
import googleapiclient.discovery  # type: ignore

def delete_service_account(email: str) -> None:
    """Deletes a service account."""

    credentials = service_account.Credentials.from_service_account_file(
        filename=os.environ["GOOGLE_APPLICATION_CREDENTIALS"],
        scopes=["https://www.googleapis.com/auth/cloud-platform"],
    )

    service = googleapiclient.discovery.build("iam", "v1", credentials=credentials)

    service.projects().serviceAccounts().delete(
        name="projects/-/serviceAccounts/" + email
    ).execute()

    print("Deleted service account: " + email)

REST

serviceAccounts.delete 方法可删除服务账号。

在使用任何请求数据之前,请先进行以下替换:

  • PROJECT_ID:您的 Google Cloud 项目 ID。项目 ID 是字母数字字符串,例如 my-project
  • SA_ID:您的服务账号的 ID。此 ID 可以是服务账号的电子邮件地址(格式为 SA_NAME@PROJECT_ID.iam.gserviceaccount.com)或服务账号的唯一数字 ID。

HTTP 方法和网址:

DELETE https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/SA_ID

如需发送您的请求,请展开以下选项之一:

如果成功,则响应正文将为空。

恢复删除的服务账号

在某些情况下,您可以使用 undelete 命令恢复已删除的服务账号。如果已删除的服务账号满足以下条件,则通常可以对该服务账号恢复删除:

  • 服务账号删除的时间不超过 30 天。

    30 天后,IAM 会永久移除该服务账号。服务账号被永久移除后,即使您提交支持请求,Google Cloud 也无法将其恢复。

  • 现有服务账号与已删除的服务账号的名称不同。

    例如,假设您意外删除了服务账号 my-service-account@project-id.iam.gserviceaccount.com。您仍需要具有此名称的服务账号,因此您创建了一个具有相同名称的新服务账号 my-service-account@project-id.iam.gserviceaccount.com

    新服务账号不会继承已删除的服务账号的权限。实际上,它与已删除的服务账号完全没有关系。但是,您无法恢复删除的原始服务账号,因为新服务账号使用了与它相同的名称。

    要解决此问题,请删除新服务账号,然后尝试恢复删除的原始服务账号。

如果您无法恢复已删除的服务账号,可以创建一个具有相同名称的新服务账号;撤消已删除的服务账号中的所有角色;然后向新服务账号授予相同的角色。如需了解详情,请参阅包含已删除主账号的政策

查找已删除服务账号的数字 ID

当您恢复删除的服务账号时,必须提供其数字 ID。数字 ID 是唯一标识服务账号的 21 位数字,例如 123456789012345678901。例如,如果您删除某一服务账号,然后创建一个具有相同名称的新服务账号,原始服务账号和新服务账号将具有不同的数字 ID。

如果您知道某项允许政策中的绑定包含已删除的服务账号,则可以获取允许政策,然后在允许政策中找到相应的数字 ID。数字 ID 附加在已删除的服务账号的名称的后面。例如,在此允许政策中,已删除的服务账号的数字 ID 为 123456789012345678901

{
  "version": 1,
  "etag": "BwUjMhCsNvY=",
  "bindings": [
    {
      "members": [
        "deleted:serviceAccount:my-service-account@project-id.iam.gserviceaccount.com?uid=123456789012345678901"
      ],
      "role": "roles/iam.serviceAccountUser"
    },
  ]
}

数字 ID 仅附加到已删除主账号的名称中。

或者,您可以在审核日志中搜索删除了服务账号的 DeleteServiceAccount 操作:

  1. 在 Google Cloud 控制台中,转到日志浏览器页面。

    转到日志浏览器

  2. 在查询编辑器中输入以下查询,将 SERVICE_ACCOUNT_EMAIL 替换为您的服务账号的电子邮件地址(例如 my-service-account@project-id.iam.gserviceaccount.com):

    resource.type="service_account"
    resource.labels.email_id="SERVICE_ACCOUNT_EMAIL"
    "DeleteServiceAccount"
    
  3. 如果服务账号已被删除超过 1 小时,请点击 schedule 过去 1 小时,从下拉列表中选择更长的时间段,然后点击应用

  4. 点击运行查询。日志浏览器会显示具有您指定的名称的影响服务账号的 DeleteServiceAccount 操作。

  5. 执行以下任一操作,找到并记下已删除服务账号的数字 ID:

    • 如果搜索结果仅包含一项 DeleteServiceAccount 操作,请在日志字段窗格的唯一 ID 字段中查找数字 ID。

    • 如果搜索结果显示多个日志,请执行以下操作:

      1. 找到正确的日志条目。如需查找正确的日志条目,请点击日志条目旁边的 展开箭头。查看日志条目的详细信息,并确定日志条目是否显示您要撤消的操作。重复此过程,直至找到正确的日志条目。

      2. 在正确的日志条目中,找到服务账号的数字 ID。如需查找数字 ID,请展开日志条目的 protoPayload 字段,然后找到 resourceName 字段。

        数字 ID 是 resourceName 字段中 serviceAccounts 之后的所有内容。

按数字 ID 恢复删除的服务账号

找到已删除的服务账号的数字 ID 后,您可以尝试恢复删除的服务账号。

gcloud

  1. 在 Google Cloud 控制台中,激活 Cloud Shell。

    激活 Cloud Shell

    Cloud Shell 会话随即会在 Google Cloud 控制台的底部启动,并显示命令行提示符。Cloud Shell 是一个已安装 Google Cloud CLI 且已为当前项目设置值的 Shell 环境。该会话可能需要几秒钟时间来完成初始化。

  2. 执行 gcloud beta iam service-accounts undelete 命令可恢复删除的服务账号。

    命令:

    gcloud beta iam service-accounts undelete ACCOUNT_ID

    输出:

    restoredAccount:
        email: SA_NAME@PROJECT_ID.iam.gserviceaccount.com
        etag: BwWWE7zpApg=
        name: projects/PROJECT_ID/serviceAccounts/SA_NAME@PROJECT_ID.iam.gserviceaccount.com
        oauth2ClientId: '123456789012345678901'
        projectId: PROJECT_ID
        uniqueId: 'ACCOUNT_ID'

REST

serviceAccounts.undelete 方法可恢复已删除的服务账号。

在使用任何请求数据之前,请先进行以下替换:

  • PROJECT_ID:您的 Google Cloud 项目 ID。项目 ID 是字母数字字符串,例如 my-project
  • SA_NUMERIC_ID:服务账号的唯一数字 ID。

HTTP 方法和网址:

POST https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/SA_NUMERIC_ID:undelete

如需发送您的请求,请展开以下选项之一:

如果可以恢复删除的账号,您会收到一个 200 OK 响应代码,其中包含已恢复服务账号的详细信息,如下所示:

{
  "restoredAccount": {
    "name": "projects/my-project/serviceAccounts/my-service-account@my-project.iam.gserviceaccount.com",
    "projectId": "my-project",
    "uniqueId": "123456789012345678901",
    "email": "my-service-account@my-project.iam.gserviceaccount.com",
    "displayName": "My service account",
    "etag": "BwUp3rVlzes=",
    "description": "A service account for running jobs in my project",
    "oauth2ClientId": "987654321098765432109"
  }
}

后续步骤

自行试用

如果您是 Google Cloud 新手,请创建一个账号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。

免费开始使用