Authentifier des charges de travail à l'aide de comptes de service


Cette page explique comment utiliser des comptes de service pour permettre aux applications s'exécutant sur vos instances de machine virtuelle (VM) de s'authentifier auprès des API Google Cloud et pour autoriser l'accès aux ressources.

Pour en savoir plus sur l'utilisation des comptes de service dans Compute Engine, consultez la présentation des comptes de service.

Avant de commencer

Créer un compte de service

Vous pouvez créer et configurer un compte de service à l'aide d'IAM. Après avoir créé un compte, attribuez-lui un ou plusieurs rôles IAM, puis autorisez une instance de machine virtuelle à s'exécuter via ce compte de service.

Console

Pour créer un compte de service, procédez comme suit :

  1. Créez un compte de service comme décrit dans la section Créer un compte de service.

  2. Obtenez l'adresse e-mail du compte de service. Vous devez disposer de l'adresse e-mail pour configurer une instance afin qu'elle s'exécute via ce compte de service. Vérifiez l'adresse e-mail du compte de service dans la console :

    1. Accédez à la page Comptes de service.

      Accéder à Comptes de service

    2. Si vous y êtes invité, sélectionnez un projet.

    3. Recherchez le compte de service que vous avez créé et notez l'adresse e-mail associée.

    Généralement, l'adresse e-mail du compte de service est dérivée de l'ID du compte de service, selon le format suivant :

    [NOM-COMPTE-SERVICE]@[PROJECT_ID].iam.gserviceaccount.com

  3. Accordez des rôles IAM au compte de service. Si vous n'accordez aucun rôle, le compte de service n'a accès à aucun service. Pour obtenir la liste complète des rôles IAM, consultez la section Comprendre les rôles dans la documentation IAM.

  4. Ensuite, configurez une instance à exécuter en tant que compte de service. Suivez les instructions de la section Configurer une instance pour qu'elle s'exécute via un compte de service.

Terraform

Pour créer un compte de service, vous pouvez utiliser la ressource google_service_account.

resource "google_service_account" "default" {
  account_id   = "service-account-id"
  display_name = "Service Account"
}

N'oubliez pas de remplacer les valeurs des espaces réservés pour les attributs account_id et display_name.

Pour savoir comment appliquer ou supprimer une configuration Terraform, consultez Commandes Terraform de base.

Configurer une instance pour qu'elle s'exécute via un compte de service

Après avoir créé un compte de service, vous pouvez créer des instances de machine virtuelle à exécuter via ce compte de service. Si le compte de service se trouve dans un projet différent de celui des instances, vous devez configurer le compte de service pour une ressource située dans un autre projet.

Si vous souhaitez affecter un compte de service à une instance existante ou modifier le compte associé à celle-ci, consultez Modifier le compte de service et les niveaux d'accès d'une instance.

Vous pouvez associer plusieurs instances de machine virtuelle au même compte de service. En revanche, une instance de machine virtuelle ne peut avoir qu'une seule identité de compte de service. Si vous attribuez le même compte de service à plusieurs instances de machine virtuelle, toute modification ultérieure apportée au compte de service affecte les instances utilisant le compte de service. Cela inclut toutes les modifications apportées aux rôles IAM qui sont accordés au compte de service. Par exemple, si vous supprimez un rôle, toutes les instances utilisant le compte de service perdent les autorisations accordées par ce rôle.

En règle générale, vous pouvez simplement définir le niveau d'accès cloud-platform pour autoriser l'accès à la plupart des API Cloud, puis n'accorder au compte de service que les rôles IAM pertinents. La combinaison des niveaux d'accès accordés à l'instance de machine virtuelle et des rôles IAM accordés au compte de service détermine les droits d'accès du compte de service pour cette instance. Le compte de service ne peut exécuter des méthodes d'API que si elles sont autorisées à la fois par le niveau d'accès et par ses rôles IAM.

Vous pouvez également choisir de définir des niveaux d'accès spécifiques autorisant l'accès aux méthodes individuelles de l'API que le service peut appeler. Par exemple, pour appeler la méthode instances.insert, vous devez disposer à la fois du niveau d'accès https://www.googleapis.com/auth/compute ou https://www.googleapis.com/auth/cloud-platform, et d'un rôle IAM qui accorde l'accès à cette méthode. Vous pouvez définir le niveau d'accès sur compute plutôt que cloud-platform, ce qui autorise le service à appeler des méthodes dans Compute Engine, mais l'empêche d'appeler des méthodes d'API en dehors de Compute Engine.

Vous pouvez configurer une nouvelle instance pour qu'elle s'exécute via le compte de service à l'aide de la console Google Cloud, de Google Cloud CLI ou directement via l'API.

Console

  1. Accédez à la page Créer une instance.

    Accéder à Créer une instance

  2. Spécifiez les détails de la VM.

  3. Dans la section Identité et accès à l'API, choisissez le compte de service que vous souhaitez utiliser dans la liste déroulante.

  4. Poursuivez le processus de création de la VM.

gcloud

Pour créer une instance et l'autoriser à s'exécuter via un compte de service personnalisé à l'aide de Google Cloud CLI, indiquez l'adresse e-mail du compte et les niveaux d'accès souhaités pour l'instance.

gcloud compute instances create [INSTANCE_NAME] \
    --service-account [SERVICE_ACCOUNT_EMAIL] \
    --scopes [SCOPES,...]

où :

  • [SERVICE_ACCOUNT_EMAIL] correspond à l'adresse e-mail du compte de service que vous souhaitez utiliser. Par exemple : my-sa-123@my-project-123.iam.gserviceaccount.com. Si vous ne connaissez pas l'adresse e-mail, découvrez comment obtenir l'adresse e-mail d'un compte de service.
  • [INSTANCE_NAME] est le nom de l'instance.
  • [SCOPES] correspond à une liste d'URI de champs d'application complets ou d'alias de champs d'application séparés par des virgules et fournis dans la description de l'indicateur --scopes.

Par exemple :

gcloud compute instances create example-vm \
    --service-account 123-my-sa@my-project-123.iam.gserviceaccount.com \
    --scopes https://www.googleapis.com/auth/cloud-platform

gcloud CLI fournit également des alias de champs d'application au lieu des URI plus longs. Par exemple, le champ d'application pour un accès complet à Cloud Storage est le suivant : https://www.googleapis.com/auth/devstorage.full_control. L'alias de ce champ d'application est storage-full.

Vous pouvez consulter la liste des champs d'application et des alias sur la page instances create de la description de l'indicateur --scopes. La section "Aide" de la commande instances create répertorie également ces champs d'application et alias :

gcloud compute instances create --help

Spécifiez l'alias de la même manière que vous spécifiez l'URI de champ d'application normal. Par exemple :

gcloud compute instances create [INSTANCE_NAME] \
    --service-account [SERVICE_ACCOUNT_EMAIL] \
    --scopes cloud-platform

Terraform

Pour configurer une instance afin qu'elle s'exécute via un compte de service, vous pouvez utiliser la ressource google_compute_instance.

resource "google_compute_instance" "default" {
  name         = "my-test-vm"
  machine_type = "n1-standard-1"
  zone         = "us-central1-a"

  boot_disk {
    initialize_params {
      image = "debian-cloud/debian-11"
    }
  }

  // Local SSD disk
  scratch_disk {
    interface = "SCSI"
  }

  network_interface {
    network = "default"

    access_config {
      // Ephemeral public IP
    }
  }

  service_account {
    # Google recommends custom service accounts with `cloud-platform` scope with
    # specific permissions granted via IAM Roles.
    # This approach lets you avoid embedding secret keys or user credentials
    # in your instance, image, or app code
    email  = google_service_account.default.email
    scopes = ["cloud-platform"]
  }
}

API

Dans l'API, écrivez une requête standard pour créer une instance, mais incluez la propriété serviceAccounts. Obtenez l'adresse e-mail de votre compte de service et incluez-la dans la propriété email, avec les niveaux d'accès souhaités pour l'instance.

POST https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/[ZONE]/instances

{
  "machineType": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/[ZONE]/machineTypes/[MACHINE_TYPE]",
  "name": "[INSTANCE_NAME]",
  "serviceAccounts": [
   {
    "email": "[SERVICE_ACCOUNT_EMAIL]",
    "scopes": ["https://www.googleapis.com/auth/cloud-platform"]
   }
  ],
  ...
}

Une fois que vous avez configuré une instance pour qu'elle s'exécute via le compte de service, une application exécutée sur l'instance peut utiliser l'une des méthodes d'authentification suivantes :

Authentifier des applications à l'aide des identifiants du compte de service

Après avoir configuré une instance à exécuter en tant que compte de service, vous pouvez utiliser les identifiants du compte de service pour authentifier les applications en cours d'exécution sur l'instance.

Authentifier des applications avec une bibliothèque cliente

Les bibliothèques clientes peuvent utiliser les identifiants par défaut de l'application pour s'authentifier auprès des API Google et envoyer des requêtes à ces API. Les identifiants par défaut d'application permettent aux applications d'obtenir des identifiants de plusieurs sources. Vous pouvez ainsi tester votre application localement, puis la déployer sur une instance Compute Engine sans modifier le code de l'application.

Pour en savoir plus sur la configuration des identifiants par défaut d'une application, consultez Configurer les identifiants par défaut de l'application.

Cet exemple utilise la bibliothèque cliente Python pour s'authentifier et envoyer une requête à l'API Cloud Storage afin de lister les buckets d'un projet. L'exemple utilise la procédure suivante :

  1. Obtenez les identifiants nécessaires pour l'API Cloud Storage, et initialisez le service Cloud Storage à l'aide de la méthode build() et des identifiants.
  2. Répertoriez les buckets dans Cloud Storage.

Vous pouvez exécuter cet exemple sur une instance ayant accès à la gestion des buckets dans Cloud Storage.

import argparse
from typing import List

from google.cloud import storage


def create_client() -> storage.Client:
    """
    Construct a client object for the Storage API using the
    application default credentials.

    Returns:
        Storage API client object.
    """
    # Construct the service object for interacting with the Cloud Storage API -
    # the 'storage' service, at version 'v1'.
    # Authentication is provided by application default credentials.
    # When running locally, these are available after running
    # `gcloud auth application-default login`. When running on Compute
    # Engine, these are available from the environment.
    return storage.Client()


def list_buckets(client: storage.Client, project_id: str) -> List[storage.Bucket]:
    """
    Retrieve bucket list of a project using provided client object.


    Args:
        client: Storage API client object.
        project_id: name of the project to list buckets from.

    Returns:
        List of Buckets found in the project.
    """
    buckets = client.list_buckets()
    return list(buckets)


def main(project_id: str) -> None:
    client = create_client()
    buckets = list_buckets(client, project_id)
    print(buckets)


if __name__ == "__main__":
    parser = argparse.ArgumentParser(
        description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter
    )
    parser.add_argument("project_id", help="Your Google Cloud Project ID.")

    args = parser.parse_args()

    main(args.project_id)

Authentifier des applications directement avec des jetons d'accès

Pour la plupart des applications, vous pouvez effectuer l'authentification via Identifiants par défaut de l'application, qui recherche les identifiants et gère les jetons à votre place. Toutefois, si votre application nécessite que vous lui fournissiez un jeton d'accès OAuth2, vous pouvez en obtenir un auprès du serveur de métadonnées de Compute Engine et l'utiliser dans votre application.

Il existe plusieurs manières d'obtenir et d'utiliser ces jetons d'accès pour authentifier vos applications. Par exemple, vous pouvez exploiter curl pour créer une requête simple ou utiliser un langage de programmation tel que Python pour plus de flexibilité.

cURL

Pour demander un jeton d'accès et envoyer une requête à une API à l'aide de curl, procédez comme suit :

  1. Sur l'instance sur laquelle votre application s'exécute, exécutez la commande suivante pour interroger le serveur de métadonnées et obtenir un jeton d'accès :

    $ curl "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token" \
    -H "Metadata-Flavor: Google"

    La requête renvoie une réponse semblable à celle-ci :

    {
          "access_token":"ya29.AHES6ZRN3-HlhAPya30GnW_bHSb_QtAS08i85nHq39HE3C2LTrCARA",
          "expires_in":3599,
          "token_type":"Bearer"
     }

    Pour les requêtes API, vous devez inclure la valeur access_token, et non l'intégralité de la réponse. Si le processeur JSON de ligne de commande jq est installé, vous pouvez utiliser la commande suivante pour extraire la valeur du jeton d'accès de la réponse :

    $ ACCESS_TOKEN=`curl \
    "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token" \
    -H "Metadata-Flavor: Google" | jq -r '.access_token'`
    
  2. Copiez la valeur de la propriété access_token de la réponse et utilisez-la pour envoyer des requêtes à l'API. Par exemple, la requête suivante affiche la liste des instances de votre projet dans une zone donnée :

    $ curl https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/[ZONE]/instances \
    -H "Authorization":"Bearer [ACCESS_TOKEN]"
    

    où :

    • [PROJECT_ID] est l'ID de projet de cette requête.
    • [ZONE] correspond à la zone pour laquelle répertorier les instances.
    • [ACCESS_TOKEN] correspond à la valeur du jeton d'accès obtenue à l'étape 1.

    Pour plus d'informations sur les paramètres que vous pouvez définir dans votre requête, consultez la documentation relative aux paramètres.

Python

Cet exemple montre comment demander un jeton permettant d'accéder à l'API Cloud Storage dans une application Python. L'exemple utilise la procédure suivante :

  1. Demande d'un jeton d'accès au serveur de métadonnées
  2. Récupération du jeton d'accès à partir de la réponse du serveur
  3. Utilisation du jeton d'accès pour envoyer une requête à Google Cloud Storage
  4. Si la requête aboutit, le script affiche la réponse

import argparse

import requests


METADATA_URL = "http://metadata.google.internal/computeMetadata/v1/"
METADATA_HEADERS = {"Metadata-Flavor": "Google"}
SERVICE_ACCOUNT = "default"


def get_access_token() -> str:
    """
    Retrieves access token from the metadata server.

    Returns:
        The access token.
    """
    url = f"{METADATA_URL}instance/service-accounts/{SERVICE_ACCOUNT}/token"

    # Request an access token from the metadata server.
    r = requests.get(url, headers=METADATA_HEADERS)
    r.raise_for_status()

    # Extract the access token from the response.
    access_token = r.json()["access_token"]

    return access_token


def list_buckets(project_id: str, access_token: str) -> dict:
    """
    Calls Storage API to retrieve a list of buckets.

    Args:
        project_id: name of the project to list buckets from.
        access_token: access token to authenticate with.

    Returns:
        Response from the API.
    """
    url = "https://www.googleapis.com/storage/v1/b"
    params = {"project": project_id}
    headers = {"Authorization": f"Bearer {access_token}"}

    r = requests.get(url, params=params, headers=headers)
    r.raise_for_status()

    return r.json()


def main(project_id: str) -> None:
    """
    Retrieves access token from metadata server and uses it to list
    buckets in a project.

    Args:
        project_id: name of the project to list buckets from.
    """
    access_token = get_access_token()
    buckets = list_buckets(project_id, access_token)
    print(buckets)


if __name__ == "__main__":
    parser = argparse.ArgumentParser(
        description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter
    )
    parser.add_argument("project_id", help="Your Google Cloud project ID.")

    args = parser.parse_args()

    main(args.project_id)

Les jetons d'accès expirent après une courte période. Le serveur de métadonnées met en cache les jetons d'accès jusqu'à ce qu'il ne reste plus que cinq minutes avant leur expiration. Vous pouvez demander de nouveaux jetons aussi souvent que vous le souhaitez. Notez toutefois que vos applications doivent disposer d'un jeton d'accès valide pour que leurs appels d'API aboutissent.

Outils d'authentification sur une instance utilisant un compte de service

Certaines applications peuvent utiliser des commandes des outils gcloud et gsutil, qui sont incluses par défaut dans la plupart des images Compute Engine. Ces outils reconnaissent automatiquement le compte de service d'une instance et les autorisations correspondantes accordées au compte de service. Plus précisément, si vous attribuez les rôles appropriés au compte de service, vous pouvez utiliser les outils gcloud et gsutil à partir de vos instances sans avoir à employer gcloud auth login.

Cette reconnaissance de compte de service est effectuée automatiquement et ne s'applique qu'aux outils gcloud et gsutil inclus dans l'instance. Si vous créez des outils ou ajoutez des outils personnalisés, vous devez autoriser votre application à l'aide d'une bibliothèque cliente ou en utilisant des jetons d'accès directement dans votre application.

Pour tirer parti de la reconnaissance automatique des comptes de service, accordez les rôles IAM appropriés au compte de service et configurez une instance à exécuter en tant que compte de service. Par exemple, si vous attribuez le rôle roles/storage.objectAdmin à un compte de service, l'outil gsutil peut gérer et accéder automatiquement aux objets Cloud Storage.

De même, si vous activez roles/compute.instanceAdmin.v1 pour le compte de service, l'outil gcloud compute peut gérer automatiquement les instances.

Modifier le compte de service et les niveaux d'accès d'une instance

Si vous souhaitez exécuter la VM via une identité différente ou si l'instance a besoin d'un ensemble de champs d'application différent pour appeler les API requises, vous pouvez modifier le compte de service et les niveaux d'accès d'une instance existante. Par exemple, vous pouvez modifier les niveaux d'accès pour accorder l'accès à une nouvelle API, supprimer le compte de service et les niveaux d'accès pour empêcher la VM d'accéder aux services Google Cloud, ou modifier la VM afin qu'elle s'exécute en utilisant l'identité d'un compte de service que vous avez créé plutôt que d'utiliser l'identité du compte de service Compute Engine par défaut. Toutefois, nous vous recommandons d'utiliser des stratégies IAM précises plutôt que des niveaux d'accès pour contrôler l'accès du compte de service aux ressources.

Pour que vous puissiez modifier le compte de service et les niveaux d'accès d'une instance, celle-ci doit être temporairement arrêtée. Pour arrêter l'instance, consultez la section Arrêter une instance. Après avoir modifié le compte de service ou les champs d'application d'accès, n'oubliez pas de redémarrer l'instance. Utilisez l'une des méthodes suivantes pour modifier le compte de service ou les champs d'application d'accès de l'instance arrêtée.

Console

  1. Accédez à la page Instances de VM.

    Accéder à Instances de VM

  2. Cliquez sur le nom de l'instance de VM dont vous souhaitez modifier le compte de service.

  3. Si l'instance n'est pas arrêtée, cliquez sur Arrêter. Attendez que l'instance soit arrêtée.

  4. Cliquez ensuite sur Modifier.

  5. Faites défiler jusqu'à la section Compte de service.

  6. Dans la liste déroulante, sélectionnez le compte de service à attribuer à l'instance.

    • Si vous choisissez le compte de service par défaut, vous pouvez modifier ses niveaux d'accès dans la console Google Cloud.
      • Pour modifier les niveaux d'accès, sélectionnez Définir l'accès pour chaque API dans la section Niveaux d'accès et définissez les niveaux d'accès appropriés pour vos besoins.
      • Si vous ne savez pas quels niveaux d'accès définir, choisissez Autoriser l'accès complet à l'ensemble des APIs Cloud, puis assurez-vous de restreindre l'accès en définissant des rôles IAM sur le compte de service.
    • Si vous choisissez un autre compte de service, le niveau d'accès de la VM est défini par défaut sur le niveau cloud-platform. Vous pouvez modifier le niveau d'accès à l'aide de gcloud CLI ou de l'API Compute Engine.
    • Pour en savoir plus sur la définition des niveaux d'accès, consultez Bonnes pratiques.
  7. Cliquez sur Enregistrer pour enregistrer les modifications.

gcloud

Utilisez la commande instances set-service-account et indiquez le nom de l'instance, l'adresse e-mail du compte de service et les niveaux d'accès souhaités. Pour en savoir plus sur la définition des niveaux d'accès, consultez Bonnes pratiques.

gcloud compute instances set-service-account [INSTANCE_NAME] \
   [--service-account [SERVICE_ACCOUNT_EMAIL] | --no-service-account] \
   [--no-scopes | --scopes [SCOPES,...]]

où :

  • [SERVICE_ACCOUNT_EMAIL] correspond à l'adresse e-mail du compte de service que vous souhaitez utiliser. Par exemple : my-sa-123@my-project-123.iam.gserviceaccount.com.
  • [INSTANCE_NAME] est le nom de l'instance.
  • [SCOPES] correspond à une liste d'URI de champs d'application complets ou d'alias de champs d'application séparés par des virgules et fournis dans la description de l'indicateur --scopes. Si vous souhaitez supprimer tous les champs d'application de l'instance, utilisez plutôt l'indicateur --no-scopes.

Par exemple, la commande suivante attribue le compte de service my-sa-123@my-project-123.iam.gserviceaccount.com à une instance appelée "example-instance" et définit les champs d'application d'accès sur cette instance de manière à accorder un accès en lecture/écriture à Compute Engine et un accès en lecture seule à Cloud Storage.

gcloud compute instances set-service-account example-instance \
   --service-account my-sa-123@my-project-123.iam.gserviceaccount.com \
   --scopes compute-rw,storage-ro

API

Dans l'API, envoyez une requête POST à la méthode setServiceAccount :

https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/[ZONE]/instances/[INSTANCE_NAME]/setServiceAccount

où :

  • [PROJECT_ID] est l'ID de projet de cette requête.
  • [ZONE] correspond à la zone où se trouve l'instance.
  • [INSTANCE_NAME] est le nom de l'instance.

Dans le corps de la requête, indiquez l'adresse e-mail du compte de service et les URI de champ d'application souhaités pour l'instance. Pour en savoir plus sur la définition des niveaux d'accès, consultez Bonnes pratiques.

{
  "email": "[SERVICE_ACCOUNT_EMAIL]",
  "scopes": [
    "[SCOPE_URI]",
    "[SCOPE_URI]",
    ...
  ]
}

Par exemple, la requête suivante utilise l'adresse e-mail de compte de service my-sa-123@my-project-123.iam.gserviceaccount.com et définit Cloud Storage et BigQuery en tant que champ d'application :

{
  "email": "my-sa-123@my-project-123.iam.gserviceaccount.com",
  "scopes": [
    "https://www.googleapis.com/auth/bigquery",
    "https://www.googleapis.com/auth/devstorage.read_only"
  ]
}

Obtenir l'adresse e-mail d'un compte de service

Pour identifier un compte de service, vous devez disposer de l'adresse e-mail de ce dernier. Appliquez l'une des procédures suivantes pour obtenir l'adresse e-mail d'un compte de service :

Console

  1. Accédez à la page Comptes de service.

    Accéder à Comptes de service

  2. Si vous y êtes invité, sélectionnez un projet. La page des comptes de service répertorie tous les comptes de service du projet et leurs adresses e-mail.

gcloud

Exécutez la commande gcloud compute instances describe à partir de votre ordinateur local :

gcloud compute instances describe [INSTANCE_NAME] --format json
{
      ...
      "serviceAccounts":[
         {
            "email":"123845678986-compute@developer.gserviceaccount.com",
            "scopes":[
               "https://www.googleapis.com/auth/devstorage.full_control"
            ]
         }
      ]
      ...
   }

Si l'instance n'utilise pas de compte de service, vous recevez une réponse sans la propriété serviceAccounts.

Serveur de métadonnées

Interrogez le serveur de métadonnées à partir de l'instance elle-même. Envoyez une requête à http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/ :

user@myinst:~$ curl "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/" \
-H "Metadata-Flavor: Google"

Si vous avez activé un ou plusieurs comptes de service lors de la création de l'instance, cette commande curl renvoie un résultat semblable au suivant :

123845678986-compute@developer.gserviceaccount.com/
default/

Si l'instance n'utilise pas de compte de service, vous recevez une réponse vide.

API

Envoyez une requête à l'API des comptes de service.

Utiliser le compte de service Compute Engine par défaut

Si vous connaissez le compte de service par défaut de Compute Engine et que vous souhaitez utiliser ses identifiants au lieu de créer des comptes de service, vous pouvez accorder des rôles IAM au compte de service par défaut.

Par défaut, toutes les instances Compute Engine peuvent être exécutées via le compte de service par défaut. Lorsque vous créez une instance à l'aide de Google Cloud CLI ou de la console Google Cloud et que vous ne spécifiez pas de compte de service, le compte de service par défaut est attribué à l'instance.

Avant d'attribuer des rôles IAM au compte de service par défaut, notez les points suivants :

  • L'attribution d'un rôle IAM au compte de service par défaut affecte toutes les instances exécutées en tant que compte de service par défaut. Par exemple, si vous accordez le rôle roles/storage.objectAdmin au compte de service par défaut, toutes les instances exécutées en tant que compte de service par défaut avec les champs d'application d'accès requis disposent des autorisations accordées par le rôle roles/storage.objectAdmin. De même, si vous limitez l'accès en omettant certains rôles, cela affecte toutes les instances exécutées en tant que compte de service par défaut.

  • Vous devez révoquer l'autorisation d'éditeur de projet pour le compte de service. Par défaut, le compte de service par défaut est ajouté aux projets en tant qu'éditeur de projet. Pour utiliser les rôles IAM, vous devez révoquer l'autorisation d'éditeur de projet.

En cas de doute sur l'attribution de rôles IAM au compte de service par défaut, créez plutôt un nouveau compte de service.

Suivez ces instructions pour accorder un rôle IAM au compte de service par défaut :

  1. Dans la console Google Cloud, accédez à la page IAM.

    Accéder à IAM

  2. Si vous y êtes invité, sélectionnez un projet.

  3. Recherchez le compte de service nommé Compte de service Compute Engine par défaut.

  4. Dans la colonne Rôle(s), développez le menu déroulant "Compte de service Compute Engine par défaut".

  5. Supprimez l'accès d'éditeur et enregistrez vos modifications.

  6. Ensuite, accordez des rôles IAM au compte de service.

Toutes les instances de machine virtuelle en cours d'exécution en tant que compte de service par défaut ont désormais accès à d'autres API Google Cloud, selon les rôles IAM que vous avez accordés au compte.

Si vous souhaitez configurer une nouvelle instance à exécuter en tant que compte de service par défaut, suivez ces instructions :

Console

  1. Accédez à la page Créer une instance.

    Accéder à Créer une instance

  2. Spécifiez les détails de la VM.

  3. Dans la section Identité et accès à l'API, choisissez Compte de service Compute Engine par défaut dans la liste déroulante Compte de service.

  4. Poursuivez le processus de création de la VM.

gcloud

Pour créer une instance et l'autoriser à accéder à tous les services Google Cloud utilisant le compte de service par défaut :

gcloud compute instances create [INSTANCE_NAME] \
     --scopes cloud-platform

API

Dans l'API, écrivez une requête standard pour créer une instance, mais incluez la propriété serviceAccounts. Obtenez l'ID du compte de service par défaut et ajoutez-le en tant que propriété email du compte de service. Ensuite, définissez un ou plusieurs champs d'application dans la propriété scopes.

POST https://compute.googleapis.com/compute/v1/projects/zones/[ZONE]/instances

{
  "machineType": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/[ZONE]/machineTypes/[MACHINE_TYPE]",
  "name": "[INSTANCE_NAME]",
  "serviceAccounts": [
   {
    "email": "[DEFAULT_SERVICE_ACCOUNT_EMAIL]",
    "scopes": ["https://www.googleapis.com/auth/cloud-platform"]
   }
  ],
  ...
}

Bonnes pratiques

  • Google recommande que chaque instance de VM devant appeler une API Google s'exécute via un compte de service disposant des autorisations minimales nécessaires pour que cette VM puisse effectuer les tâches requises.
  • Suivez ces instructions pour configurer des comptes de service pour vos VM :

    1. Créez un compte de service plutôt que d'utiliser le compte de service Compute Engine par défaut.
    2. Accordez des rôles IAM à ce compte de service, pour les ressources dont il a besoin uniquement.
    3. Configurez la VM pour qu'elle s'exécute via le nouveau compte de service que vous avez créé.
    4. Accordez le niveau d'accès https://www.googleapis.com/auth/cloud-platform à votre VM pour lui permettre d'accéder à la plupart des API Google Cloud. Les autorisations IAM de la VM sont ainsi entièrement déterminées par les rôles IAM que vous avez accordés au compte de service associé. Le compte de service ne peut exécuter que des méthodes API autorisées à la fois par le niveau d'accès et par les rôles IAM spécifiques qui lui ont été accordés.
  • Limitez les privilèges des comptes de service et vérifiez régulièrement les autorisations de ces comptes pour vous assurer qu'elles sont à jour.

  • 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é, nous vous recommandons 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.

  • Limitez les risques de sécurité associés à votre compte de service. Si vous souhaitez en savoir plus, consultez Bonnes pratiques d'utilisation des comptes de service.

Étapes suivantes

Faites l'essai

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

Profiter d'un essai gratuit de Compute Engine