

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 确定 KMS 密钥的过去使用情况
<a name="monitoring-keys-determining-usage"></a>

出于监控和审计目的，您可能想知道过去如何使用 KMS 密钥。例如，在禁用或安排删除 KMS 密钥之前，您可能需要确定该密钥是否仍在使用中，或者确定账户中未使用的密钥。以下策略可以帮助您确定 KMS 密钥的过去使用情况。

**警告**  
这些用于确定过去使用情况的策略仅对 AWS 负责人和 AWS KMS 操作人员有效。他们无法检测到不涉及 API 调用的密钥的使用情况 AWS KMS。从对称 KMS 密钥生成数据密钥后，其后续用于本地加密或外部解密的 AWS KMS 使用不会反映在上次使用信息中。同样，这些策略无法检测到外部使用非对称 KMS 密钥的公钥的情况。 AWS KMS有关删除用于公有密钥加密的非对称 KMS 密钥的特殊风险的详细信息，包括创建无法解密的密文，请参阅 [Deleting asymmetric KMS keys](deleting-keys.md#deleting-asymmetric-cmks)。

**Topics**
+ [检查 KMS 密钥权限以确定潜在使用范围](#monitoring-keys-usage-key-permissions)
+ [检查上次使用 KMS 密钥执行的加密操作](#examine-last-usage)
+ [检查 AWS CloudTrail 日志以检查过去的使用情况](#deleting-keys-usage-cloudtrail)

## 检查 KMS 密钥权限以确定潜在使用范围
<a name="monitoring-keys-usage-key-permissions"></a>

确定谁或什么人当前有权访问 KMS 密钥可以帮助您确定 KMS 密钥的使用范围以及是否仍然需要该密钥。要确定当前谁或什么人有权访问 KMS 密钥，请参阅[确定访问权限 AWS KMS keys](determining-access.md)。

## 检查上次使用 KMS 密钥执行的加密操作
<a name="examine-last-usage"></a>

AWS KMS 提供有关上次成功使用每个 KMS 密钥执行的加密操作的使用信息以及关联 CloudTrail 的事件 ID。这可以简化识别未使用的 KMS 密钥的过程。您还可以在[密钥策略中使用 kms: TrailingDaysWithoutKeyUsage](conditions-kms.md#conditions-kms-trailing-days-without-key-usage) 条件密钥来防止最近使用的密钥被意外禁用或计划删除。

您可以使用 AWS 管理控制台、 AWS CLI或 AWS KMS API 查看上次使用 KMS 密钥成功执行的加密操作。

**注意**  
某些 AWS 服务创建的资源依赖于 KMS 密钥进行数据保护，但不会经常对该密钥调用加密操作。例如，只有当加密的 Amazon EBS 卷连接到实例时，Amazon EC2 服务才会调 AWS KMS 用解密该卷的数据密钥。在这些情况下，您不能仅依靠上次使用信息来确定是否可以删除 KMS 密钥。如果删除保护亚马逊 EBS 卷的 KMS 密钥，则已连接的 Amazon EBS 卷不会中断，但是随后尝试将该加密的 Amazon EBS 卷连接到另一个 Amazon EC2 实例将失败。

### 了解使用情况跟踪周期
<a name="understanding-tracking-period"></a>

AWS KMS 仅跟踪上次使用每个 KMS 密钥成功执行的加密操作。从加密操作发生到记录使用情况之间可能有长达一小时的延迟。

当您查看 KMS 密钥的上次使用信息时，响应中会包含跟踪开始日期。`TrackingStartDate`这是 AWS KMS 开始记录该密钥的加密活动的日期。将此日期与密钥的创建日期一起使用，通过将密钥的创建日期与跟踪开始日期进行比较来确定其使用历史记录：
+ 如果**存在**上次使用信息，则自开始跟踪以来，该密钥已用于加密操作。响应包括操作类型、时间戳和关联 AWS CloudTrail 的事件 ID。
+ 如果上次使用信息**为空**，则自开始跟踪以来，该密钥没有记录任何加密操作。将密钥的创建日期与进行比较`TrackingStartDate`以确定这意味着什么：
  + 如果密钥是在此*时或之后*创建的`TrackingStartDate`，则该密钥自创建以来一直未用于加密操作。
  + 如果密钥是在*之前*创建的`TrackingStartDate`，则不存在自开始跟踪以来使用的密钥的记录。但是，该密钥可能在开始追踪之前就已使用过。要确定以前是否使用过该密钥，请检查您过去的 AWS CloudTrail 日志。

**警告**  
删除未使用的密钥时，不要仅仅依赖上次使用信息。取而代之的是，先[禁用密钥](enabling-keys.md)并监视 AWS CloudTrail 是否有`DisabledException`条目，这些条目表示有人在禁用密钥时尝试使用密钥。这有助于识别潜在的依赖关系和工作负载故障。

### 跟踪的加密操作
<a name="tracked-crypto-operations"></a>

仅跟踪和记录以下成功的加密操作，以报告上次使用信息。不包括非加密操作。
+ `Decrypt`
+ `DeriveSharedSecret`
+ `Encrypt`
+ `GenerateDataKey`
+ `GenerateDataKeyPair`
+ `GenerateDataKeyPairWithoutPlaintext`
+ `GenerateDataKeyWithoutPlaintext`
+ `GenerateMac`
+ `ReEncrypt`
+ `Sign`
+ `Verify`
+ `VerifyMac`

### 其他考虑因素
<a name="last-usage-considerations"></a>

使用使用信息时，请记住以下几点：
+ **多区域 KMS 密钥** — 对于多区域 KMS 密钥，主密钥和副本密钥分别跟踪上次使用信息。多区域密钥集中的每个密钥都有自己的上次使用信息。
+ **ReEncrypt 操作** — `ReEncrypt` 操作使用两个密钥：用于解密的源密钥和用于加密的目标密钥。两个密钥的上次使用信息是独立记录的，每个密钥都有来自相应密钥所有者账户 CloudTrail 的事件 ID。

您可以使用以下方法查看上次使用信息：

### 使用 AWS KMS 控制台
<a name="key-last-usage-using-console"></a>

您可以在每个 KMS 密钥的详细信息页面上查看上次使用 KMS 密钥成功执行的加密操作。有关如何查看 KMS 密钥详细信息页面的过程，请参阅[访问并列出 KMS 密钥详细信息](finding-keys.md)。

### 使用 AWS KMS API
<a name="key-last-usage-using-api"></a>

该[GetKeyLastUsage](https://docs.aws.amazon.com/kms/latest/APIReference/API_GetKeyLastUsage.html)操作返回上次使用指定 KMS 密钥执行的加密操作的使用情况信息。要识别 KMS 密钥，请使用[密钥 ID](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#key-id-key-id) 或[密钥 ARN](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#key-id-key-ARN)。

例如，以下调用`GetKeyLastUsage`检索有关密钥 ID {{1234abcd-12ab-34cd-56ef-1234567890ab}} 的 KMS 密钥的使用信息。

```
$ aws kms get-key-last-usage --key-id "{{1234abcd-12ab-34cd-56ef-1234567890ab}}"
{
    "KeyCreationDate": 1773253425.56,
    "KeyId": "1234abcd-12ab-34cd-56ef-1234567890ab",
    "TrackingStartDate": 1773253425.56,
    "KeyLastUsage": {
        "Timestamp": 1773253497.0,
        "Operation": "Encrypt",
        "KmsRequestId": "040cce3e-9ef3-4651-b8cf-e47c9bafdc9b",
        "CloudTrailEventId": "2cfd5892-ea8c-4342-ad49-4b9594b06a8b"
    }
}
```

相比之下，以下调用不会`GetKeyLastUsage`显示带有密钥 ID 的 KMS 密钥的使用信息{{0987dcba-09fe-87dc-65ba-ab0987654321}}。

```
$ aws kms get-key-last-usage --key-id "{{0987dcba-09fe-87dc-65ba-ab0987654321}}"
{
    "KeyCreationDate": 1672531200.0,
    "KeyId": "0987dcba-09fe-87dc-65ba-ab0987654321",
    "TrackingStartDate": 1773253425.56,
    "KeyLastUsage": {}
}
```

## 检查 AWS CloudTrail 日志以检查过去的使用情况
<a name="deleting-keys-usage-cloudtrail"></a>

您可以使用 KMS 密钥的使用历史记录来帮助您确定是否在特定 KMS 密钥下加密了密文。

所有 AWS KMS API 活动都记录在 AWS CloudTrail 日志文件中。如果您在 KMS 密钥所在的区域[创建了 CloudTrail 跟踪](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-create-and-update-a-trail.html)，则可以检查 CloudTrail 日志文件以查看特定 KMS 密钥的所有 AWS KMS API 活动的历史记录。如果您没有跟踪，您仍然可以在活动[历史记录](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/view-cloudtrail-events.html)中查看最近的事件。CloudTrail 有关如何 AWS KMS 使用的详细信息 CloudTrail，请参阅[使用记录 AWS KMS API 调用 AWS CloudTrail](logging-using-cloudtrail.md)。

以下示例显示了使用 KMS 密钥保护存储在亚马逊简单存储服务 (Amazon S3) Service 中的对象时生成的 CloudTrail 日志条目。在本示例中，对象通过使用 [KMS 密钥 (SSE-KMS) 的服务器端加密保护数据](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingKMSEncryption.html)上传到 Amazon S3 中。当您使用 SSE-KMS 将对象上传到 Amazon S3 时，需指定用于保护对象的 KMS 密钥。Amazon S3 使用该 AWS KMS [https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html)操作请求对象的唯一数据密钥，此请求事件 CloudTrail 使用类似于以下内容的条目登录：

```
{
  "eventVersion": "1.02",
  "userIdentity": {
    "type": "AssumedRole",
    "principalId": "AROACKCEVSQ6C2EXAMPLE:example-user",
    "arn": "arn:aws:sts::111122223333:assumed-role/Admins/example-user",
    "accountId": "111122223333",
    "accessKeyId": "AKIAIOSFODNN7EXAMPLE",
    "sessionContext": {
      "attributes": {
        "mfaAuthenticated": "false",
        "creationDate": "2015-09-10T23:12:48Z"
      },
      "sessionIssuer": {
        "type": "Role",
        "principalId": "AROACKCEVSQ6C2EXAMPLE",
        "arn": "arn:aws:iam::111122223333:role/Admins",
        "accountId": "111122223333",
        "userName": "Admins"
      }
    },
    "invokedBy": "internal.amazonaws.com"
  },
  "eventTime": "2015-09-10T23:58:18Z",
  "eventSource": "kms.amazonaws.com",
  "eventName": "GenerateDataKey",
  "awsRegion": "us-west-2",
  "sourceIPAddress": "internal.amazonaws.com",
  "userAgent": "internal.amazonaws.com",
  "requestParameters": {
    "encryptionContext": {"aws:s3:arn": "arn:aws:s3:::example_bucket/example_object"},
    "keySpec": "AES_256",
    "keyId": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"
  },
  "responseElements": null,
  "requestID": "cea04450-5817-11e5-85aa-97ce46071236",
  "eventID": "80721262-21a5-49b9-8b63-28740e7ce9c9",
  "readOnly": true,
  "resources": [{
    "ARN": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab",
    "accountId": "111122223333"
  }],
  "eventType": "AwsApiCall",
  "recipientAccountId": "111122223333"
}
```

当您稍后从 Amazon S3 下载此对象时，Amazon S3 会向发送`Decrypt`请求，要求使用指定的 KMS 密钥解密该对象的数据密钥。 AWS KMS 执行此操作时，您的 CloudTrail 日志文件将包含一个类似于以下内容的条目：

```
{
  "eventVersion": "1.02",
  "userIdentity": {
    "type": "AssumedRole",
    "principalId": "AROACKCEVSQ6C2EXAMPLE:example-user",
    "arn": "arn:aws:sts::111122223333:assumed-role/Admins/example-user",
    "accountId": "111122223333",
    "accessKeyId": "AKIAIOSFODNN7EXAMPLE",
    "sessionContext": {
      "attributes": {
        "mfaAuthenticated": "false",
        "creationDate": "2015-09-10T23:12:48Z"
      },
      "sessionIssuer": {
        "type": "Role",
        "principalId": "AROACKCEVSQ6C2EXAMPLE",
        "arn": "arn:aws:iam::111122223333:role/Admins",
        "accountId": "111122223333",
        "userName": "Admins"
      }
    },
    "invokedBy": "internal.amazonaws.com"
  },
  "eventTime": "2015-09-10T23:58:39Z",
  "eventSource": "kms.amazonaws.com",
  "eventName": "Decrypt",
  "awsRegion": "us-west-2",
  "sourceIPAddress": "internal.amazonaws.com",
  "userAgent": "internal.amazonaws.com",
  "requestParameters": {
    "encryptionContext": {"aws:s3:arn": "arn:aws:s3:::example_bucket/example_object"}},
  "responseElements": null,
  "requestID": "db750745-5817-11e5-93a6-5b87e27d91a0",
  "eventID": "ae551b19-8a09-4cfc-a249-205ddba330e3",
  "readOnly": true,
  "resources": [{
    "ARN": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab",
    "accountId": "111122223333"
  }],
  "eventType": "AwsApiCall",
  "recipientAccountId": "111122223333"
}
```

通过评估这些日志条目，您可以确定特定 KMS 密钥的过去使用情况，这将有助于您确定是否需要将其删除。

要查看 AWS KMS API 活动如何在 CloudTrail 日志文件中显示的更多示例，请转至[使用记录 AWS KMS API 调用 AWS CloudTrail](logging-using-cloudtrail.md)。有关更多信息， CloudTrail 请访问[AWS CloudTrail 用户指南](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/)。