Créer et gérer les clés de comptes de service

Cette page explique comment créer et gérer des clés de compte de service à l'aide de Google Cloud Console, de l'outil de ligne de commande gcloud, de l'API Identity and Access Management ou de l'une des bibliothèques clientes Google Cloud.

Prérequis pour ce guide

Autorisations requises

Pour permettre à un utilisateur de gérer les clés de compte de service, attribuez le rôle Administrateur de clés de compte de service (roles/iam.serviceAccountKeyAdmin). Les rôles primitifs IAM contiennent également des autorisations permettant de gérer les clés de compte de service, mais nous vous recommandons d'accorder ce rôle pour éviter tout accès inutile à d'autres ressources Google Cloud.

Pour en savoir plus, consultez la liste des rôles liés aux comptes de service.

Créer des clés de compte de service

Pour utiliser un compte de service en dehors de Google Cloud, par exemple sur d'autres plates-formes ou sur site, vous devez d'abord établir l'identité du compte de service. Pour ce faire, un moyen sûr consiste à utiliser les paires de clés publique/privée.

Pour créer une clé de compte de service, vous pouvez utiliser Cloud Console, l'outil gcloud, la méthode serviceAccounts.keys.create() ou l'une des bibliothèques clientes. Un compte de service peut compter jusqu'à 10 clés.

Dans les exemples ci-dessous, sa-name est le nom de votre compte de service et project-id est l'ID de votre projet Google Cloud. Vous pouvez récupérer la chaîne sa-name@project-id.iam.gserviceaccount.com à partir de la page Comptes de service de Cloud Console.

Console

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

    Accéder à la page "Comptes de service"

  2. Cliquez sur Sélectionner un projet, choisissez un projet et cliquez sur Ouvrir.

  3. Recherchez la ligne du compte de service pour lequel vous souhaitez créer une clé. Cliquez sur le de cette ligne, puis cliquez sur Créer une clé.

  4. Sélectionnez un type de clé, puis cliquez sur Créer.

Cliquez sur Créer pour télécharger un fichier de clé de compte de service. Veillez à stocker ce fichier en toute sécurité, car il peut être utilisé pour s'authentifier en tant que compte de service. Vous pouvez déplacer et renommer ce fichier comme vous le souhaitez.

Commande gcloud

Exécutez la commande gcloud iam service-accounts keys create pour créer des clés de compte de service.

Commande :

gcloud iam service-accounts keys create ~/key.json \
  --iam-account sa-name@project-id.iam.gserviceaccount.com

Sortie :

created key [e44da1202f82f8f4bdd9d92bc412d1d8a837fa83] of type [json] as
[/usr/home/username/key.json] for
[sa-name@project-id.iam.gserviceaccount.com]

Le fichier de clé du compte de service est maintenant téléchargé sur votre ordinateur. Veillez à stocker ce fichier en toute sécurité, car il peut être utilisé pour s'authentifier en tant que compte de service. Vous pouvez déplacer et renommer ce fichier comme vous le souhaitez.

API REST

La méthode projects.serviceAccounts.keys.create crée une clé pour 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.
  • sa-name : nom du compte de service pour lequel vous souhaitez créer une clé.
  • private-key-type : facultatif. Format de sortie de la clé privée. La valeur par défaut est TYPE_GOOGLE_CREDENTIALS_FILE, qui est un fichier de clé JSON encodé en base64. Pour obtenir la liste de toutes les valeurs possibles, consultez la documentation de référence sur ServiceAccountPrivateKeyType.
  • key-algorithm : facultatif. Algorithme de clé à utiliser pour la clé. La valeur par défaut, susceptible d'être modifiée, est une clé RSA de 2 048 bits. Pour obtenir la liste de toutes les valeurs possibles, consultez la documentation de référence sur ServiceAccountKeyAlgorithm.

Méthode HTTP et URL :

POST https://iam.googleapis.com/v1/projects/project-id/serviceAccounts/sa-name@project-id.iam.gserviceaccount.com/keys

Corps JSON de la requête :

{
  "privateKeyType": "private-key-type",
  "keyAlgorithm": "key-algorithm"
}

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

Vous devriez recevoir une réponse JSON de ce type :

{
    "name":"projects/my-project/serviceAccounts/my-service-account@my-project.iam.gserviceaccount.com/keys/90c48f61c65cd56224a12ab18e6ee9ca9c3aee7c",
    "privateKeyType": "TYPE_GOOGLE_CREDENTIALS_FILE",
    "privateKeyData":"MIIJqAIB . . .",
    "validAfterTime": "2020-05-17T18:48:27Z",
    "validBeforeTime": "2030-05-15T18:48:27Z",
    "keyAlgorithm": "KEY_ALG_RSA_2048",
    "keyOrigin": "GOOGLE_PROVIDED",
    "keyType": "USER_MANAGED"
}

C#

Avant d'essayer cet exemple, suivez les instructions de configuration pour C# décrites dans le Guide de démarrage rapide de Cloud IAM – Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Cloud IAM en langage C#.


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

public partial class ServiceAccountKeys
{
    public static ServiceAccountKey CreateKey(string serviceAccountEmail)
    {
        var credential = GoogleCredential.GetApplicationDefault()
            .CreateScoped(IamService.Scope.CloudPlatform);
        var service = new IamService(new IamService.Initializer
        {
            HttpClientInitializer = credential
        });

        var key = service.Projects.ServiceAccounts.Keys.Create(
            new CreateServiceAccountKeyRequest(),
            "projects/-/serviceAccounts/" + serviceAccountEmail)
            .Execute();
        Console.WriteLine("Created key: " + key.Name);
        return key;
    }
}

Go

Avant d'essayer cet exemple, suivez les instructions de configuration pour Go décrites dans le Guide de démarrage rapide de Cloud IAM – Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Cloud IAM en langage Go.

import (
	"context"
	"fmt"
	"io"

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

// createKey creates a service account key.
func createKey(w io.Writer, serviceAccountEmail string) (*iam.ServiceAccountKey, error) {
	ctx := context.Background()
	service, err := iam.NewService(ctx)
	if err != nil {
		return nil, fmt.Errorf("iam.NewService: %v", err)
	}

	resource := "projects/-/serviceAccounts/" + serviceAccountEmail
	request := &iam.CreateServiceAccountKeyRequest{}
	key, err := service.Projects.ServiceAccounts.Keys.Create(resource, request).Do()
	if err != nil {
		return nil, fmt.Errorf("Projects.ServiceAccounts.Keys.Create: %v", err)
	}
	fmt.Fprintf(w, "Created key: %v", key.Name)
	return key, nil
}

Java

Avant d'essayer cet exemple, suivez les instructions de configuration pour Java décrites dans le Guide de démarrage rapide de Cloud IAM – Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Cloud IAM en langage Java.

import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.services.iam.v1.Iam;
import com.google.api.services.iam.v1.IamScopes;
import com.google.api.services.iam.v1.model.CreateServiceAccountKeyRequest;
import com.google.api.services.iam.v1.model.ServiceAccountKey;
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 CreateServiceAccountKey {

  // Creates a key for a service account.
  public static void createKey(String projectId) {
    // String projectId = "my-project-id";

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

    try {
      ServiceAccountKey key =
          service
              .projects()
              .serviceAccounts()
              .keys()
              .create(
                  "projects/-/serviceAccounts/your-service-account-name@"
                      + projectId
                      + ".iam.gserviceaccount.com",
                  new CreateServiceAccountKeyRequest())
              .execute();

      System.out.println("Created key: " + key.getName());
    } catch (IOException e) {
      System.out.println("Unable to create service account key: \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(),
                JacksonFactory.getDefaultInstance(),
                new HttpCredentialsAdapter(credential))
            .setApplicationName("service-account-keys")
            .build();
    return service;
  }
}

Python

Avant d'essayer cet exemple, suivez les instructions de configuration pour Python décrites dans le Guide de démarrage rapide de Cloud IAM – Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Cloud IAM en langage Python.

import os

from google.oauth2 import service_account
import googleapiclient.discovery

def create_key(service_account_email):
    """Creates a key for 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)

    key = service.projects().serviceAccounts().keys().create(
        name='projects/-/serviceAccounts/' + service_account_email, body={}
        ).execute()

    print('Created key: ' + key['name'])

Notez que le résultat privateKeyData est une représentation de la valeur TYPE_GOOGLE_CREDENTIALS_FILE (identifiants de clé JSON ou P12) sous forme de chaîne codée en base64.

Lorsque vous créez une clé, la nouvelle paire de clés publique/privée est générée et téléchargée sur votre ordinateur. C'est la seule copie de la clé privée dont vous disposez. Vous avez la responsabilité de stocker votre clé privée en lieu sûr. Prenez note de son emplacement et assurez-vous que votre application puisse y accéder facilement, car elle en aura besoin pour effectuer des appels d'API authentifiés.

Le format de la clé peut différer selon la manière dont elle est générée. Les clés créées à l'aide de Cloud Console ou de l'outil de ligne de commande gcloud prennent la forme suivante :

{
  "type": "service_account",
  "project_id": "project-id",
  "private_key_id": "key-id",
  "private_key": "-----BEGIN PRIVATE KEY-----\nprivate-key\n-----END PRIVATE KEY-----\n",
  "client_email": "service-account-email",
  "client_id": "client-id",
  "auth_uri": "https://accounts.google.com/o/oauth2/auth",
  "token_uri": "https://accounts.google.com/o/oauth2/token",
  "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
  "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/service-account-email"
}

Alors que les clés générées avec l’API REST ou les bibliothèques clientes ont ce format :

{
  "name": "projects/project-id/serviceAccounts/service-account-email/keys/key-id",
  "privateKeyType": "TYPE_GOOGLE_CREDENTIALS_FILE",
  "privateKeyData": "private-key",
  "validAfterTime": "date",
  "validBeforeTime": "date",
  "keyAlgorithm": "KEY_ALG_RSA_2048"
}

Notez que, là encore, le résultat privateKeyData est une représentation de la valeur TYPE_GOOGLE_CREDENTIALS_FILE (identifiants de clé JSON ou P12) sous forme de chaîne codée en base64.

Le formatage étant différent selon la méthode employée, il est plus facile de générer une clé avec la méthode qui sera utilisée pour les futurs appels d'API. Par exemple, si vous utilisez gcloud, générez également la clé avec gcloud. Pour utiliser une clé générée avec une autre méthode que celle que vous employez (par exemple, une clé REST à utiliser avec gcloud), vous devez modifier la clé afin qu'elle corresponde au format approprié.

Google fait en sorte que toutes les clés publiques de tous les comptes de service soient accessibles par tout le monde et disponibles pour vérifier les signatures créées avec la clé privée. La clé publique est accessible aux adresses suivantes :

  • Certificat x.509 : https://www.googleapis.com/service_accounts/v1/metadata/x509/sa-name@project-id.iam.gserviceaccount.com
  • Clé Web JSON (JWK) : https://www.googleapis.com/service_accounts/v1/jwk/sa-name@project-id.iam.gserviceaccount.com
  • Point de terminaison brut : https://www.googleapis.com/service_accounts/v1/metadata/raw/sa-name@project-id.iam.gserviceaccount.com

Liste des clés de compte de service

Pour répertorier les clés d'un compte de service particulier, vous pouvez utiliser Cloud Console, l'outil gcloud, la méthode serviceAccount.keys.list() ou l'une des bibliothèques clientes.

La méthode serviceAccount.keys.list() est couramment utilisée pour auditer les comptes et les clés de service. Elle permet également de créer un outil de gestion personnalisé pour les comptes de service.

Pour savoir à quel projet votre clé est associée, vous pouvez la télécharger sous forme de fichier JSON, puis consulter ce fichier.

Il est possible que des clés soient répertoriées alors que vous ne les avez pas créées. Ces clés sont utilisées par les services Google Cloud tels qu'App Engine et Compute Engine. Pour en savoir plus sur la différence entre les clés utilisateur et les clés gérées par Google Cloud, consultez la section Comprendre les comptes de service.

Console

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

    Accéder à la page "Comptes de service"

  2. Cliquez sur Sélectionner un projet, choisissez un projet et cliquez sur Ouvrir. La console répertorie tous les comptes de service du projet, ainsi que les clés correspondantes.

Commande gcloud

Exécutez la commande gcloud iam service-accounts keys list pour répertorier les clés de compte de service.

Commande :

gcloud iam service-accounts keys list \
  --iam-account sa-name@project-id.iam.gserviceaccount.com

Sortie :

KEY_ID CREATED_AT EXPIRES_AT
8e6e3936d7024646f8ceb39792006c07f4a9760c 2017-01-01T00:00:00.000Z 2017-01-01T00:00:00.000Z
937c98f870f5c8db970af527aa3c12fd88b1c20a 2017-01-01T00:00:00.000Z 2017-01-01T00:00:00.000Z

API REST

La méthode projects.serviceAccounts.keys.list répertorie toutes les clés d'un compte de service donné.

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

  • project-id : ID de votre projet Google Cloud.
  • sa-name : nom du compte de service dont vous souhaitez répertorier les clés.
  • key-types : facultatif. Liste de types de clés séparés par une virgule que vous souhaitez inclure dans la réponse. Le type de clé indique si une clé est gérée par l'utilisateur (USER_MANAGED) ou gérée par le système (SYSTEM_MANAGED). Si aucune valeur n'est spécifiée, toutes les clés sont renvoyées.

Méthode HTTP et URL :

GET https://iam.googleapis.com/v1/projects/project-id/serviceAccounts/sa-name@project-id.iam.gserviceaccount.com/keys?keyTypes=key-types

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

Vous devriez recevoir une réponse JSON de ce type :

{
  "keys": [
    {
      "name": "projects/my-project/serviceAccounts/my-service-account@my-project.iam.gserviceaccount.com/keys/90c48f61c65cd56224a12ab18e6ee9ca9c3aee7c",
      "validAfterTime": "2020-03-04T17:39:47Z",
      "validBeforeTime": "9999-12-31T23:59:59Z",
      "keyAlgorithm": "KEY_ALG_RSA_2048",
      "keyOrigin": "GOOGLE_PROVIDED",
      "keyType": "USER_MANAGED"
    },
    {
      "name": "projects/my-project/serviceAccounts/my-service-account@my-project.iam.gserviceaccount.com/keys/e5e3800831ac1adc8a5849da7d827b4724b1fce8",
      "validAfterTime": "2020-03-31T23:50:09Z",
      "validBeforeTime": "9999-12-31T23:59:59Z",
      "keyAlgorithm": "KEY_ALG_RSA_2048",
      "keyOrigin": "GOOGLE_PROVIDED",
      "keyType": "USER_MANAGED"
    },
    {
      "name": "projects/my-project/serviceAccounts/my-service-account@my-project.iam.gserviceaccount.com/keys/b97699f042b8eee6a846f4f96259fbcd13e2682e",
      "validAfterTime": "2020-05-17T18:58:13Z",
      "validBeforeTime": "9999-12-31T23:59:59Z",
      "keyAlgorithm": "KEY_ALG_RSA_2048",
      "keyOrigin": "GOOGLE_PROVIDED",
      "keyType": "USER_MANAGED"
    }
  ]
}

C#

Avant d'essayer cet exemple, suivez les instructions de configuration pour C# décrites dans le Guide de démarrage rapide de Cloud IAM – Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Cloud IAM en langage C#.


using System;
using System.Collections.Generic;
using Google.Apis.Auth.OAuth2;
using Google.Apis.Iam.v1;
using Google.Apis.Iam.v1.Data;

public partial class ServiceAccountKeys
{
    public static IList<ServiceAccountKey> ListKeys(string serviceAccountEmail)
    {
        var credential = GoogleCredential.GetApplicationDefault()
            .CreateScoped(IamService.Scope.CloudPlatform);
        var service = new IamService(new IamService.Initializer
        {
            HttpClientInitializer = credential
        });

        var response = service.Projects.ServiceAccounts.Keys
            .List($"projects/-/serviceAccounts/{serviceAccountEmail}")
            .Execute();
        foreach (ServiceAccountKey key in response.Keys)
        {
            Console.WriteLine("Key: " + key.Name);
        }
        return response.Keys;
    }
}

Go

Avant d'essayer cet exemple, suivez les instructions de configuration pour Go décrites dans le Guide de démarrage rapide de Cloud IAM – Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Cloud IAM en langage Go.

import (
	"context"
	"fmt"
	"io"

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

// listKey lists a service account's keys.
func listKeys(w io.Writer, serviceAccountEmail string) ([]*iam.ServiceAccountKey, error) {
	ctx := context.Background()
	service, err := iam.NewService(ctx)
	if err != nil {
		return nil, fmt.Errorf("iam.NewService: %v", err)
	}

	resource := "projects/-/serviceAccounts/" + serviceAccountEmail
	response, err := service.Projects.ServiceAccounts.Keys.List(resource).Do()
	if err != nil {
		return nil, fmt.Errorf("Projects.ServiceAccounts.Keys.List: %v", err)
	}
	for _, key := range response.Keys {
		fmt.Fprintf(w, "Listing key: %v", key.Name)
	}
	return response.Keys, nil
}

Java

Avant d'essayer cet exemple, suivez les instructions de configuration pour Java décrites dans le Guide de démarrage rapide de Cloud IAM – Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Cloud IAM en langage Java.

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

public class ListServiceAccountKeys {

  // Lists all keys for a service account.
  public static void listKeys(String projectId) {
    // String projectId = "my-project-id";

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

    try {
      List<ServiceAccountKey> keys =
          service
              .projects()
              .serviceAccounts()
              .keys()
              .list(
                  "projects/-/serviceAccounts/"
                      + "your-service-account-name@"
                      + projectId
                      + ".iam.gserviceaccount.com")
              .execute()
              .getKeys();

      for (ServiceAccountKey key : keys) {
        System.out.println("Key: " + key.getName());
      }
    } catch (IOException e) {
      System.out.println("Unable to list service account keys: \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(),
                JacksonFactory.getDefaultInstance(),
                new HttpCredentialsAdapter(credential))
            .setApplicationName("service-account-keys")
            .build();
    return service;
  }
}

Python

Avant d'essayer cet exemple, suivez les instructions de configuration pour Python décrites dans le Guide de démarrage rapide de Cloud IAM – Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Cloud IAM en langage Python.

import os

from google.oauth2 import service_account
import googleapiclient.discovery

def list_keys(service_account_email):
    """Lists all keys for 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)

    keys = service.projects().serviceAccounts().keys().list(
        name='projects/-/serviceAccounts/' + service_account_email).execute()

    for key in keys['keys']:
        print('Key: ' + key['name'])

Obtenir une clé de compte de service

Vous ne pouvez obtenir les données de clé privée d'une clé de compte de service qu'au moment où vous la créez.

Pour accéder aux informations de base d'une clé, telles que l'ID, l'algorithme et les données de clé publique, utilisez la méthode projects.serviceAccounts.keys.get() de l'API REST. Cloud Console et l'outil de ligne de commande gcloud ne permettent pas d'obtenir ces informations.

Importer des clés publiques pour des comptes de service

Vous pouvez importer la partie publique d'une paire de clés gérée par l'utilisateur vers un compte de service. Une fois que vous avez importé la clé publique, celle-ci est associée définitivement au compte de service et est utilisée de la même manière que les autres clés de compte de service gérées par les utilisateurs. Pour désactiver l'importation de clés pour votre projet, consultez la section Limiter l'importation des clés de compte de service.

Si vous choisissez d'utiliser une paire de clés gérée par l'utilisateur au lieu d'une paire de clés gérée par Google, veillez à la gérer et à l'alterner régulièrement.

La clé que vous importez doit être une clé publique RSA encapsulée dans un certificat X.509 v3 et encodée en base64. Vous pouvez utiliser des outils tels que OpenSSL pour générer une clé et un certificat dans ce format. Par exemple, la commande suivante génère une paire de clés RSA de 2 048 bits et encapsule la clé publique dans un certificat autosigné qui est valide pendant 365 jours :

openssl req -x509 -nodes -newkey rsa:2048 -days 365 \
    -keyout /path/to/private_key.pem \
    -out /path/to/public_key.pem \
    -subj "/CN=unused"

Vous pouvez ensuite importer le fichier public_key.pem en tant que clé publique d'un compte de service.

Commande gcloud

Exécutez la commande gcloud beta iam service-accounts keys upload pour importer une clé publique permettant de signer des clés de compte de service.

Commande :

gcloud beta iam service-accounts keys upload /path/to/public_key.pem \
  --iam-account sa-name@project-id.iam.gserviceaccount.com

Le résultat contient un identifiant unique pour la clé importée :

Name: projects/project-id/serviceAccounts/sa-name@project-id.iam.gserviceaccount.com/keys/c7b74879da78e4cdcbe7e1bf5e129375c0bfa8d0

Pour savoir si la commande a réussi, exécutez la commande gcloud iam service-accounts keys list :

gcloud iam service-accounts keys list \
  --iam-account sa-name@project-id.iam.gserviceaccount.com

Le résultat contiendra l'identifiant unique qui a été renvoyé après la création de la clé :

KEY_ID CREATED_AT EXPIRES_AT
c7b74879da78e4cdcbe7e1bf5e129375c0bfa8d0 2019-06-26T21:01:42.000Z 2029-06-23T21:01:42.000Z

API REST

La méthode projects.serviceAccounts.keys.upload importe la clé publique à partir d'une paire de clés gérée par l'utilisateur et ajoute cette clé au 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.
  • sa-name : nom du compte de service auquel associer la clé.
  • public-key-data : données de la clé publique pour la paire de clés. Il doit s'agir d'une clé publique RSA encapsulée dans un certificat X.509 v3. Encodez les données de clé publique en base64, y compris la première ligne, -----BEGIN CERTIFICATE-----, et la dernière ligne, -----END CERTIFICATE-----.

Méthode HTTP et URL :

POST https://iam.googleapis.com/v1/projects/project-id/serviceAccounts/sa-name@project-id.iam.gserviceaccount.com/keys:upload

Corps JSON de la requête :

{
  "publicKeyData": "public-key-data"
}

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

Vous devriez recevoir une réponse JSON de ce type :

{
  "name": "projects/my-project/serviceAccounts/my-service-account@my-project.iam.gserviceaccount.com/keys/c7b74879da78e4cdcbe7e1bf5e129375c0bfa8d0",
  "validAfterTime": "2020-05-17T19:31:19Z",
  "validBeforeTime": "2021-05-17T19:31:19Z",
  "keyAlgorithm": "KEY_ALG_RSA_2048",
  "keyOrigin": "USER_PROVIDED",
  "keyType": "USER_MANAGED"
}

Supprimer des clés de compte de service

Pour supprimer une clé de compte de service, vous pouvez utiliser Cloud Console, l'outil gcloud, la méthode serviceAccount.keys.delete() ou l'une des bibliothèques clientes.

Si vous supprimez une clé, votre application ne pourra plus accéder aux ressources Google Cloud à l'aide de cette clé. Pour des raisons de sécurité, il est recommandé d'alterner régulièrement vos clés de compte de service. Il suffit de créer une nouvelle clé, de modifier la liaison avec vos applications, puis de supprimer l'ancienne clé. Les méthodes serviceAccount.keys.create() et serviceAccount.keys.delete() permettent d'automatiser la rotation.

Console

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

    Accéder à la page "Comptes de service"

  2. Cliquez sur Sélectionner un projet, choisissez un projet et cliquez sur Ouvrir. La console répertorie tous les comptes de service du projet, ainsi que les clés correspondantes.

  3. Recherchez la ligne du compte de service pour lequel vous souhaitez créer une clé. Cliquez sur le de cette ligne, puis cliquez sur Modifier.

  4. Dans la liste de clés, cliquez sur Supprimer  pour chaque clé que vous souhaitez supprimer.

Commande gcloud

Exécutez la commande gcloud iam service-accounts keys delete pour supprimer des clés de compte de service.

Commande :

gcloud iam service-accounts keys delete key-id \
  --iam-account sa-name@project-id.iam.gserviceaccount.com

Sortie :

Deleted key [8e6e3936d7024646f8ceb39792006c07f4a9760c] for
service account [sa-name@project-id.iam.gserviceaccount.com]

API REST

La méthode projects.serviceAccounts.keys.delete supprime une clé de 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.
  • sa-name : nom du compte de service dont vous souhaitez supprimer la clé.
  • key-id : ID de la clé que vous souhaitez supprimer.

Méthode HTTP et URL :

DELETE https://iam.googleapis.com/v1/projects/project-id/serviceAccounts/sa-name@project-id.iam.gserviceaccount.com/keys/key-id

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

Vous devriez recevoir une réponse JSON de ce type :

{
}

C#

Avant d'essayer cet exemple, suivez les instructions de configuration pour C# décrites dans le Guide de démarrage rapide de Cloud IAM – Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Cloud IAM en langage C#.


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

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

        service.Projects.ServiceAccounts.Keys.Delete(fullKeyName).Execute();
        Console.WriteLine("Deleted key: " + fullKeyName);
    }
}

Go

Avant d'essayer cet exemple, suivez les instructions de configuration pour Go décrites dans le Guide de démarrage rapide de Cloud IAM – Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Cloud IAM en langage Go.

import (
	"context"
	"fmt"
	"io"

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

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

	_, err = service.Projects.ServiceAccounts.Keys.Delete(fullKeyName).Do()
	if err != nil {
		return fmt.Errorf("Projects.ServiceAccounts.Keys.Delete: %v", err)
	}
	fmt.Fprintf(w, "Deleted key: %v", fullKeyName)
	return nil
}

Java

Avant d'essayer cet exemple, suivez les instructions de configuration pour Java décrites dans le Guide de démarrage rapide de Cloud IAM – Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Cloud IAM en langage Java.

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

public class DeleteServiceAccountKey {

  // Deletes a service account key.
  public static void deleteKey(String projectId) {
    // String projectId = "my-project-id";

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

    try {
      // First, get the name of the key using List() or Get()
      List<ServiceAccountKey> keys =
          service
              .projects()
              .serviceAccounts()
              .keys()
              .list(
                  "projects/-/serviceAccounts/"
                      + "your-service-account-name@"
                      + projectId
                      + ".iam.gserviceaccount.com")
              .execute()
              .getKeys();
      String keyToDelete = keys.get(0).getName();

      // Then you can delete the key
      service.projects().serviceAccounts().keys().delete(keyToDelete).execute();

      System.out.println("Deleted key: " + keyToDelete);
    } catch (IOException e) {
      System.out.println("Unable to delete service account key: \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(),
                JacksonFactory.getDefaultInstance(),
                new HttpCredentialsAdapter(credential))
            .setApplicationName("service-account-keys")
            .build();
    return service;
  }
}

Python

Avant d'essayer cet exemple, suivez les instructions de configuration pour Python décrites dans le Guide de démarrage rapide de Cloud IAM – Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Cloud IAM en langage Python.

import os

from google.oauth2 import service_account
import googleapiclient.discovery

def delete_key(full_key_name):
    """Deletes a service account key."""

    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().keys().delete(
        name=full_key_name).execute()

    print('Deleted key: ' + full_key_name)