为什么我无法创建或附加使用自定义 AWS KMS 客户主密钥的加密 EBS 卷?

上次更新时间:2020 年 4 月 20 日

为什么我无法通过使用 AWS Key Management Service (AWS KMS) 客户主密钥 (CMK) 加密的快照来创建或附加加密的 Amazon Elastic Block Store (Amazon EBS) 卷?

简短描述

确保在 KMS 密钥策略中允许 AWS Identity and Access Management (IAM) 用户或角色。

解决方法

使用 AWS CloudTrail 事件历史记录识别策略中缺少的权限

1.    打开 CloudTrail 控制台

2.    选择事件历史记录,在进行 AttachVolumeCreateVolume API 调用时,在时间范围中输入一个 15 分钟时段。

3.    选择筛选条件,选择事件源,然后输入 kms.amazonaws.com

4.    加载结果后,选择控制台右上角的下载按钮,然后选择下载 CSV

5.    打开您刚刚下载的文件,然后筛选错误代码列,找到 AccessDenied。所有包含 AccessDenied 错误代码的事件名称通常是缺少权限。

注意:CloudTrail 事件最多需要 15 分钟才能显示在事件历史记录选项卡上。在收到 CreateVolume 或 AttachVolume 失败状态后,立即检查事件历史记录可能不会显示任何事件。

识别缺少权限后,使用以下解决方案来解决问题:

验证 CMK 策略是否包含尝试附加或创建卷的 IAM 用户或角色

在 AWS KMS 控制台默认视图中:

1.    打开 AWS KMS 控制台

2.    选择客户管理的密钥,然后选择相应的密钥。

3.    在密钥策略中,向下滚动到密钥用户。验证密钥用户部分是否列出了您用来创建卷的 IAM 用户或角色。

4.    如果密钥用户部分未列出用户或角色,请选择添加,选择用户或角色,然后选择添加

在 AWS KMS 控制台策略视图中:

如果您以前手动编辑过 AWS KMS CMK 密钥策略,则密钥策略仅在策略 (JSON) 视图中可用。确保在允许所需的 AWS KMS 权限的语句中将 IAM 用户或角色的 ARN 列为委托人

示例:密钥策略

以下是允许用户 A 访问密钥 1 的 KMS 密钥策略的示例:

{
    "Version": "2012-10-17",
    "Id": "key-consolepolicy-3",
    "Statement": [
        {
            "Sid": "Enable IAM User Permissions",
            ...
        },
        {
            "Sid": "Allow access for Key Administrators",
            ...
        },
        {
            "Sid": "Allow use of the keys",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111111111111:user/UserA"
            },
            "Action": [
                "kms:Encrypt",
                "kms:Decrypt",
                "kms:ReEncrypt*",
                "kms:GenerateDataKey*",
                "kms:DescribeKey"
            ],
            "Resource": "*"
        },
        {
            "Sid": "Allow attachment of persistent resources",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111111111111:user/UserA"
            },
            "Action": [
                "kms:CreateGrant",
                "kms:ListGrants",
                "kms:RevokeGrant"
            ],
            "Resource": "*",
            "Condition": {
                "Bool": {
                    "kms:GrantIsForAWSResource": "true"
                }
            }
        }
    ]
}

这篇文章对您有帮助吗?

我们可以改进什么?


需要更多帮助?