查看服务帐号和密钥的近期使用情况

本页面介绍如何使用活动分析器查看上次使用服务帐号和密钥调用 Google API 的时间。这些使用被称为身份验证活动

身份验证活动包括每次使用服务帐号或密钥调用任何 Google API(包括不属于 Google Cloud 的 API)时的情况。身份验证活动既包括成功的 API 调用,也包括失败的 API 调用。例如,如果由于调用者无权调用相应 API 或者由于请求引用了不存在的资源而导致 API 调用失败,则该操作仍会计为用于该 API 调用的服务帐号或密钥的身份验证活动。

服务帐号密钥的身份验证活动还包括每次系统尝试对请求进行身份验证时列出密钥时的情况,即使系统不使用密钥对请求进行身份验证也是如此。当使用 Cloud Storage 签名网址或向第三方应用进行身份验证时,此行为最常见。

活动分析器会报告近期身份验证活动的日期。日期是根据美国和加拿大太平洋时间 (UTC-8) 确定的,即使太平洋夏令时生效也是如此。如果您需要活动的具体时间,或者想要跟踪一段时间内的使用模式,请使用 Monitoring 查看所有服务帐号和密钥的使用情况指标

近期身份验证活动可帮助您识别不再使用的服务帐号和服务帐号密钥。我们建议您停用或删除这些未使用的服务帐号和密钥,因为它们会带来不必要的安全风险。

准备工作

启用 Policy Analyzer API。

启用 API

所需权限

要列出服务帐号和服务帐号密钥的最新身份验证活动,您需要一个具有以下权限的角色:

  • policyanalyzer.serviceAccountLastAuthenticationActivities.query
  • policyanalyzer.serviceAccountKeyLastAuthenticationActivities.query

如需获得这些权限,同时遵循最小权限原则,请让管理员向您授予 Event Analysis Viewer 角色 (roles/policyanalyzer.activityAnalysisViewer)。

或者,管理员也可以向您授予具有所需权限的其他角色,例如自定义角色或更宽松的预定义角色

查看所有服务帐号或密钥的近期使用情况

如需查看服务帐号或服务帐号密钥的近期使用情况,请使用活动分析器列出最新身份验证活动的日期。

gcloud

如需列出您的服务帐号或密钥的最新身份验证活动,请使用 gcloud policy-intelligence query-activity 命令:

gcloud policy-intelligence query-activity --activity-type=ACTIVITY_TYPE \
    --project=PROJECT_ID --limit=LIMIT

替换以下值:

  • ACTIVITY_TYPE:要列出的活动类型。如需列出您的服务帐号的最近使用时间,请使用 serviceAccountLastAuthentication。要列出服务帐号密钥的最近使用时间,请使用 serviceAccountKeyLastAuthentication
  • PROJECT_ID:您的 Google Cloud 项目 ID。 项目 ID 是字母数字字符串,例如 my-project
  • LIMIT:可选。要返回的结果数的上限。默认值为 1000

响应如下所示,其中列出了项目的服务帐号的近期使用时间:

---
activity:
  lastAuthenticatedTime: '2021-04-27T07:00:00Z'
  serviceAccount:
    fullResourceName: //iam.googleapis.com/projects/my-project/serviceAccounts/service-account-1@my-project.iam.gserviceaccount.com
    projectNumber: '123456789012'
    serviceAccountId: '123456789012345678901'
activityType: serviceAccountLastAuthentication
fullResourceName: //iam.googleapis.com/projects/my-project/serviceAccounts/service-account-1@my-project.iam.gserviceaccount.com
observationPeriod:
  endTime: '2021-07-06T07:00:00Z'
  startTime: '2020-03-12T07:00:00Z'
---
activity:
  lastAuthenticatedTime: '2021-02-09T08:00:00Z'
  serviceAccount:
    fullResourceName: //iam.googleapis.com/projects/my-project/serviceAccounts/service-account-2@my-project.iam.gserviceaccount.com
    projectNumber: '123456789012'
    serviceAccountId: '234567890123456789012'
activityType: serviceAccountLastAuthentication
fullResourceName: //iam.googleapis.com/projects/my-project/serviceAccounts/service-account-2@my-project.iam.gserviceaccount.com
observationPeriod:
  endTime: '2021-07-06T07:00:00Z'
  startTime: '2020-09-01T07:00:00Z'

如需了解如何理解这些结果,请参阅本页面上的了解活动

REST

Policy Analyzer API 的 activities.query 方法可列出服务帐号或密钥的最新身份验证活动。

在使用任何请求数据之前,请先进行以下替换:

  • PROJECT_ID:您的 Google Cloud 项目 ID。 项目 ID 是字母数字字符串,例如 my-project
  • ACTIVITY_TYPE:要列出的活动类型。如需列出所有服务帐号的最新使用情况,请使用 serviceAccountLastAuthentication。如需列出所有服务帐号密钥的最新使用情况,请使用 serviceAccountKeyLastAuthentication
  • PAGE_SIZE:可选。要从此请求返回的最大结果数。如果未指定,则服务器将决定要返回的结果数。如果活动数大于页面大小,则响应会包含用于检索下一页结果的分页令牌。
  • PAGE_TOKEN:可选。此方法之前的响应中返回的分页令牌。如果已指定,则活动列表将从上一个请求结束的位置开始。

HTTP 方法和网址:

GET https://policyanalyzer.googleapis.com/v1/projects/PROJECT_ID/locations/global/activityTypes/ACTIVITY_TYPE/activities:query?pageSize=PAGE_SIZE&pageToken=PAGE_TOKEN

如需发送您的请求,请展开以下选项之一:

响应如下所示,其中列出了项目的服务帐号的近期使用时间:

{
  "activities": [
    {
      "fullResourceName": "//iam.googleapis.com/projects/my-project/serviceAccounts/service-account-1@my-project.iam.gserviceaccount.com",
      "activityType": "serviceAccountLastAuthentication",
      "observationPeriod": {
        "startTime": "2020-04-20T07:00:00Z",
        "endTime": "2021-05-17T07:00:00Z"
      },
      "activity": {
        "lastAuthenticatedTime": "2021-04-28T07:00:00Z",
        "serviceAccount": {
          "projectNumber": "123456789012",
          "fullResourceName": "//iam.googleapis.com/projects/my-project/serviceAccounts/service-account-1@my-project.iam.gserviceaccount.com",
          "serviceAccountId": "123456789012345678901"
        }
      }
    },
    {
      "fullResourceName": "//iam.googleapis.com/projects/my-project/serviceAccounts/service-account-2@my-project.iam.gserviceaccount.com",
      "activityType": "serviceAccountLastAuthentication",
      "observationPeriod": {
        "startTime": "2020-04-20T07:00:00Z",
        "endTime": "2021-05-17T07:00:00Z"
      },
      "activity": {
        "lastAuthenticatedTime": "2021-04-29T07:00:00Z",
        "serviceAccount": {
          "projectNumber": "123456789012",
          "fullResourceName": "//iam.googleapis.com/projects/my-project/serviceAccounts/service-account-2@my-project.iam.gserviceaccount.com",
          "serviceAccountId": "234567890123456789012"
        }
      }
    }
  ],
  "nextPageToken": "AVgRrQV4b5nISN6cGJvTPFJ2v_"
}

如需了解如何理解这些结果,请参阅本页面上的了解活动

查看特定服务帐号的近期使用情况

如需查找特定服务帐号的最后使用日期,请使用服务帐号的完整资源名称过滤活动分析器结果。

gcloud

要获取特定服务帐号的最新身份验证活动,请使用带有过滤条件的 gcloud policy-intelligence query-activity 命令:

gcloud policy-intelligence query-activity --activity-type=serviceAccountLastAuthentication \
    --project=PROJECT_ID \
    --query-filter='FILTER'

替换以下值:

  • PROJECT_ID:您的 Google Cloud 项目 ID。 项目 ID 是字母数字字符串,例如 my-project
  • FILTER:一个过滤条件,用于指定要查看其使用情况的服务帐号的完整资源名称。服务帐号的完整资源名称包括项目 ID 以及服务帐号的电子邮件地址。

    要过滤单个服务帐号,请使用以下格式的过滤条件:

    activities.full_resource_name="//iam.googleapis.com/projects/PROJECT_ID/serviceAccounts/SERVICE_ACCOUNT_EMAIL"
    

    要过滤多个服务帐号,请使用 OR 指定多个可接受的完整资源名称:

    activities.full_resource_name="//iam.googleapis.com/projects/PROJECT_ID/serviceAccounts/SERVICE_ACCOUNT_1_EMAIL" OR activities.full_resource_name="//iam.googleapis.com/projects/PROJECT_ID/serviceAccounts/SERVICE_ACCOUNT_2_EMAIL"
    

    您最多可以过滤 10 个服务帐号。

响应说明了服务帐号的最近使用情况:

---
activity:
  lastAuthenticatedTime: '2021-04-27T07:00:00Z'
  serviceAccount:
    fullResourceName: //iam.googleapis.com/projects/my-project/serviceAccounts/service-account-1@my-project.iam.gserviceaccount.com
    projectNumber: '123456789012'
    serviceAccountId: '123456789012345678901'
activityType: serviceAccountLastAuthentication
fullResourceName: //iam.googleapis.com/projects/my-project/serviceAccounts/service-account-1@my-project.iam.gserviceaccount.com
observationPeriod:
  endTime: '2021-07-06T07:00:00Z'
  startTime: '2020-03-12T07:00:00Z'

如需了解如何理解这些结果,请参阅本页面上的了解活动

REST

Policy Analyzer API 的 activities.query 方法在与过滤条件一起使用时,可以获得特定服务帐号的最新身份验证活动。

在使用任何请求数据之前,请先进行以下替换:

  • PROJECT_ID:您的 Google Cloud 项目 ID。 项目 ID 是字母数字字符串,例如 my-project
  • FILTER:一个过滤条件,用于指定要查看其使用情况的服务帐号的完整资源名称。

    要过滤单个服务帐号,请使用以下格式的过滤条件:

    activities.full_resource_name%3D%22%2F%2Fiam.googleapis.com%2Fprojects%2FPROJECT_ID%2FserviceAccounts%2FSERVICE_ACCOUNT_EMAIL%22

    要过滤多个服务帐号,请使用 %20OR%20 指定多个可接受的完整资源名称:

    activities.full_resource_name%3D%22%2F%2Fiam.googleapis.com%2Fprojects%2FPROJECT_ID%2FserviceAccounts%2FSERVICE_ACCOUNT_1_EMAIL%22%20OR%20activities.full_resource_name%3D%22%2F%2Fiam.googleapis.com%2Fprojects%2FPROJECT_ID%2FserviceAccounts%2FSERVICE_ACCOUNT_2_EMAIL%22

HTTP 方法和网址:

GET https://policyanalyzer.googleapis.com/v1/projects/PROJECT_ID/locations/global/activityTypes/serviceAccountLastAuthentication/activities:query?filter=FILTER

如需发送您的请求,请展开以下选项之一:

响应说明了服务帐号的最近使用情况:

{
  "activities": [
    {
      "fullResourceName": "//iam.googleapis.com/projects/my-project/serviceAccounts/service-account-1@my-project.iam.gserviceaccount.com",
      "activityType": "serviceAccountLastAuthentication",
      "observationPeriod": {
        "startTime": "2020-04-20T07:00:00Z",
        "endTime": "2021-05-17T07:00:00Z"
      },
      "activity": {
        "lastAuthenticatedTime": "2021-04-28T07:00:00Z",
        "serviceAccount": {
          "projectNumber": "123456789012",
          "fullResourceName": "//iam.googleapis.com/projects/my-project/serviceAccounts/service-account-1@my-project.iam.gserviceaccount.com",
          "serviceAccountId": "123456789012345678901"
        }
      }
    }
  ]
}

查看特定服务帐号密钥的近期使用情况

如需查找上次使用特定服务帐号密钥的日期,请查找服务帐号密钥的唯一 ID,然后使用这些 ID 过滤活动分析器结果。

如果您有 JSON 密钥文件,则可以在该文件的 private_key_id 字段中找到服务帐号密钥的唯一 ID。

如果您没有 JSON 密钥文件,则可以按照以下步骤找到服务帐号密钥的唯一 ID:

控制台

  1. 在 Cloud Console 中,转到服务帐号页面。

    转到“服务帐号”页面

  2. 选择包含与您的密钥关联的服务帐号的项目。

  3. 点击与您的密钥关联的服务帐号的电子邮件地址。

  4. 点击密钥标签页。

  5. 从密钥 ID 列表中查找并复制您的密钥 ID。

gcloud

  1. 运行 gcloud iam service-accounts keys list 命令,注意将 SERVICE_ACCOUNT_EMAIL 替换为与密钥关联的服务帐号的电子邮件地址:

    gcloud iam service-accounts keys list --iam-account=SERVICE_ACCOUNT_EMAIL
    

    输出会显示用户创建的与服务帐号关联的所有密钥的列表,包括每个密钥的唯一 ID、创建时间和到期时间。

  2. 使用输出中的数据来识别您要跟踪的密钥并复制其唯一 ID。

REST

  1. 列出服务帐号密钥:

    Policy Analyzer API 的 projects.serviceAccounts.keys.list 方法可列出服务帐号的所有服务帐号密钥。

    在使用任何请求数据之前,请先进行以下替换:

    • PROJECT_ID:您的 Google Cloud 项目 ID。 项目 ID 是字母数字字符串,例如 my-project
    • SA_NAME:您要列出其密钥的服务帐号的名称。
    • KEY_TYPES:可选。您想要在响应中包含的密钥类型的英文逗号分隔列表。密钥类型会指出密钥是由用户管理 (USER_MANAGED) 还是由系统管理 (SYSTEM_MANAGED)。如果留空,则返回所有密钥。

    HTTP 方法和网址:

    GET https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/SA_NAME@PROJECT_ID.iam.gserviceaccount.com/keys?keyTypes=KEY_TYPES

    如需发送您的请求,请展开以下选项之一:

    您应该收到类似以下内容的 JSON 响应:

    {
      "keys": [
        {
          "name": "projects/my-project/serviceAccounts/my-service-account@my-project.iam.gserviceaccount.com/keys/90c48f61c65cd56224a12ab18e6ee9ca9c3aee7c",
          "validAfterTime": "2020-03-04T17:39:47Z",
          "validBeforeTime": "9999-12-31T23:59:59Z",
          "keyAlgorithm": "KEY_ALG_RSA_2048",
          "keyOrigin": "GOOGLE_PROVIDED",
          "keyType": "USER_MANAGED"
        },
        {
          "name": "projects/my-project/serviceAccounts/my-service-account@my-project.iam.gserviceaccount.com/keys/e5e3800831ac1adc8a5849da7d827b4724b1fce8",
          "validAfterTime": "2020-03-31T23:50:09Z",
          "validBeforeTime": "9999-12-31T23:59:59Z",
          "keyAlgorithm": "KEY_ALG_RSA_2048",
          "keyOrigin": "GOOGLE_PROVIDED",
          "keyType": "USER_MANAGED"
        },
        {
          "name": "projects/my-project/serviceAccounts/my-service-account@my-project.iam.gserviceaccount.com/keys/b97699f042b8eee6a846f4f96259fbcd13e2682e",
          "validAfterTime": "2020-05-17T18:58:13Z",
          "validBeforeTime": "9999-12-31T23:59:59Z",
          "keyAlgorithm": "KEY_ALG_RSA_2048",
          "keyOrigin": "GOOGLE_PROVIDED",
          "keyType": "USER_MANAGED"
        }
      ]
    }
    

  2. 使用响应中的元数据来识别您要跟踪的密钥。然后,从 name 字段的末尾复制密钥的唯一 ID。

    name 字段采用以下格式:

    "name": "projects/PROJECT_ID/serviceAccounts/SERVICE_ACCOUNT_EMAIL/keys/KEY_ID"
    

    密钥的唯一 ID 是 keys/ 之后的所有内容。

    例如,以下密钥名称中的唯一 ID 为 0f561cc41650ff521899de2fd653bd3de08e2da4

    "name": "projects/my-project/serviceAccounts/my-account@my-project.iam.gserviceaccount.com/keys/0f561cc41650ff521899de2fd653bd3de08e2da4"
    

找到服务帐号密钥的唯一 ID 后,使用这些 ID 过滤来自活动分析器的结果:

gcloud

要获取特定服务帐号密钥的最新身份验证活动,请使用带有过滤条件的 gcloud policy-intelligence query-activity 命令:

gcloud policy-intelligence query-activity --activity-type=serviceAccountKeyLastAuthentication \
    --project=PROJECT_ID \
    --query-filter='FILTER'

替换以下值:

  • PROJECT_ID:您的 Google Cloud 项目 ID。 项目 ID 是字母数字字符串,例如 my-project
  • FILTER:一个过滤条件,用于指定要查看其使用情况的服务帐号密钥的完整资源名称。服务帐号密钥的完整资源名称包括项目 ID、与密钥关联的服务帐号的电子邮件地址以及密钥 ID。

    要过滤单个服务帐号密钥,请使用以下格式的过滤条件:

    activities.full_resource_name="//iam.googleapis.com/projects/PROJECT_ID/serviceAccounts/SERVICE_ACCOUNT_EMAIL/keys/KEY_ID"
    

    要过滤多个服务帐号密钥,请使用 OR 指定多个可接受的完整资源名称:

    activities.full_resource_name="//iam.googleapis.com/projects/PROJECT_ID/serviceAccounts/SERVICE_ACCOUNT_1_EMAIL/keys/KEY_ID_1" OR activities.full_resource_name="//iam.googleapis.com/projects/PROJECT_ID/serviceAccounts/SERVICE_ACCOUNT_2_EMAIL/keys/KEY_ID_2"
    

    您最多可以过滤 10 个服务帐号密钥。

响应说明了服务帐号密钥的最近使用情况:

---
activity:
  lastAuthenticatedTime: '2021-06-11T07:00:00Z'
  serviceAccountKey:
    fullResourceName: //iam.googleapis.com/projects/my-project/serviceAccounts/service-account-1@my-project.iam.gserviceaccount.com/keys/1c65fca351d6925e629059743428b7af243a728c
    projectNumber: '232342569935'
    serviceAccountId: '103185812403937829397'
activityType: serviceAccountKeyLastAuthentication
fullResourceName: //iam.googleapis.com/projects/my-project/serviceAccounts/service-account-1@my-project.iam.gserviceaccount.com/keys/1c65fca351d6925e629059743428b7af243a728c
observationPeriod:
  endTime: '2021-07-06T07:00:00Z'
  startTime: '2020-09-10T07:00:00Z'

如需了解如何理解这些结果,请参阅本页面上的了解活动

REST

Policy Analyzer API 的 activities.query 方法在与过滤器搭配使用时,可以获得特定服务帐号密钥的最新身份验证活动。

在使用任何请求数据之前,请先进行以下替换:

  • PROJECT_ID:您的 Google Cloud 项目 ID。 项目 ID 是字母数字字符串,例如 my-project
  • FILTER:一个过滤条件,用于指定要查看其使用情况的服务帐号密钥的完整资源名称。服务帐号密钥的完整资源名称包括项目 ID、与密钥关联的服务帐号的电子邮件地址以及密钥 ID。

    要过滤单个服务帐号密钥,请使用以下格式的过滤条件:

    activities.full_resource_name%3D%22%2F%2Fiam.googleapis.com%2Fprojects%2FPROJECT_ID%2FserviceAccounts%2FSERVICE_ACCOUNT_EMAIL%2Fkeys%2FKEY_ID%22

    要过滤多个服务帐号密钥,请使用 %20OR%20 指定多个可接受的完整资源名称:

    activities.full_resource_name%3D%22%2F%2Fiam.googleapis.com%2Fprojects%2FPROJECT_ID%2FserviceAccounts%2FSERVICE_ACCOUNT_1_EMAIL%2Fkeys%2FKEY_ID_1%22%20OR%20activities.full_resource_name%3D%22%2F%2Fiam.googleapis.com%2Fprojects%2FPROJECT_ID%2FserviceAccounts%2FSERVICE_ACCOUNT_2_EMAIL%2Fkeys%2FKEY_ID_2%22

    您最多可以过滤 10 个服务帐号密钥。

HTTP 方法和网址:

GET https://policyanalyzer.googleapis.com/v1/projects/PROJECT_ID/locations/global/activityTypes/serviceAccountKeyLastAuthentication/activities:query?filter=FILTER

如需发送您的请求,请展开以下选项之一:

响应说明了服务帐号密钥的最近使用情况:

{
  "activities": [
    {
      "activity": {
        "lastAuthenticatedTime": "2021-06-11T07:00:00Z",
        "serviceAccountKey": {
          "fullResourceName": "//iam.googleapis.com/projects/my-project/serviceAccounts/service-account-1@my-project.iam.gserviceaccount.com/keys/1c65fca351d6925e629059743428b7af243a728c",
          "projectNumber": "123456789012",
          "serviceAccountId": "123456789012345678901"
        }
      },
      "activityType": "serviceAccountKeyLastAuthentication",
      "fullResourceName": "//iam.googleapis.com/projects/my-project/serviceAccounts/service-account-1t@my-project.iam.gserviceaccount.com/keys/1c65fca351d6925e629059743428b7af243a728c",
      "observationPeriod": {
        "endTime": "2021-07-06T07:00:00Z",
        "startTime": "2020-04-20T07:00:00Z"
      }
    }
  ]
}

如需了解如何理解这些结果,请参阅本页面上的了解活动

了解活动

活动分析器会将结果作为活动列表进行报告。活动具有以下字段:

  • fullResourceName:要报告其活动的服务帐号或服务帐号密钥的完整资源名称。以下部分和完整资源名称中介绍了此格式。
  • activityType:要报告的活动的类型。对于近期服务帐号身份验证活动,值为 serviceAccountLastAuthentication。对于近期服务帐号密钥身份验证活动,值为 serviceAccountKeyLastAuthentication
  • observationPeriod:开始时间和结束时间,表示在服务帐号或密钥中观察到活动的时间范围。这些时间戳中的时间始终为 T07:00:00Z
  • activity:活动的详情。此字段的内容因活动类型而异。有关详情,请参阅以下部分。

服务帐号活动的详细信息

serviceAccountLastAuthentication 活动的 activity 字段包含以下字段:

  • serviceAccount:正在报告其活动的服务帐号的详细信息,包括:

    • fullResourceName:服务帐号的完整资源名称,格式为 //iam.googleapis.com/projects/PROJECT_ID/serviceAccounts/SERVICE_ACCOUNT_EMAIL
    • projectNumber:拥有服务帐号的项目的数字 ID。
    • serviceAccountId:服务帐号的数字 ID。
  • lastAuthenticatedTime:一个时间戳,表示身份验证事件上次发生的日期。此时间戳中的时间始终为 T07:00:00Z,与身份验证事件的确切时间无关。

    从未使用过的服务帐号不包含此字段。

服务帐号密钥活动详情

serviceAccountKeyLastAuthentication 活动的 activity 字段包含以下字段:

  • serviceAccountKey:正在报告其活动的服务帐号密钥的详细信息,包括:

    • fullResourceName:服务帐号密钥的完整资源名称,格式为 //iam.googleapis.com/projects/PROJECT_ID/serviceAccounts/SERVICE_ACCOUNT_EMAIL/keys/KEY_ID
    • projectNumber:拥有与密钥关联的服务帐号的项目的数字 ID。
    • serviceAccountId:与密钥关联的服务帐号的数字 ID。
  • lastAuthenticatedTime:一个时间戳,表示身份验证事件上次发生的日期。此时间戳中的时间始终为 T07:00:00Z,与身份验证事件的确切时间无关。

    从未使用过的服务帐号密钥不包括此字段。

后续步骤