服务账号示例日志

此页面展示了管理或使用服务账号时生成的审核日志示例。

如需详细了解如何启用和查看审核日志,请参阅 IAM 审核日志记录

创建服务账号时生成的日志

当您创建或修改服务账号时,Identity and Access Management (IAM) 会生成日志条目。以下示例展示了创建服务账号时生成的日志条目:

{
  "protoPayload": {
    "@type": "type.googleapis.com/google.cloud.audit.AuditLog",
    "authenticationInfo": {
      "principalEmail": "example-user@example.com"
    },
    "methodName": "google.iam.admin.v1.CreateServiceAccount",
    "response": {
      "email": "my-service-account@my-project.iam.gserviceaccount.com",
      "@type": "type.googleapis.com/google.iam.admin.v1.ServiceAccount",
      "display_name": "My service account."
    }
  },
  "resource": {
    "type": "service_account"
  }
}

授予角色时生成的日志

本部分展示您在授予与服务账号相关的角色时收到的日志条目。

授予 Service Account User 角色时生成的日志

主账号可以通过模拟服务账号,获得与服务账号相同的权限。如要允许主账号模拟某个服务账号,您可以向该服务账号的主账号 [授予服务账号用户角色]sa-user-role

以下示例展示了向主账号授予 Service Account User 角色的日志条目:

{
  "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:my-user@example.com"
          ],
          "role": "roles/iam.serviceAccountUser"
        }
      ]
    }
  },
  "resource": {
    "type": "service_account"
  }
}

当您 [授予 Service Account Token Creator 角色]sa-token-creator-role 时,主账号可创建短期有效的凭据,Cloud IAM 会生成类似的日志条目。

为服务账号授予资源的访问权限时生成的日志

您可以为服务账号授予特定资源的角色,从而允许服务账号访问该资源。如果拥有资源的服务也支持审核日志记录,则为服务账号授予角色会生成审核日志条目。日志条目包含字段 protoPayload.authenticationInfo.principalEmail,该字段用来标识为服务账号授予角色的主账号。

以下示例展示了为项目的服务账号授予角色的审核日志条目。在此示例中,example-user@example.com 将 Organization Viewer 角色 (roles/resourcemanager.organizationViewer) 授予了服务账号。protoPayload.serviceName 字段设置为 cloudresourcemanager.googleapis.com,因为 Resource Manager 是管理项目的 Google Cloud 服务。此外,resource.type 字段设置为 project

{
  "logName": "projects/my-project/logs/cloudaudit.googleapis.com%2Factivity",
  "protoPayload": {
    "@type": "type.googleapis.com/google.cloud.audit.AuditLog",
    "authenticationInfo": {
      "principalEmail": "example-user@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"
  }
}

将服务账号附加到资源时生成的日志

如果用户的服务账号拥有 Service Account User 角色 (roles/iam.serviceAccountUser),则用户可以将服务账号附加到资源。当资源上运行的代码访问 Google Cloud 服务和资源时,它会使用关联到资源的服务账号作为其身份。例如,如果您将服务账号关联到某个 Compute Engine 实例,并且该实例上的应用使用客户端库来调用 Google Cloud API,则这些应用会自动使用关联的服务账号来进行身份验证和授权。

本部分展示了将服务账号关联到资源时生成的一些日志。

使用 iam.serviceAccounts.actAs 权限的日志

将服务账号关联到资源需要具有 iam.serviceAccounts.actAs 权限。当主账号使用此权限将服务账号关联到资源时,系统会生成审核日志。

以下示例展示了主账号使用 iam.serviceAccounts.actAs 权限将服务账号关联到 Compute Engine 实例的日志条目。

{
  "protoPayload": {
    "@type": "type.googleapis.com/google.cloud.audit.AuditLog",
    "authenticationInfo": {
      "principalEmail": "example-user@example.com"
    },
    "serviceName": "iam.googleapis.com",
    "methodName": "iam.serviceAccounts.actAs",
    "authorizationInfo": [
      {
        "resource": "projects/-/serviceAccounts/sample-service-account@sample-project.iam.gserviceaccount.com",
        "permission": "iam.serviceAccounts.actAs",
        "granted": true,
        "permissionType": "ADMIN_WRITE"
      }
    ],
    "resourceName": "projects/-/serviceAccounts/sample-service-account@sample-project.iam.gserviceaccount.com",
    "request": {
      "name": "sample-service-account@sample-project.iam.gserviceaccount.com",
      "project_number": "787155667719",
      "@type": "type.googleapis.com/CanActAsServiceAccountRequest"
    },
    "response": {
      "success": true,
      "@type": "type.googleapis.com/CanActAsServiceAccountResponse"
    }
  },
  "insertId": "vojt0vd4fdy",
  "resource": {
    "type": "audited_resource",
    "labels": {
      "project_id": "sample-project",
      "method": "iam.serviceAccounts.actAs",
      "service": "iam.googleapis.com"
    }
  },
  "timestamp": "2024-08-05T21:56:56.097601933Z",
  "severity": "NOTICE",
  "logName": "projects/sample-project/logs/cloudaudit.googleapis.com%2Factivity",
  "receiveTimestamp": "2024-08-05T21:56:56.097601933Z"
}

设置 Compute Engine 实例以服务账号身份运行时生成的日志

如果用户的服务账号拥有 Service Account User 角色 (roles/iam.serviceAccountUser),则用户可以创建以服务账号的身份运行的 Compute Engine 虚拟机 (VM) 实例。在这种情况下,用户使用自己的凭据创建虚拟机实例,并且该请求会指定虚拟机实例要使用的服务账号。

当用户创建虚拟机实例时,Compute Engine 会创建多个日志条目。以下示例展示了第一个日志条目,它标识了创建虚拟机实例的用户和实例使用的服务账号。在此示例中,用户 example-user@example.com 创建了一个使用服务账号 my-service-account@my-project.iam.gserviceaccount.com 的实例。结果是,protoPayload.authenticationInfo.principalEmail 字段设置为 example-user@example.comprotoPayload.request.serviceAccounts[0].email 字段设置为 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": "example-user@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"
  },
  "resource": {
    "type": "gce_instance"
  }
}

使用服务账号密钥访问 Google Cloud 时生成的日志

本部分展示您在创建服务账号密钥并使用该密钥访问 Google Cloud 时收到的日志条目。

创建服务账号密钥时生成的日志

如果您的服务账号拥有 Service Account Key Admin 角色 (roles/iam.serviceAccountKeyAdmin),则可以创建服务账号密钥,然后使用该密钥对发送到 Google Cloud 服务的请求进行身份验证

以下示例展示了用于创建服务账号密钥的一个日志条目。在此示例中,用户 example-user@example.com 为服务账号 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": "example-user@example.com",
    },
    "methodName": "google.iam.admin.v1.CreateServiceAccountKey",
    "request": {
      "@type": "type.googleapis.com/google.iam.admin.v1.CreateServiceAccountKeyRequest",
      "name": "projects/-/serviceAccounts/my-service-account@my-project.iam.gserviceaccount.com"
    },
    "resourceName": "projects/-/serviceAccounts/123456789012345678901"
  },
  "resource": {
    "type": "service_account"
  }
}

使用服务账号密钥进行身份验证时生成的日志

创建服务账号密钥后,您可以使用该密钥为服务账号请求 OAuth 2.0 访问令牌,然后使用访问令牌对发送到 Google Cloud 服务的请求进行身份验证。一般来说,这些服务的审核日志包含以下信息:

  • protoPayload.authenticationInfo.principalEmail:访问令牌所代表的服务账号的电子邮件地址。
  • protoPayload.authenticationInfo.serviceAccountKeyName:用于请求 OAuth 2.0 访问令牌的服务账号密钥。此字段通过其完整资源名称(采用 //iam.googleapis.com/projects/project-id/serviceAccounts/service-account-email/keys/key-id 格式)标识服务账号密钥。

以下示例展示了创建 Memorystore for Redis 实例的请求的审核日志条目。该请求通过服务账号的 OAuth 2.0 访问令牌进行了身份验证。在此示例中,服务账号名为 my-service-account@my-project.iam.gserviceaccount.com,服务账号密钥 ID 为 c71e040fb4b71d798ce4baca14e15ab62115aaef

{
  "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",
      "serviceAccountKeyName": "//iam.googleapis.com/projects/my-project/serviceAccounts/my-service-account@my-project.iam.gserviceaccount.com/keys/c71e040fb4b71d798ce4baca14e15ab62115aaef"
    },
    "methodName": "google.cloud.redis.v1.CloudRedis.CreateInstance",
    "request": {
      "@type": "type.googleapis.com/google.cloud.redis.v1.CreateInstanceRequest"
    }
  }
}

模拟服务账号以访问 Google Cloud 时生成的日志

本部分展示了在您在为服务账号创建短期有效的凭据,随后使用这些凭据来模拟服务账号并访问 Google Cloud 时收到的日志条目。

创建短期有效的凭据时生成的日志

如果您拥有服务账号的 Service Account Token Creator 角色 (roles/iam.serviceAccountTokenCreator),则可以为服务账号创建短期有效凭据,然后使用这些凭据模拟服务账号。例如,您可以创建短期有效凭据,以便从未在 Google Cloud 上运行的应用调用 Google Cloud API。

在主账号创建短期有效凭据时,IAM 可生成审核日志。如需接收这些审核日志,您必须为数据访问活动启用 IAM 审核日志

为数据访问活动启用 IAM 审核日志后,主账号每次创建短期有效凭据时,IAM 都会生成审核日志条目。该条目包含以下字段:

  • protoPayload.authenticationInfo.principalEmail:创建短期有效凭据的主账号。
  • resource.labels.email_id:为其生成短期有效凭据的服务账号。

以下示例展示了生成短期有效 OAuth 2.0 访问令牌的请求对应的审核日志条目。在此示例中,用户 example-user@example.com 为服务账号 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": "example-user@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"
  }
}

使用短期有效的凭据进行身份验证时生成的日志

为服务账号创建短期有效凭据后,您就可以在调用 Google Cloud API 时使用这些凭据来模拟服务账号。

您调用的某些方法可能会生成审核日志。通常,这些日志条目会显示以下身份:

  • 短期有效凭据所要模拟的服务账号
  • 创建短期有效凭据的身份

例如,假设用户 example-user@example.com 为服务账号 my-service-account@my-project.iam.gserviceaccount.com 创建了短期有效凭据。随后,该用户创建了新的 Pub/Sub 主题,并使用短期有效凭据来模拟服务账号。Pub/Sub 生成了一个日志条目用于标识服务账号以及模拟该服务账号的用户:

{
  "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": "example-user@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"
  },
  "resource": {
    "type": "pubsub_topic"
  }
}

服务代理执行操作的日志

有时,当主账号发起操作时,服务代理会代表主账号执行操作。但是,在查看服务代理的审核日志时,您可能很难判断服务代理代表谁执行了操作,以及原因。

为了帮助您了解服务代理操作的上下文,某些服务代理会在其审核日志中添加其他详细信息,例如操作所关联的作业以及创建作业的主账号。

以下服务代理在其审核日志中包含这些额外详细信息:

这些其他详细信息位于审核日志的 serviceDelegationHistory 字段中,该字段嵌套在 authenticationInfo 字段中。此字段包含以下信息:

  • 创建作业的原始主账号
  • 执行操作的服务代理
  • 服务代理所属的服务
  • 作业 ID

例如,假设 example-user@example.com 使用 BigQuery Connection API 创建作业。此作业需要 BigQuery Connection API 的某个服务代理来执行操作。在这种情况下,服务代理操作的审核日志将包含类似于以下内容的 serviceDelegationHistory 字段:

{
  "protoPayload": {
    "@type": "type.googleapis.com/google.cloud.audit.AuditLog",
    "authenticationInfo": {
      "principalEmail": "bqcx-442188550395-jujw@gcp-sa-bigquery-condel.iam.gserviceaccount.com",
      "serviceDelegationHistory": {
        "originalPrincipal": "user:my-user@example.com",
        "serviceMetadata": [
          {
            "principalSubject": "serviceAccount:bqcx-442188550395-jujw@gcp-sa-bigquery-condel.iam.gserviceaccount.com",
            "serviceDomain": "bigquery.googleapis.com",
          }
        ]
      }
    }
  }
}

后续步骤