Supprimer et annuler la suppression de comptes de service

Cette page explique comment supprimer et annuler la suppression de comptes de service à l'aide de l'API Cloud IAM (Cloud Identity and Access Management), de la console Google Cloud et de l'outil de ligne de commande gcloud.

Avant de commencer

  • Activez IAM API.

    Activer l'API

  • Configurez l'authentification.

    Sélectionnez l'onglet correspondant à la façon dont vous prévoyez d'utiliser les exemples de cette page :

    Console

    Lorsque vous utilisez la console Google Cloud pour accéder aux services et aux API Google Cloud, vous n'avez pas besoin de configurer l'authentification.

    gcloud

    Vous pouvez utiliser les exemples gcloud CLI de cette page dans l'un des environnements de développement suivants :

    • Cloud Shell : pour utiliser un terminal en ligne avec gcloud CLI déjà configuré, activez Cloud Shell.

      En bas de cette page, une session Cloud Shell démarre et affiche une invite de ligne de commande. L'initialisation de la session peut prendre quelques secondes.

    • Shell local : pour utiliser gcloud CLI dans un environnement de développement local, installez et initialisez gcloud CLI.

    C++

    Pour utiliser les exemples C++ de cette page dans un environnement de développement local, installez et initialisez gcloud CLI, puis configurez le service Identifiants par défaut de l'application à l'aide de vos identifiants utilisateur.

    1. Installez Google Cloud CLI.
    2. Pour initialiser gcloudCLI, exécutez la commande suivante :

      gcloud init
    3. Créez des identifiants d'authentification locaux pour votre compte Google :

      gcloud auth application-default login

    Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local dans la documentation sur l'authentification Google Cloud.

    C#

    Pour utiliser les exemples .NET de cette page dans un environnement de développement local, installez et initialisez gcloud CLI, puis configurez le service Identifiants par défaut de l'application à l'aide de vos identifiants utilisateur.

    1. Installez Google Cloud CLI.
    2. Pour initialiser gcloudCLI, exécutez la commande suivante :

      gcloud init
    3. Créez des identifiants d'authentification locaux pour votre compte Google :

      gcloud auth application-default login

    Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local dans la documentation sur l'authentification Google Cloud.

    Go

    Pour utiliser les exemples Go de cette page dans un environnement de développement local, installez et initialisez gcloud CLI, puis configurez le service Identifiants par défaut de l'application à l'aide de vos identifiants utilisateur.

    1. Installez Google Cloud CLI.
    2. Pour initialiser gcloudCLI, exécutez la commande suivante :

      gcloud init
    3. Créez des identifiants d'authentification locaux pour votre compte Google :

      gcloud auth application-default login

    Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local dans la documentation sur l'authentification Google Cloud.

    Java

    Pour utiliser les exemples Java de cette page dans un environnement de développement local, installez et initialisez gcloud CLI, puis configurez le service Identifiants par défaut de l'application à l'aide de vos identifiants utilisateur.

    1. Installez Google Cloud CLI.
    2. Pour initialiser gcloudCLI, exécutez la commande suivante :

      gcloud init
    3. Créez des identifiants d'authentification locaux pour votre compte Google :

      gcloud auth application-default login

    Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local dans la documentation sur l'authentification Google Cloud.

    Python

    Pour utiliser les exemples Python de cette page dans un environnement de développement local, installez et initialisez gcloud CLI, puis configurez le service Identifiants par défaut de l'application à l'aide de vos identifiants utilisateur.

    1. Installez Google Cloud CLI.
    2. Pour initialiser gcloudCLI, exécutez la commande suivante :

      gcloud init
    3. Créez des identifiants d'authentification locaux pour votre compte Google :

      gcloud auth application-default login

    Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local dans la documentation sur l'authentification Google Cloud.

    REST

    Pour utiliser les exemples d'API REST de cette page dans un environnement de développement local, vous devez utiliser les identifiants que vous fournissez à gcloud CLI.

      Installez Google Cloud CLI, puis initialisez-la en exécutant la commande suivante :

      gcloud init

  • Consultez la documentation relative aux comptes de service IAM.

Rôles requis

Pour obtenir les autorisations nécessaires pour supprimer et annuler la suppression de comptes de service, demandez à votre administrateur de vous accorder les rôles IAM suivants sur le projet :

Pour en savoir plus sur l'attribution de rôles, consultez la section Gérer les accès.

Vous pouvez également obtenir les autorisations requises via des rôles personnalisés ou d'autres rôles prédéfinis.

Pour en savoir plus sur ces rôles, consultez la section Rôles des comptes de service.

Les rôles de base IAM contiennent également les autorisations nécessaires pour gérer les comptes de service. Les rôles de base ne doivent pas être attribués dans un environnement de production, mais ils peuvent être attribués dans un environnement de développement ou de test.

Supprimer un compte de service

Lorsque vous supprimez un compte de service, les applications ne peuvent plus s'en servir pour accéder aux ressources Google Cloud. Si vous supprimez les comptes de service par défaut App Engine et Compute Engine, les applications App Engine et les instances de VM Compute Engine qui utilisent ces comptes de service n'auront plus accès aux ressources du projet.

Soyez prudents lorsque vous supprimez des comptes de service. Avant de supprimer un compte de service, vérifiez qu'il n'est plus utilisé par vos applications critiques. Si vous ne savez pas si un compte de service est utilisé, Google recommande de le désactiver plutôt que de le supprimer. Il est possible de réactiver des comptes de services désactivés si ceux-ci sont encore requis.

Si vous souhaitez restaurer un compte de service supprimé, vous pouvez annuler la suppression s'il s'est écoulé 30 jours ou moins depuis que vous avez supprimé le compte. Au bout de 30 jours, IAM supprime définitivement le compte de service. Google Cloud ne peut pas récupérer le compte de service après sa suppression définitive, même si vous déposez une demande d'assistance.

Pour réduire davantage le risque de suppression d'un compte de service nécessaire, vous pouvez également activer les recommandations de modification des risques. Les recommandations de modification de risque génèrent des avertissements lorsque vous essayez de supprimer des comptes de service identifiés par Google Cloud comme importants.

Si vous supprimez un compte de service, puis créez un compte de service portant le même nom, le nouveau compte de service est traité comme une identité distincte. Il n'hérite pas des rôles attribués au compte de service supprimé. En revanche, lorsque vous supprimez un compte de service, puis que vous annulez sa suppression, l'identité du compte de service ne change pas et le compte de service conserve ses rôles.

Lorsqu'un compte de service est supprimé, ses liaisons de rôle ne sont pas immédiatement supprimées. Elles le sont définitivement du système de façon automatique après un délai maximal de 60 jours. Pendant ce temps, le compte de service apparaît dans les liaisons de rôle avec un préfixe deleted: et un suffixe ?uid=NUMERIC_ID, où NUMERIC_ID est l'ID numérique unique du compte de service.

Les comptes de service supprimés ne sont pas comptabilisés dans votre quota de compte de service.

Console

  1. Dans Google Cloud Console, accédez à la page Comptes de service.

    Accéder à la page "Comptes de service"

  2. Sélectionnez un projet.

  3. Sélectionnez le compte de service que vous souhaitez supprimer, puis cliquez sur Supprimer .

gcloud

  1. Dans la console Google Cloud, activez Cloud Shell.

    Activer Cloud Shell

    En bas de la fenêtre de la console Google Cloud, une session Cloud Shell démarre et affiche une invite de ligne de commande. Cloud Shell est un environnement shell dans lequel Google Cloud CLI est déjà installé, et dans lequel des valeurs sont déjà définies pour votre projet actuel. L'initialisation de la session peut prendre quelques secondes.

  2. Exécutez la commande gcloud iam service-accounts delete pour supprimer un compte de service.

    Commande :

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

    Résultat :

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

C++

Pour savoir comment installer et utiliser la bibliothèque cliente pour IAM, consultez la page Bibliothèques clientes IAM. Pour en savoir plus, consultez la documentation de référence de l'API Cloud IAM C++.

Pour vous authentifier auprès d'IAM, configurez le service Identifiants par défaut de l'application. Pour plus d'informations, consultez la section Avant de commencer.

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#

Pour savoir comment installer et utiliser la bibliothèque cliente pour IAM, consultez la page Bibliothèques clientes IAM. Pour en savoir plus, consultez la documentation de référence de l'API Cloud IAM C#.

Pour vous authentifier auprès d'IAM, configurez le service Identifiants par défaut de l'application. Pour plus d'informations, consultez la section Avant de commencer.


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

Pour savoir comment installer et utiliser la bibliothèque cliente pour IAM, consultez la page Bibliothèques clientes IAM. Pour en savoir plus, consultez la documentation de référence de l'API Cloud IAM Go.

Pour vous authentifier auprès d'IAM, configurez le service Identifiants par défaut de l'application. Pour plus d'informations, consultez la section Avant de commencer.

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

Pour savoir comment installer et utiliser la bibliothèque cliente pour IAM, consultez la page Bibliothèques clientes IAM. Pour en savoir plus, consultez la documentation de référence de l'API Cloud IAM Java.

Pour vous authentifier auprès d'IAM, configurez le service Identifiants par défaut de l'application. Pour plus d'informations, consultez la section Avant de commencer.

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

Pour savoir comment installer et utiliser la bibliothèque cliente pour IAM, consultez la page Bibliothèques clientes IAM. Pour en savoir plus, consultez la documentation de référence de l'API Cloud IAM Python.

Pour vous authentifier auprès d'IAM, configurez le service Identifiants par défaut de l'application. Pour plus d'informations, consultez la section Avant de commencer.

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

La méthode serviceAccounts.delete supprime un compte de service.

Avant d'utiliser les données de requête ci-dessous, effectuez les remplacements suivants :

  • PROJECT_ID : ID de votre projet Google Cloud. Les ID de projet sont des chaînes alphanumériques, telles que my-project.
  • SA_ID : ID de votre compte de service. Il peut s'agir de l'adresse e-mail du compte de service au format SA_NAME@PROJECT_ID.iam.gserviceaccount.com ou de l'ID numérique unique du compte de service.

Méthode HTTP et URL :

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

Pour envoyer votre requête, développez l'une des options suivantes :

Si la requête aboutit, le corps de la réponse sera vide.

Annuler la suppression d'un compte de service

Dans certains cas, vous pouvez utiliser la commande undelete pour annuler la suppression d'un compte de service. Vous pouvez généralement annuler la suppression d'un compte de service s'il répond aux critères suivants :

  • Le compte de service a été supprimé il y a moins de 30 jours.

    Au bout de 30 jours, IAM supprime définitivement le compte de service. Google Cloud ne peut pas récupérer le compte de service après sa suppression définitive, même si vous déposez une demande d'assistance.

  • Il n'existe aucun compte de service portant le même nom que le compte de service supprimé.

    Par exemple, supposons que vous supprimiez accidentellement le compte de service my-service-account@project-id.iam.gserviceaccount.com. Vous avez toujours besoin d'un compte de service portant ce nom. Vous devez donc créer un autre compte de service portant le même nom, my-service-account@project-id.iam.gserviceaccount.com.

    Le nouveau compte de service n'hérite pas des autorisations du compte de service supprimé. En réalité, il est complètement distinct du compte de service supprimé. Cependant, vous ne pouvez pas annuler la suppression du compte de service d'origine, car le nouveau compte de service porte le même nom.

    Pour résoudre ce problème, supprimez le nouveau compte de service, puis essayez d'annuler la suppression du compte de service d'origine.

Si vous ne parvenez pas à annuler la suppression du compte de service, vous pouvez en créer un autre portant le même nom, révoquer tous les rôles du compte de service supprimé, puis attribuer les mêmes rôles au nouveau compte de service. Pour en savoir plus, consultez la section Stratégies avec des comptes principaux supprimés.

Trouver l'ID numérique d'un compte de service supprimé

Lorsque vous annulez la suppression d'un compte de service, vous devez indiquer son ID numérique. L'ID numérique est un numéro à 21 chiffres, tel que 123456789012345678901, qui identifie de manière unique le compte de service. Par exemple, si vous supprimez un compte de service, puis créez un compte de service portant le même nom, le compte de service d'origine et le nouveau compte de service auront des ID numériques différents.

Si vous savez qu'une liaison de stratégie d'autorisation inclut le compte de service supprimé, vous pouvez obtenir la stratégie d'autorisation, puis rechercher l'ID numérique dans la stratégie d'autorisation. L'ID numérique est ajouté au nom du compte de service supprimé. Par exemple, dans cette stratégie d'autorisation, l'ID numérique du compte de service supprimé est 123456789012345678901 :

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

Les ID numériques ne sont ajoutés qu'aux noms des comptes principaux supprimés.

Vous pouvez également rechercher dans vos journaux d'audit l'opération DeleteServiceAccount qui a supprimé le compte de service :

  1. Dans la console Google Cloud, accédez à la page Explorateur de journaux.

    Accéder à l'explorateur de journaux

  2. Dans l'éditeur de requête, saisissez la requête suivante, en remplaçant SERVICE_ACCOUNT_EMAIL par l'adresse e-mail de votre compte de service (par exemple, my-service-account@project-id.iam.gserviceaccount.com) :

    resource.type="service_account"
    resource.labels.email_id="SERVICE_ACCOUNT_EMAIL"
    "DeleteServiceAccount"
    
  3. Si le compte de service a été supprimé il y a plus d'une heure, cliquez sur schedule Dernière heure, sélectionnez une période plus longue dans la liste déroulante, puis cliquez sur Appliquer.

  4. Cliquez sur Run query. L'explorateur de journaux affiche les opérations DeleteServiceAccount qui ont affecté les comptes de service portant le nom que vous avez spécifié.

  5. Recherchez et notez l'ID numérique du compte de service supprimé en effectuant l'une des opérations suivantes :

    • Si les résultats de recherche n'incluent qu'une seule opération DeleteServiceAccount, recherchez l'ID numérique dans le champ ID unique du volet Journaux des champs.

    • Si les résultats de la recherche affichent plusieurs journaux, procédez comme suit :

      1. Recherchez l'entrée de journal appropriée. Pour trouver l'entrée de journal appropriée, cliquez sur la flèche de développement () à côté d'une entrée de journal. Examinez les détails de l'entrée de journal et déterminez si celle-ci affiche l'opération que vous souhaitez annuler. Répétez cette procédure jusqu'à ce que vous trouviez l'entrée de journal appropriée.

      2. Dans l'entrée de journal correcte, recherchez l'ID numérique du compte de service. Pour localiser l'ID numérique, développez le champ protoPayload de l'entrée de journal, puis recherchez le champ resourceName.

        L'ID numérique correspond à tout ce qui suit serviceAccounts dans le champ resourceName.

Annuler la suppression du compte de service à l'aide de l'ID numérique

Une fois que vous avez trouvé l'ID numérique du compte de service concerné, vous pouvez tenter d'annuler sa suppression.

gcloud

  1. Dans la console Google Cloud, activez Cloud Shell.

    Activer Cloud Shell

    En bas de la fenêtre de la console Google Cloud, une session Cloud Shell démarre et affiche une invite de ligne de commande. Cloud Shell est un environnement shell dans lequel Google Cloud CLI est déjà installé, et dans lequel des valeurs sont déjà définies pour votre projet actuel. L'initialisation de la session peut prendre quelques secondes.

  2. Exécutez la commande gcloud beta iam service-accounts undelete pour annuler la suppression d'un compte de service.

    Commande :

    gcloud beta iam service-accounts undelete ACCOUNT_ID

    Output:

    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

La méthode serviceAccounts.undelete restaure un compte de service supprimé.

Avant d'utiliser les données de requête ci-dessous, effectuez les remplacements suivants :

  • PROJECT_ID : ID de votre projet Google Cloud. Les ID de projet sont des chaînes alphanumériques, telles que my-project.
  • SA_NUMERIC_ID : ID numérique unique du compte de service.

Méthode HTTP et URL :

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

Pour envoyer votre requête, développez l'une des options suivantes :

S'il est possible d'annuler la suppression du compte, vous recevez un code de réponse 200 OK avec des détails sur le compte de service restauré, semblable à ce qui suit :

{
  "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"
  }
}

Étapes suivantes

Faites l'essai

Si vous débutez sur Google Cloud, créez un compte pour évaluer les performances de nos produits en conditions réelles. Les nouveaux clients bénéficient également de 300 $ de crédits gratuits pour exécuter, tester et déployer des charges de travail.

Essai gratuit