适用于 AWS KMS 的 ABAC 的故障排除 - AWS Key Management Service

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

适用于 AWS KMS 的 ABAC 的故障排除

基于 KMS 密钥的标签和别名控制对 KMS 密钥的访问非常方便,且功能强大。但是,它容易出现一些您希望防止的可预测错误。

由于标签更改而更改访问权限

如果某个标签被删除或其值被更改,则仅能基于该标签访问 KMS 密钥的委托人将被拒绝访问 KMS 密钥。当拒绝策略语句中包含的标签添加到 KMS 密钥时,也会发生这种情况。向 KMS 密钥添加与策略相关的标签可以允许访问应被拒绝访问 KMS 密钥的委托人。

例如,假设委托人可以基于 Project=Alpha 标签访问 KMS 密钥,例如以下示例 IAM policy 语句提供的权限。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "IAMPolicyWithResourceTag", "Effect": "Allow", "Action": [ "kms:GenerateDataKeyWithoutPlaintext", "kms:Decrypt" ], "Resource": "arn:aws:kms:ap-southeast-1:111122223333:key/*", "Condition": { "StringEquals": { "aws:ResourceTag/Project": "Alpha" } } } ] }

如果该标签已从该 KMS 密钥中删除或标签值发生更改,则委托人不再具有将 KMS 密钥用于指定操作的权限。当委托人尝试读取或在使用客户托管密钥的 AWS 服务中写入数据数,这可能会变得明显。要跟踪标签更改,请查看您的 TagResourceUntagResource 条目的 CloudTrail 日志。

要在不更新策略的情况下恢复访问,请更改 KMS 密钥上的标签。这一措施除了短时间在整个 AWS KMS 中生效之后,产生的影响极小。为了防止这样的错误,请仅向需要它的委托人授予标记和取消标记权限,并将其标记权限限制到他们需要管理的标签。更改标签之前,请搜索策略以检测依赖于标签的访问权限,并在具有该标签的所有区域中获取 KMS 密钥。当特定标签发生更改时,您可能会考虑创建 Amazon CloudWatch 告警。

由于别名更改而导致的访问权限更改

如果别名被删除或与其他 KMS 密钥关联,则仅能基于该别名访问 KMS 密钥的委托人将被拒绝访问 KMS 密钥。当拒绝策略语句中包含与 KMS 密钥关联的别名时,也会发生这种情况。向 KMS 密钥添加与策略相关的别名也可以允许访问应被拒绝访问 KMS 密钥的委托人。

例如,以下 IAM policy 语句使用 kms:ResourceAliases 条件键来允许访问账户的不同区域中具有任何指定别名的 KMS 密钥。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AliasBasedIAMPolicy", "Effect": "Allow", "Action": [ "kms:List*", "kms:Describe*", "kms:Decrypt" ], "Resource": "arn:aws:kms:*:111122223333:key/*", "Condition": { "ForAnyValue:StringEquals": { "kms:ResourceAliases": [ "alias/ProjectAlpha", "alias/ProjectAlpha_Test", "alias/ProjectAlpha_Dev" ] } } } ] }

要跟踪别名更改,请查看 CreateAliasUpdateAliasDeleteAlias 条目的 CloudTrail 日志。

要在不更新策略的情况下恢复访问,请更改与 KMS 密钥关联的别名。由于每个别名只能与账户和区域中的一个 KMS 密钥相关联,因此管理别名比管理标签要困难一些。恢复一些委托人对一个 KMS 密钥的访问权限可能会拒绝相同或其他委托人对其他 KMS 密钥的访问。

为了防止出现此错误,请仅向需要它的委托人授予别名管理权限,并将其别名管理权限限制到他们需要管理的别名。在更新或删除别名之前,请搜索策略以检测依赖于别名的访问权限,并在与别名关联的所有区域中查找 KMS 密钥。

由于别名配额而拒绝访问

如果 KMS 密钥超出该账户和区域中每个 KMS 密钥的别名数量的默认配额,被 kms:ResourceAliases 条件授权使用 KMS 密钥的用户将收到一个 AccessDenied 异常。

要恢复访问,请删除与 KMS 密钥关联的别名,使其符合配额。或者使用备用机制授予用户访问 KMS 密钥的权限。

延迟的授权更改

您对标签和别名的更改最多可能需要 5 分钟的时间才能影响 KMS 密钥授权。因此,标签或别名更改可能会在 API 操作影响授权之前反映在响应中。此延迟可能会比影响大多数 AWS KMS 操作的短暂最终一致性延迟长。

例如,您可能拥有一个 IAM policy,允许某些委托人使用带有 "Purpose"="Test" 标签的任何 KMS 密钥。然后,您将 "Purpose"="Test" 标签添加到 KMS 密钥。虽然 TagResource 操作完成且 ListResourceTags 响应确认标签已分配给 KMS 密钥,但委托人可能在 5 分钟内都无法访问 KMS 密钥。

为了防止出现错误,请将此预期延迟构建到您的代码中。

由于别名更新而失败的请求

当您更新别名时,您将现有别名与另一个 KMS 密钥关联。

由于别名现在与未加密密文的 KMS 密钥相关联,指定别名名称别名 ARNDecryptReEncrypt 请求可能会失败。这种情况通常会返回 IncorrectKeyException 或者 NotFoundException。或者如果请求中没有 KeyIdDestinationKeyId 参数,则操作可能会失败,并出现 AccessDenied 异常,因为调用方不再具有对加密密文的 KMS 密钥的访问权限。

您可以通过查看 CreateAliasUpdateAliasDeleteAlias 日志条目的 CloudTrail 日志来跟踪更改。您也可以使用 ListAliases 响应中的 LastUpdatedDate 字段的值来检测更改。

例如,以下 ListAliases 示例响应显示 kms:ResourceAliases 条件中的 ProjectAlpha_Test 别名已更新。因此,基于别名具有访问权限的委托人将失去对先前关联的 KMS 密钥的访问权限。相反,他们可以访问新关联的 KMS 密钥。

$ aws kms list-aliases --query 'Aliases[?starts_with(AliasName, `alias/ProjectAlpha`)]' { "Aliases": [ { "AliasName": "alias/ProjectAlpha_Test", "AliasArn": "arn:aws:kms:us-west-2:111122223333:alias/ProjectAlpha_Test", "TargetKeyId": "0987dcba-09fe-87dc-65ba-ab0987654321", "CreationDate": 1566518783.394, "LastUpdatedDate": 1605308931.903 }, { "AliasName": "alias/ProjectAlpha_Restricted", "AliasArn": "arn:aws:kms:us-west-2:111122223333:alias/ProjectAlpha_Restricted", "TargetKeyId": "1234abcd-12ab-34cd-56ef-1234567890ab", "CreationDate": 1553410800.010, "LastUpdatedDate": 1553410800.010 } ] }

这种变化的补救办法并不简单。您可以再次更新别名以将其与原始 KMS 密钥关联。但是,在执行操作之前,您需要考虑该更改对当前关联的 KMS 密钥的影响。如果委托人在加密操作中使用后一个 KMS 密钥,他们可能需要继续访问该密钥。在这种情况下,您可能需要更新策略以确保委托人有权使用这两个 KMS 密钥。

您可以防止出现这样的错误:在更新别名之前,搜索策略以检测依赖于别名的访问。然后,在与别名关联的所有区域中获取 KMS 密钥。请仅向需要它的委托人授予别名管理权限,并将其别名管理权限限制到他们需要管理的别名。