服务帐号的审核日志

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

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

授予角色

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

授予 Service Account User 角色

成员可以通过模拟服务帐号,获得与服务帐号相同的权限。要允许成员模拟某个服务帐号,您可以向该服务帐号的成员授予 Service Account User 角色 (roles/iam.serviceAccountUser)。

以下示例展示了向成员授予 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:srini@example.com"
          ],
          "role": "roles/iam.serviceAccountUser"
        }
      ]
    }
  },
  "resource": {
    "type": "service_account"
  }
}

当您授予 Service Account Token Creator 角色 (roles/iam.serviceAccountTokenCreator) 时,成员可创建短期有效的凭据,IAM 会生成类似的日志条目。

为服务帐号授予资源的访问权限

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

以下示例展示了为项目的服务帐号授予角色的审核日志条目。在此示例中,julia@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": "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"
  }
}

将 Compute Engine 实例设置为以服务帐号的身份运行

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

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

使用服务帐号密钥访问 Google Cloud

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

创建服务帐号密钥

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

以下示例展示了用于创建服务帐号密钥的一个日志条目。在此示例中,用户 sam@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": "sam@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 访问令牌的请求对应的审核日志条目。在此示例中,用户 amara@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": "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"
  }
}

使用短期有效凭据进行身份验证

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

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

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

例如,假设用户 yoon@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": "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"
  },
  "resource": {
    "type": "pubsub_topic"
  }
}

后续步骤