Exemples de journaux d'audit pour les comptes de service

Cette page fournit des exemples de journaux d'audit générés lorsque vous gérez ou utilisez un compte de service.

Pour plus d'informations sur l'activation et l'affichage des journaux d'audit, consultez la section Journalisation d'audit de Cloud IAM.

Octroi du rôle utilisateur du compte de service

Un membre peut obtenir les mêmes autorisations qu'un compte de service en usurpant l'identité du compte de service. Pour autoriser un membre à emprunter l'identité d'un compte de service, vous pouvez accorder le rôle d'utilisateur de compte de service (roles/iam.serviceAccountUser) au membre du compte de service.

L'exemple suivant illustre une entrée de journal permettant d'accorder le rôle Utilisateur de compte de service à un membre :

{
      "logName": "projects/my-project/logs/cloudaudit.googleapis.com%2Factivity",
      "protoPayload": {
        "@type": "type.googleapis.com/google.cloud.audit.AuditLog",
        "methodName": "google.iam.admin.v1.SetIAMPolicy",
        "request": {
          "@type": "type.googleapis.com/google.iam.v1.SetIamPolicyRequest",
          "resource": "projects/-/serviceAccounts/my-service-account@my-project.iam.gserviceaccount.com"
        },
        "resourceName": "projects/-/serviceAccounts/123456789012345678901",
        "response": {
          "@type": "type.googleapis.com/google.iam.v1.Policy",
          "bindings": [
            {
              "members": [
                "user:srini@example.com"
              ],
              "role": "roles/iam.serviceAccountUser"
            }
          ]
        },
        "serviceName": "iam.googleapis.com"
      },
      "resource": {
        "type": "service_account"
      }
    }

Lorsque vous accordez le rôle de créateur de jeton de compte de service ( roles/iam.serviceAccountTokenCreator ), qui permet à un membre de créer des identifiants de courte durée, Cloud IAM génère une entrée de journal similaire.

Accorder l'accès à un compte de service pour une ressource

Vous pouvez attribuer un rôle à un compte de service pour une ressource spécifique, ce qui permet au compte de service d'accéder à la ressource. Si le service propriétaire de la ressource prend également en charge la journalisation d'audit, l'attribution d'un rôle au compte de service génère une entrée de journal d'audit. L'entrée de journal inclut le champ protoPayload.authenticationInfo.principalEmail, qui identifie le membre qui a accordé le rôle au compte de service.

L'exemple suivant présente une entrée de journal d'audit pour l'attribution d'un rôle à un compte de service pour un projet. Dans cet exemple, julia@example.com accorde le rôle de Lecteur d'organisation au (roles/resourcemanager.organizationViewer) au compte de service. Le champ protoPayload.serviceName est défini sur cloudresourcemanager.googleapis.com, car le gestionnaire de ressources est le service Google Cloud qui gère les projets. En outre, le champ resource.type est défini sur project :

{
      "logName": "projects/my-project/logs/cloudaudit.googleapis.com%2Factivity",
      "protoPayload": {
        "@type": "type.googleapis.com/google.cloud.audit.AuditLog",
        "authenticationInfo": {
          "principalEmail": "julia@example.com"
        },
        "methodName": "SetIamPolicy",
        "request": {
          "@type": "type.googleapis.com/google.iam.v1.SetIamPolicyRequest",
          "resource": "my-project"
        },
        "resourceName": "projects/my-project",
        "response": {
          "@type": "type.googleapis.com/google.iam.v1.Policy",
          "bindings": [
            {
              "members": [
                "serviceAccount:my-service-account@my-project.iam.gserviceaccount.com"
              ],
              "role": "roles/resourcemanager.organizationViewer"
            }
          ]
        },
        "serviceName": "cloudresourcemanager.googleapis.com"
      },
      "resource": {
        "type": "project"
      }
    }

Authentification en tant que compte de service

Lorsque vous vous authentifiez avec un compte de service, puis envoyez une demande à un service Google Cloud, les journaux d'audit du service identifient le compte de service que vous avez utilisé. Ces informations apparaissent dans le champ protoPayload.authenticationInfo.principalEmail de chaque entrée de journal.

L'exemple suivant montre une entrée de journal d'audit pour une demande GetIAMPolicy qui a été authentifiée avec un compte de service. Dans cet exemple, le compte de service s'appelle my-service-account@my-project.iam.gserviceaccount.com :

{
      "logName": "projects/my-project/logs/cloudaudit.googleapis.com%2Fdata_access",
      "protoPayload": {
        "@type": "type.googleapis.com/google.cloud.audit.AuditLog",
        "authenticationInfo": {
          "principalEmail": "my-service-account@my-project.iam.gserviceaccount.com"
        },
        "methodName": "google.iam.admin.v1.GetIAMPolicy",
        "request": {
          "@type": "type.googleapis.com/google.iam.v1.GetIamPolicyRequest"
        },
        "response": {
          "@type": "type.googleapis.com/google.iam.v1.Policy",
          "bindings": [
            {
              "members": [
                "serviceAccount:my-service-account@my-project.iam.gserviceaccount.com",
                "user:franklin@example.com"
              ],
              "role": "roles/iam.serviceAccountTokenCreator"
            }
          ],
          "etag": "BwWcR/B3tNk=",
          "version": 1
        },
        "serviceName": "iam.googleapis.com"
      }
    }

Création d'identifiants de courte durée

Si vous avez le rôle de créateur de jeton de compte de service (roles/iam.serviceAccountTokenCreator) pour un compte de service, vous pouvez créer des identifiants de courte durée pour le compte de service, utilisez les identifiants pour emprunter l'identité du compte de service. Par exemple, vous pouvez créer des identifiants de courte durée pour appeler une API Google Cloud à partir d'une application qui n'est pas exécutée sur Google Cloud.

Cloud IAM peut générer des journaux d'audit lorsque les membres créent des identifiants de courte durée. Pour recevoir ces journaux d'audit, vous devez activer les journaux d'audit Cloud IAM pour l'activité d'accès aux données.

Après avoir activé les journaux d'audit Cloud IAM pour l'accès aux données, Cloud IAM génère une entrée de journal d'audit chaque fois qu'un membre crée des identifiants de courte durée. L'entrée comprend les champs suivants :

  • protoPayload.authenticationInfo.principalEmail : membre qui a créé les identifiants de courte durée.
  • resource.labels.email_id : compte de service pour lequel des identifiants de courte durée ont été générés.

L'exemple suivant montre une entrée de journal d'audit pour une demande de génération d'un jeton d'accès de courte durée. Dans cet exemple, l'utilisateur amara@example.com a créé un jeton d'accès pour le compte de service my-service-account@my-project.iam.gserviceaccount.com :

{
      "logName": "projects/my-project/logs/cloudaudit.googleapis.com%2Fdata_access",
      "protoPayload": {
        "@type": "type.googleapis.com/google.cloud.audit.AuditLog",
        "authenticationInfo": {
          "principalEmail": "amara@example.com"
        },
        "methodName": "GenerateAccessToken",
        "request": {
          "@type": "type.googleapis.com/google.iam.credentials.v1.GenerateAccessTokenRequest",
          "name": "projects/-/serviceAccounts/my-service-account@my-project.iam.gserviceaccount.com"
        },
        "serviceName": "iamcredentials.googleapis.com"
      },
      "resource": {
        "labels": {
          "email_id": "my-service-account@my-project.iam.gserviceaccount.com",
          "project_id": "my-project",
          "unique_id": "123456789012345678901"
        },
        "type": "service_account"
      }
    }

Configuration d'une instance Compute Engine à exécuter en tant que compte de service

Si un utilisateur possède le rôle Utilisateur du compte de service (roles/iam.serviceAccountUser) sur un compte de service, celui-ci peutcréer une instance de machine virtuelle Compute Engine qui fonctionne comme ce compte de service. Dans ce scénario, l'utilisateur crée l'instance de VM avec ses propres identifiants, et la demande spécifie un compte de service pour l'instance de VM à utiliser.

Lorsqu'un utilisateur crée une instance de VM, Compute Engine crée plusieurs entrées de journal. L'exemple suivant montre la première entrée de journal, qui identifie l'utilisateur qui a créé l'instance de VM et le compte de service utilisé par l'instance. Dans cet exemple, l'utilisateur jackie@example.com a créé une instance qui utilise le compte de service my-service-account@my-project.iam.gserviceaccount.com. Par conséquent, le champ protoPayload.authenticationInfo.principalEmail est défini sur jackie@example.com et le champ protoPayload.request.serviceAccounts[0].email sur my-service-account@my-project.iam.gserviceaccount.com :

{
      "logName": "projects/my-project/logs/cloudaudit.googleapis.com%2Factivity",
      "protoPayload": {
        "@type": "type.googleapis.com/google.cloud.audit.AuditLog",
        "authenticationInfo": {
          "principalEmail": "jackie@example.com"
        },
        "methodName": "v1.compute.instances.insert",
        "request": {
          "@type": "type.googleapis.com/compute.instances.insert",
          "serviceAccounts": [
            {
              "email": "my-service-account@my-project.iam.gserviceaccount.com"
            }
          ]
        },
        "resourceName": "projects/my-project/zones/us-central1-a/instances/my-instance",
        "serviceName": "compute.googleapis.com"
      },
      "resource": {
        "type": "gce_instance"
      }
    }

Authentification avec des identifiants de courte durée

Après avoir créé des identifiants de courte durée, vous pouvez utiliser les identifiants pour appeler les API Google Cloud. Certaines des méthodes que vous appelez peuvent générer des journaux d'audit.

Dans la plupart des cas, ces entrées de journal n'affichent que l'identité usurpée par les identifiants de courte durée. Ils n'affichent pas l'identité qui a créé les identifiants de courte durée.

Toutefois, dans certains cas, les entrées de journal présentent les deux identités. Si vous créez un jeton d'accès OAuth 2.0 de courte durée et que vous envoyez une demande à l'un des services Google Cloud suivants, les entrées suivantes s'affichent :

  • Cloud Deployment Manager
  • Cloud DNS
  • API Cloud IAM Admin
  • API d'identifiants de compte de service Cloud IAM
  • Cloud IoT
  • Cloud Spanner
  • Cloud SQL
  • Cloud Storage
  • Dataflow
  • Dialogflow
  • Google Kubernetes Engine
  • Pub/Sub
  • Resource Manager
  • Cloud Logging

Par exemple, supposons que l'utilisateur yoon@example.com crée un jeton d'accès de courte durée pour le compte de service my-service-account@my-project.iam.gserviceaccount.com. L'utilisateur crée ensuite une instance Memorystore pour Redis à l'aide du jeton d'accès de courte durée pour emprunter l'identité du compte de service. Memorystore pour Redis génère une entrée de journal qui identifie le compte de service, mais pas l'utilisateur :

{
      "logName": "projects/my-project/logs/cloudaudit.googleapis.com%2Factivity",
      "protoPayload": {
        "@type": "type.googleapis.com/google.cloud.audit.AuditLog",
        "authenticationInfo": {
          "principalEmail": "my-service-account@my-project.iam.gserviceaccount.com",
          "serviceAccountDelegationInfo": [
            {
              "firstPartyPrincipal": {
                "principalEmail": "my-service-account@my-project.iam.gserviceaccount.com"
              }
            }
          ]
        },
        "methodName": "google.cloud.redis.v1.CloudRedis.CreateInstance",
        "request": {
          "@type": "type.googleapis.com/google.cloud.redis.v1.CreateInstanceRequest",
          "instance": {
            "memory_size_gb": 1,
            "tier": "BASIC"
          },
          "instance_id": "my-redis-instance",
        },
        "resourceName": "projects/my-project/locations/us-central1/instances/my-redis-instance",
        "response": {
          "@type": "type.googleapis.com/google.longrunning.Operation"
        },
        "serviceName": "redis.googleapis.com"
      },
      "resource": {
        "type": "audited_resource"
      }
    }

En utilisant le même jeton d'accès, yoon@example.com crée une nouvelle rubrique Pub/Sub. Pub/Sub génère une entrée de journal qui identifie à la fois le compte de service et l'utilisateur usurpant l'identité du compte de service :

{
      "logName": "projects/my-project/logs/cloudaudit.googleapis.com%2Factivity",
      "protoPayload": {
        "@type": "type.googleapis.com/google.cloud.audit.AuditLog",
        "authenticationInfo": {
          "principalEmail": "my-service-account@my-project.iam.gserviceaccount.com",
          "serviceAccountDelegationInfo": [
            {
              "firstPartyPrincipal": {
                "principalEmail": "yoon@example.com"
              }
            }
          ]
        },
        "methodName": "google.pubsub.v1.Publisher.CreateTopic",
        "request": {
          "@type": "type.googleapis.com/google.pubsub.v1.Topic",
          "name": "projects/my-project/topics/my-topic"
        },
        "resourceName": "projects/my-project/topics/my-topic",
        "response": {
          "@type": "type.googleapis.com/google.pubsub.v1.Topic"
        },
        "serviceName": "pubsub.googleapis.com"
      },
      "resource": {
        "type": "pubsub_topic"
      }
    }

Envoi de demandes déléguées

Vous pouvez utiliser des demandes déléguées pour créer des identifiants de courte durée qui combinent les autorisations de plusieurs comptes de service. Ces comptes de service forment une chaîne de délégation dans laquelle chaque compte de service délègue ses propres droits d'accès au compte suivant de la chaîne.

Lorsque vous créez des identifiants de courte durée pour des requêtes déléguées et que vous utilisez ces identifiants pour vous authentifier, Cloud IAM génère plusieurs entrées de journal. Plus précisément, vous recevez une entrée de journal pour chaque membre de la chaîne de délégation.

Utilisez les champs suivants dans chaque entrée de journal pour les différencier :

  • protoPayload.authenticationInfo.principalEmail : membre de la chaîne de délégation associée à cette entrée de journal.
  • protoPayload.metadata.identity_delegation_chain : chaîne de délégation pour cette entrée de journal. Inclut tous les membres de la chaîne de délégation qui sont plus élevés que le membre dans protoPayload.authenticationInfo.principalEmail.
  • protoPayload.authorizationInfo[].permission : pour le dernier membre de la chaîne de délégation, ce champ contient l'autorisation requise pour la méthode que vous avez appelée. Pour tous les autres membres de la chaîne de délégation, ce champ contient la valeur iam.serviceAccounts.implicitDelegation.
  • protoPayload.request.name : membre qui a envoyé la demande.

Les exemples suivants présentent les entrées du journal d'audit d'une demande de génération d'un jeton d'accès de courte durée pour une chaîne de délégation. Dans ces exemples, le compte de service high-privilege-service-account@my-project.iam.gserviceaccount.com délègue ses droits à low-privilege-service-account@my-project.iam.gserviceaccount.com.

Vous recevez une entrée de journal pour le premier compte de service dans la chaîne de délégation, high-privilege-service-account@my-project.iam.gserviceaccount.com :

{
      "logName": "projects/my-project/logs/cloudaudit.googleapis.com%2Fdata_access",
      "protoPayload": {
        "@type": "type.googleapis.com/google.cloud.audit.AuditLog",
        "authenticationInfo": {
          "principalEmail": "high-privilege-service-account@my-project.iam.gserviceaccount.com"
        },
        "authorizationInfo": [
          {
            "permission": "iam.serviceAccounts.implicitDelegation"
          }
        ],
        "metadata": {
          "identityDelegationChain": [
            "low-privilege-service-account@my-project.iam.gserviceaccount.com",
            "projects/-/serviceAccounts/high-privilege-service-account@my-project.iam.gserviceaccount.com"
          ]
        },
        "methodName": "GenerateAccessToken",
        "request": {
          "@type": "type.googleapis.com/google.iam.credentials.v1.GenerateAccessTokenRequest",
          "name": "projects/-/serviceAccounts/high-privilege-service-account@my-project.iam.gserviceaccount.com"
        },
        "serviceName": "iamcredentials.googleapis.com"
      },
      "resource": {
        "type": "service_account"
      }
    }

Vous recevez également une entrée de journal pour l'autre compte de service dans la chaîne de délégation, low-privilege-service-account@my-project.iam.gserviceaccount.com. Le champ protoPayload.request.name indique que le compte de service high-privilege-service-account@my-project.iam.gserviceaccount.com a envoyé la requête d'origine :

{
      "logName": "projects/my-project/logs/cloudaudit.googleapis.com%2Fdata_access",
      "protoPayload": {
        "@type": "type.googleapis.com/google.cloud.audit.AuditLog",
        "authenticationInfo": {
          "principalEmail": "low-privilege-service-account@my-project.iam.gserviceaccount.com"
        },
        "authorizationInfo": [
          {
            "permission": "iam.serviceAccounts.getAccessToken"
          }
        ],
        "metadata": {
          "identityDelegationChain": [
            "projects/-/serviceAccounts/high-privilege-service-account@my-project.iam.gserviceaccount.com"
          ]
        },
        "methodName": "GenerateAccessToken",
        "request": {
          "@type": "type.googleapis.com/google.iam.credentials.v1.GenerateAccessTokenRequest",
          "name": "projects/-/serviceAccounts/high-privilege-service-account@my-project.iam.gserviceaccount.com"
        },
        "serviceName": "iamcredentials.googleapis.com"
      },
      "resource": {
        "type": "service_account"
      }
    }

Étape suivante