View a markdown version of this page

确定 KMS 密钥的过去使用情况 - AWS Key Management Service

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

确定 KMS 密钥的过去使用情况

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

警告

这些确定过去使用情况的策略仅对 AWS 委托人和 AWS KMS 业务有效。他们无法检测到不涉及 API 调用的密钥的使用情况 AWS KMS。从对称 KMS 密钥生成数据密钥后,其随后在外部进行本地加密或解密的 AWS KMS 使用不会反映在上次使用信息中。同样,这些策略无法检测到在外部使用非对称 KMS 密钥的公钥的情况 AWS KMS。有关删除用于公有密钥加密的非对称 KMS 密钥的特殊风险的详细信息,包括创建无法解密的密文,请参阅 Deleting asymmetric KMS keys

检查 KMS 密钥权限以确定潜在使用范围

确定当前谁或什么人有权访问 KMS 密钥可以帮助您确定 KMS 密钥的使用范围以及是否仍需要它。要确定当前谁或什么可以访问 KMS 密钥,请参阅确定访问权限 AWS KMS keys

检查使用 KMS 密钥执行的最后一次加密操作

AWS KMS 提供有关使用每个 KMS 密钥上次成功执行的加密操作的使用信息以及关联 CloudTrail 的事件 ID。这可以简化识别未使用的 KMS 密钥的过程。您还可以在密钥策略中使用 k ms: TrailingDaysWithoutKeyUsage 条件密钥来防止最近使用的密钥意外禁用或安排删除。

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

注意

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

了解使用情况跟踪周期

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

当您查看 KMS 密钥的上次使用信息时,响应中会包含跟踪开始日期。TrackingStartDate是 AWS KMS 开始记录该密钥的加密活动的日期。将此日期与密钥的创建日期一起使用,通过将密钥的创建日期与跟踪开始日期进行比较来确定其使用历史记录:

  • 如果存在上次使用信息,则自跟踪开始以来,该密钥已用于加密操作。响应包括操作类型、时间戳和关联 AWS CloudTrail 的事件 ID。

  • 如果上次使用信息为空,则自跟踪开始以来,该密钥没有记录过任何加密操作。将密钥的创建日期与进行比较TrackingStartDate以确定这意味着什么:

    • 如果密钥是在的当天或之后创建TrackingStartDate,则该密钥自创建以来一直未用于加密操作。

    • 如果密钥是在之前创建TrackingStartDate,则自跟踪开始以来就没有使用该密钥的记录。但是,该密钥可能是在追踪开始之前使用的。要确定以前是否使用过密钥,请检查您过去的 AWS CloudTrail 日志。

警告

删除未使用的密钥时,不要仅依赖上次使用信息。取而代之的是,禁用密钥并监视 AWS CloudTrail 是否有DisabledException条目,这表示在禁用时有人尝试使用密钥。这有助于识别潜在的依赖关系和工作负载故障。 AWS CloudTrail 仍然是对您的密钥进行所有 API 调用的权威来源。

跟踪的加密操作

仅跟踪和记录以下成功的加密操作,以报告上次使用信息。 Non-cryptographic 操作不包括在内。

  • Decrypt

  • DeriveSharedSecret

  • Encrypt

  • GenerateDataKey

  • GenerateDataKeyPair

  • GenerateDataKeyPairWithoutPlaintext

  • GenerateDataKeyWithoutPlaintext

  • GenerateMac

  • ReEncrypt

  • Sign

  • Verify

  • VerifyMac

其他考虑因素

使用使用信息时,请记住以下几点:

  • Multi-Region KMS 密钥 — 对于多区域 KMS 密钥,主密钥和副本密钥独立跟踪上次使用信息。多区域密钥集中的每个密钥都有自己的上次使用信息。

  • ReEncrypt 操作 — 该ReEncrypt操作使用两个密钥:用于解密的源密钥和用于加密的目标密钥。两个密钥的最后使用信息是独立记录的,每个密钥都有来自相应密钥所有者账户 CloudTrail 的事件 ID。

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

您可以在每个 KMS 密钥的详细信息页面上查看使用 KMS 密钥执行的最后一次成功加密操作。有关如何查看 KMS 密钥详细信息页面的过程,请参阅访问并列出 KMS 密钥详细信息

GetKeyLastUsage操作返回有关使用指定 KMS 密钥执行的最后一次加密操作的使用信息。要识别 KMS 密钥,请使用密钥 ID 密钥 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 用于检查过去使用情况的日志

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

所有 AWS KMS API 活动都记录在 AWS CloudTrail 日志文件中。如果您在 KMS 密钥所在的区域创建了 CloudTrail 跟踪,则可以检查 CloudTrail 日志文件以查看特定 KMS 密钥的所有 AWS KMS API 活动的历史记录。如果您没有跟踪,您仍然可以在活动历史记录中查看最近的事件 CloudTrail 有关 AWS KMS 使用方式的详细信息 CloudTrail,请参阅日志记录 AWS KMS 使用 API 调用 AWS CloudTrail

以下示例显示了使用 KMS 密钥保护存储在亚马逊简单存储服务 (Amazon S3) 中的对象时生成的 CloudTrail 日志条目。在此示例中,使用使用 KMS 密钥的服务器端加密保护数据 (SSE-KMS) 将对象上传到 Amazon S3。当您使用将对象上传到 Amazon S3 时 SSE-KMS,您需要指定用于保护该对象的 KMS 密钥。Amazon S3 使用该 AWS KMS GenerateDataKey操作为对象请求唯一的数据密钥,此请求事件 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。有关更多信息, CloudTrail 请访问AWS CloudTrail 用户指南

CloudTrail 查询的成本注意事项

当您使用亚马逊 CloudTrail 日志见解查询 CloudWatch 日志时,亚马逊 CloudWatch 日志见解会根据扫描的数据量向您收费。大型无界查询可能会导致意想不到的高成本。要管理成本,请将每个查询的范围缩小到最窄的相关时间范围。按事件名称、资源 ARN 或主体 ID 进行筛选。在尝试查询之前,请考虑检查最后一次使用 KMS 密钥成功执行的加密操作,以避免产生不必要的查询成本。您还可以在预算中设置预算提醒, AWS 以捕捉意想不到的查询量。有关定价的更多信息,请参阅亚马逊网络服务网站上的亚马逊 CloudWatch定价。