Exemplos de registros de auditoria para contas de serviço

Nesta página, mostramos exemplos dos registros de auditoria gerados quando você gerencia ou usa uma conta de serviço.

Para mais informações sobre como ativar e visualizar registros de auditoria, consulte geração de registros de auditoria do Cloud IAM.

Como conceder o papel do usuário Conta de serviço

Um membro pode receber as mesmas permissões de uma conta de serviço personificando a conta de serviço. Para permitir que um membro personifique uma conta de serviço, conceda o papel do usuário Conta de serviço (roles/iam.serviceAccountUser) ao membro da conta de serviço.

O exemplo a seguir mostra uma entrada de registro para conceder o papel do usuário Conta de serviço a um membro:

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

Quando você concede o papel Criador de tokens da conta de serviço (roles/iam.serviceAccountTokenCreator), que permite a um membro criar credenciais de curta duração, o Cloud IAM gera uma entrada de registro semelhante.

Como conceder acesso a uma conta de serviço para um recurso

Conceda um papel a uma conta de serviço para um recurso específico, o que permite que a conta de serviço acesse o recurso. Se o serviço responsável pelo recurso também for compatível com o registro de auditoria, a concessão de um papel à conta de serviço vai gerar uma entrada de registro de auditoria. A entrada de registro inclui o campo protoPayload.authenticationInfo.principalEmail, que identifica o membro que concedeu o papel à conta de serviço.

O exemplo a seguir mostra uma entrada de registro de auditoria para a concessão de um papel a uma conta de serviço para um projeto. Neste exemplo, julia@example.com concedeu o papel Leitor da Organização (roles/resourcemanager.organizationViewer) para a conta de serviço. O campo protoPayload.serviceName está definido como cloudresourcemanager.googleapis.com, porque o Resource Manager é o serviço do Google Cloud que gerencia projetos. Além disso, o campo resource.type está definido como 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"
      }
    }

Como autenticar como uma conta de serviço

Quando você autentica com uma conta de serviço e envia uma solicitação para um serviço do Google Cloud, os registros de auditoria do serviço identificam a conta de serviço que você usou. Essa informação é exibida no campo protoPayload.authenticationInfo.principalEmail em cada entrada de registro.

O exemplo a seguir mostra uma entrada de registro de auditoria para uma solicitação GetIAMPolicy autenticada com uma conta de serviço. Neste exemplo, a conta de serviço é chamada 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"
      }
    }

Como criar credenciais de curta duração

Se tiver o papel Criador de tokens de conta de serviço (roles/iam.serviceAccountTokenCreator) para uma conta de serviço, você poderá criar credenciais de curta duração para a conta e usar as credenciais para personificar a conta de serviço. Por exemplo, convém criar credenciais de curta duração para chamar uma API do Google Cloud de um aplicativo não executado no Google Cloud.

O Cloud IAM pode gerar registros de auditoria quando os membros criam credenciais de curta duração. Para receber esses registros de auditoria, você precisa ativar os registros de auditoria do Cloud IAM para a atividade de acesso a dados.

Depois de ativar registros de auditoria do Cloud IAM para atividade de acesso a dados, o Cloud IAM vai gerar uma entrada de registro de auditoria sempre que um membro criar credenciais de curta duração. A entrada inclui os seguintes campos:

  • protoPayload.authenticationInfo.principalEmail: o membro que criou as credenciais de curta duração.
  • resource.labels.email_id: a conta de serviço para que credenciais de curta duração foram geradas.

O exemplo a seguir mostra uma entrada de registro de auditoria de uma solicitação de geração de um token de acesso de curta duração. Neste exemplo, o usuário amara@example.com criou um token de acesso para a conta de serviço 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"
      }
    }

Como configurar uma instância do Compute Engine a ser executada como uma conta de serviço

Se tiver o papel Usuário da conta de serviço (roles/iam.serviceAccountUser) em uma conta de serviço, um usuário poderá criar uma instância de máquina virtual (VM) do Compute Engine executada como essa conta de serviço. Nesse cenário, o usuário cria a instância de VM com as próprias credenciais, e a solicitação especifica uma conta de serviço para a instância de VM a ser usada.

Quando um usuário cria uma instância de VM, o Compute Engine cria várias entradas de registro. O exemplo a seguir mostra a primeira entrada de registro, que identifica o usuário que criou a instância de VM e a conta de serviço usada pela instância. Neste exemplo, o usuário jackie@example.com criou uma instância que usa a conta de serviço my-service-account@my-project.iam.gserviceaccount.com. Dessa maneira, o campo protoPayload.authenticationInfo.principalEmail é definido como jackie@example.com, e o campo protoPayload.request.serviceAccounts[0].email é definido como 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"
      }
    }

Como autenticar com credenciais de curta duração

Depois de criar credenciais de curta duração, você poderá usar as credenciais para chamar as APIs do Google Cloud. Alguns dos métodos chamados podem gerar registros de auditoria.

Na maioria dos casos, essas entradas de registro mostram apenas a identidade que as credenciais de curta duração estão representando. Elas não mostram a identidade que criou as credenciais de curta duração.

No entanto, há alguns casos em que as entradas de registro mostram as duas identidades. Se você criar um token de acesso OAuth 2.0 de curta duração e enviar uma solicitação para um dos seguintes serviços do Google Cloud, as entradas de registro resultantes mostrarão ambas as identidades:

  • Cloud Deployment Manager
  • Cloud DNS
  • API Admin do Cloud IAM
  • API Service Account Credentials do Cloud IAM
  • Cloud IoT
  • Cloud Spanner
  • Cloud SQL
  • Cloud Storage
  • Dataflow
  • Dialogflow
  • Google Kubernetes Engine
  • Pub/Sub
  • Resource Manager
  • Cloud Logging

Por exemplo, suponhamos que o usuário yoon@example.com crie um token de acesso de curta duração para a conta de serviço my-service-account@my-project.iam.gserviceaccount.com. Em seguida, o usuário cria uma instância do Memorystore para Redis usando o token de acesso de curta duração para representar a conta de serviço. O Memorystore para Redis gera uma entrada de registro que identifica a conta de serviço, mas não o usuário:

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

Usando o mesmo token de acesso, yoon@example.com cria um novo tópico Pub/Sub. Pub/Sub gera uma entrada de registro que identifica a conta de serviço e o usuário que está representando a conta de serviço:

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

Como enviar solicitações delegadas

Use solicitações delegadas para criar credenciais de curta duração que combinem permissões de várias contas de serviço. Essas contas de serviço formam uma cadeia de delegação, em que cada conta de serviço delega privilégios de acesso próprios à próxima conta na cadeia.

Quando você cria credenciais de curta duração para solicitações delegadas e usa essas credenciais na autenticação, o Cloud IAM gera várias entradas de registro. Mais especificamente, você recebe uma entrada de registro para cada membro da cadeia de delegação.

Use os seguintes campos em cada entrada de registro para ajudar a diferenciá-los:

  • protoPayload.authenticationInfo.principalEmail: o membro da cadeia de delegação associada a essa entrada de registro.
  • protoPayload.metadata.identity_delegation_chain: a cadeia de delegação dessa entrada de registro. Inclui todos os membros da cadeia de delegação maiores que o membro em protoPayload.authenticationInfo.principalEmail.
  • protoPayload.authorizationInfo[].permission: para o último membro da cadeia de delegação, este campo contém a permissão obrigatória para o método chamado. Para todos os outros membros da cadeia de delegação, esse campo contém o valor iam.serviceAccounts.implicitDelegation.
  • protoPayload.request.name: o membro que enviou a solicitação.

Os exemplos a seguir mostram as entradas de registro de auditoria de uma solicitação para gerar um token de acesso de curta duração para uma cadeia de delegação. Nestes exemplos, a conta de serviço high-privilege-service-account@my-project.iam.gserviceaccount.com está delegando a autoridade para low-privilege-service-account@my-project.iam.gserviceaccount.com.

Você recebe uma entrada de registro para a primeira conta de serviço na cadeia de delegação, 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"
      }
    }

Você também recebe uma entrada de registro para a outra conta de serviço na cadeia de delegação, low-privilege-service-account@my-project.iam.gserviceaccount.com. O protoPayload.request.name indica que a conta de serviço high-privilege-service-account@my-project.iam.gserviceaccount.com enviou a solicitação original:

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

A seguir