Configurer des destinations de journaux avec des comptes de service gérés par l'utilisateur

Cette page explique comment acheminer les journaux en créant des collecteurs configurés avec des comptes de service gérés par l'utilisateur. Par défaut, la journalisation utilise un compte de service de journalisation pour tous les collecteurs d'une ressource. Toutefois, si vos destinations de journalisation se trouvent dans des projets différents, vous pouvez créer et gérer votre propre compte de service géré par l'utilisateur, ce qui vous permet de gérer de manière centralisée les autorisations de Identity and Access Management à partir du projet contenant votre compte de service géré par l'utilisateur.

Vous ne pouvez créer un collecteur qui utilise un compte de service géré par l'utilisateur que lorsque la destination du collecteur est un bucket de journaux ou un projet Google Cloud. L'exemple de ce document montre comment configurer un collecteur qui utilise un compte de service géré par l'utilisateur dont la destination est un bucket de journaux.

Avant de commencer

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  2. Assurez-vous de disposer d'un compte de service géré par l'utilisateur, puis définissez les variables suivantes sur les valeurs appropriées pour votre compte de service géré par l'utilisateur:

    • CUSTOM_SA_PROJECT_ID : ID du projet qui contient votre compte de service géré par l'utilisateur.

    • CUSTOM_SA: adresse e-mail de votre compte de service géré par l'utilisateur.

    Pour savoir comment créer un compte de service, consultez la section Créer des comptes de service.

  3. Assurez-vous de disposer d'un bucket de journaux pouvant servir de destination à un récepteur de journaux, puis définissez les variables suivantes sur des valeurs appropriées pour votre bucket de journaux. Si nécessaire, créez un bucket de journaux:

    • LOG_BUCKET_PROJECT_ID : ID du projet contenant votre bucket de journaux.

    • LOCATION: emplacement de votre bucket de journaux.

    • BUCKET_NAME: nom de votre bucket de journaux.

  4. Identifiez le nom du compte de service de journalisation qui existe dans le projet dans lequel vous prévoyez de créer le collecteur de journaux, puis définissez les variables suivantes sur les valeurs appropriées:

    • SINK_PROJECT_ID : ID du projet dans lequel vous prévoyez de créer le collecteur de journaux.

    • LOGGING_SA: adresse e-mail du compte de service de journalisation par défaut. Pour obtenir cette adresse, exécutez la commande suivante:

      gcloud logging settings describe --project=SINK_PROJECT_ID
      

      Dans la réponse, la ligne commençant par loggingServiceAccountId indique l'adresse e-mail de votre compte de service.

  5. Dans le projet contenant votre compte de service géré par l'utilisateur, assurez-vous que la contrainte booléenne de règle d'administration iam.disableCrossProjectServiceAccountUsage n'est pas appliquée. Par défaut, cette contrainte est appliquée. Pour désactiver cette contrainte afin de pouvoir associer un compte de service à une ressource d'un autre projet, exécutez la commande suivante:

    gcloud resource-manager org-policies disable-enforce \
    iam.disableCrossProjectServiceAccountUsage \
    --project=CUSTOM_SA_PROJECT_ID
    

    Pour en savoir plus sur l'activation des comptes de service entre les projets, consultez la section Activer l'association des comptes de service à plusieurs projets.

Accorder des rôles IAM

Cette section décrit les conditions préalables à la création d'un collecteur qui utilise un compte de service géré par l'utilisateur.

Autoriser le compte de service géré par l'utilisateur à écrire des entrées de journal sur la destination du récepteur

Accordez au compte de service géré par l'utilisateur les autorisations dont il a besoin pour écrire des entrées de journal à la destination du récepteur que vous créerez à l'étape suivante. La destination du récepteur sera un bucket de journaux stocké dans le projet nommé LOG_BUCKET_PROJECT_ID.

Pour accorder les autorisations requises au compte de service géré par l'utilisateur, attribuez-lui le rôle Écrivain de bucket de journaux (roles/logging.bucketWriter) sur le projet contenant le bucket de journaux:

gcloud projects add-iam-policy-binding LOG_BUCKET_PROJECT_ID \
--member='serviceAccount:CUSTOM_SA' \
--role='roles/logging.bucketWriter'

Pour en savoir plus sur la commande précédente, consultez gcloud projects add-iam-policy-binding.

Configurer l'usurpation d'identité d'un compte de service

Configurez le compte de service Cloud Logging par défaut, LOGGING_SA, afin qu'il puisse usurper l'identité du compte de service géré par l'utilisateur, CUSTOM_SA. Le compte de service Cloud Logging par défaut existe dans le projet Google Cloud dans lequel vous souhaitez créer des destinations de journalisation qui utilisent le compte de service géré par l'utilisateur.

Pour configurer l'usurpation d'identité du compte de service, attribuez le rôle Créateur de jetons du compte de service (roles/iam.serviceAccountTokenCreator) au compte de service Cloud Logging sur le compte de service géré par l'utilisateur:

gcloud iam service-accounts add-iam-policy-binding CUSTOM_SA \
--project=CUSTOM_SA_PROJECT_ID \
--member='serviceAccount:LOGGING_SA' \
--role='roles/iam.serviceAccountTokenCreator'

L'emprunt d'identité de compte de service implique deux comptes principaux: le compte de service qui ne dispose pas des autorisations nécessaires pour accéder à une ressource et le compte de service porteur de privilèges qui dispose des autorisations nécessaires pour accéder à une ressource. Dans ce cas, le compte de service géré par l'utilisateur est le compte disposant des droits, car il peut écrire des entrées de journal dans la destination du récepteur, qui est un bucket de journaux dans le projet nommé LOG_BUCKET_PROJECT_ID. Le compte de service Logging dispose des droits d'acheminement des journaux.

Pour en savoir plus sur le rôle Créateur de jetons de compte de service, consultez la section Rôles pour gérer et usurper l'identité de comptes de service: rôle Créateur de jetons de compte de service.

Pour en savoir plus sur l'emprunt d'identité d'un compte de service, consultez la section À propos de l'emprunt d'identité d'un compte de service.

Autoriser l'entité principale à exécuter des opérations en tant que compte de service géré par l'utilisateur

Accordez au principal qui créera le collecteur les autorisations dont il a besoin pour exécuter des opérations en tant que compte de service géré par l'utilisateur.

Pour accorder les autorisations requises, attribuez au principal le rôle "Utilisateur de compte de service" (roles/iam.serviceAccountUser) sur le projet Google Cloud qui stocke le compte de service géré par l'utilisateur, CUSTOM_SA_PROJECT_ID.

Avant d'exécuter la commande suivante, effectuez les remplacements suivants:

  • PRINCIPAL: identifiant du compte principal auquel vous souhaitez accorder le rôle. Les identifiants principaux se présentent généralement sous la forme suivante : PRINCIPAL-TYPE:ID. Par exemple, user:my-user@example.com. Pour obtenir la liste complète des formats pouvant être utilisés pour PRINCIPAL, consultez la section Identifiants principaux.

Exécutez la commande gcloud iam service-accounts add-iam-policy-binding:

gcloud iam service-accounts add-iam-policy-binding CUSTOM_SA \
--project=CUSTOM_SA_PROJECT_ID \
--member='PRINCIPAL' \
--role='roles/iam.serviceAccountUser'

Si vous utilisez des rôles personnalisés, le principal a besoin de l'autorisation iam.serviceAccounts.actAs.

Pour en savoir plus sur le rôle Utilisateur du compte de service, consultez la section Rôles pour gérer et usurper l'identité des comptes de service: rôle Utilisateur du compte de service.

Créer un collecteur de journaux qui utilise un compte de service géré par l'utilisateur

Pour créer un collecteur avec un compte de service géré par l'utilisateur, exécutez la commande gcloud logging sinks create et incluez l'option --custom-writer-identity.

Avant d'exécuter la commande suivante, effectuez les remplacements suivants:

  • SINK_NAME: nom du récepteur de journaux.

Exécutez la commande gcloud logging sinks create:

gcloud logging sinks create SINK_NAME \
logging.googleapis.com/projects/LOG_BUCKET_PROJECT_ID/locations/LOCATION/buckets/BUCKET_NAME \
--custom-writer-identity=serviceAccount:CUSTOM_SA \
--project=SINK_PROJECT_ID

Vérifier que votre sink achemine les journaux

Dans cette section, vous allez utiliser la gcloud CLI pour écrire et lire une entrée de journal afin de vérifier que votre collecteur achemine correctement les journaux.

Pour vérifier que votre récepteur achemine correctement les journaux, procédez comme suit:

  1. Exécutez la commande gcloud logging write :

    Avant d'exécuter la commande suivante, effectuez les remplacements suivants:

    • LOG_NAME : nom du journal. Par exemple, vous pouvez définir ce champ sur mylog.

    Exécutez la commande gcloud logging write:

    gcloud logging write LOG_NAME "Test log entry" --project=SINK_PROJECT_ID
    

    La commande précédente renvoie le message suivant: Created log entry.

  2. Pour lire l'entrée de journal que vous venez d'écrire, exécutez la commande suivante:

    gcloud logging read 'textPayload="Test log entry"' \
    --bucket=BUCKET_NAME --location=LOCATION \
    --view=_AllLogs --project=SINK_PROJECT_ID
    

Étape suivante