如何防止 IAM 策略允许用户或角色访问 AWS KMS 中的 CMK?

上次更新时间:2021 年 2 月 17 日

我想保护我的客户主密钥 (CMK) 免受 AWS Identity and Access Management (IAM) 身份(用户、组和角色)的访问。但是,默认 CMK 策略允许账户中的 IAM 身份以 IAM 权限访问 CMK。我该如何预防此问题?

简短描述

默认的 CMK IAM 策略包含类似于以下内容的语句:

{
    "Sid": "Enable IAM User Permissions",
    "Effect": "Allow",
    "Principal": {
        "AWS": "arn:aws:iam::111122223333:root"
    },
    "Action": "kms:*",
    "Resource": "*"
}

在此示例中,Effect 和 Principal 元素不引用 AWS 根用户账户。Amazon 资源名称 (ARN) 允许使用此 IAM 策略访问 CMK 的权限。如果将所需的 AWS Key Management Service (AWS KMS) 权限附加到 IAM 实体,则 AWS 账户 111122223333 中的任何委托人都对 CMK 有根访问权限。

解决方法

您可以阻止 IAM 实体访问 CMK,并允许根用户账户管理 CMK。这还可以防止根用户账户失去对 CMK 的访问权限。

确保 CMK 策略包含同一账户中的密钥管理员,类似于以下内容:

{
    "Sid": "Allow access for Key Administrators",
    "Effect": "Allow",
    "Principal": {
        "AWS": 
    },
    "Action": ,
    "Resource": "*"
}

将 CMK IAM 策略 Sid 替换为“EnableRootAccessAndPreventPermissionDelegation”,然后添加类似以下内容的 Condition 元素:

重要提示:用您的账号替换账户 111122223333,并确保条件键 aws:PrincipalType 设置为 Account

{
    "Sid": "EnableRootAccessAndPreventPermissionDelegation",
    "Effect": "Allow",
    "Principal": {
        "AWS": "arn:aws:iam::111122223333:root"
    },
    "Action": "kms:*",
    "Resource": "*",
    "Condition": {
        "StringEquals": {
            "aws:PrincipalType": "Account"
        }
    }
}

只有 CMK 策略的管理员部分中列出的账户根用户和 IAM 实体才能管理密钥。