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

2 分钟阅读
0

我想保护我的 AWS Key Management Service(AWS KMS)密钥免受 AWS Identity and Access Management(IAM)身份的访问。但是,默认 KMS 密钥策略允许账户中的 IAM 身份以 IAM 权限访问 KMS 密钥。

简短描述

默认 KMS 密钥策略包含以下语句:

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

在前面的示例中,EffectPrincipal 元素不引用 AWS 根用户账户Amazon 资源名称(ARN)允许使用此 IAM policy 访问 KMS 密钥的权限。如果您将所需权限附加到 IAM 实体,则 AWS 账户 111122223333 中的任何主体都对 KMS 密钥有根访问权限。

解决方法

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

将默认 KMS 密钥策略中的 Sid "Enable IAM User Permissions" 替换为 Sid "EnableRootAccessAndPreventPermissionDelegation"。此外,添加一个类似于以下策略中的条件元素:

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

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

您可以在 Sid "Allow access for Key Administrators" 的语句中添加密钥管理员 IAM 用户或角色,以允许管理密钥。您还可以允许 IAM 用户或角色将密钥用于加密操作和其他 AWS 服务。将 IAM 用户或角色 ARN 添加到带有 Sid “Allow use of the key” 和 “Allow attachment of persistent resources” 的语句中。

**注意:**您必须使用修改后的策略使用根用户账户创建密钥。或者,使用 “Allow access for Key Administrators” 语句中允许的主体。这样可以防止 "MalformedPolicyDocumentException" 策略错误。

修改后的默认 KMS 密钥策略类似于以下内容:

{
    "Id": "key-consolepolicy-1",
    "Version": "2012-10-17",
    "Statement":
    [
        {
            "Sid": "EnableRootAccessAndPreventPermissionDelegation",
            "Effect": "Allow",
            "Principal":
            {
                "AWS": "arn:aws:iam::111122223333:root"
            },
            "Action": "kms:*",
            "Resource": "*",
            "Condition":
            {
                "StringEquals":
                {
                    "aws:PrincipalType": "Account"
                }
            }
        },
        {
            "Sid": "Allow access for Key Administrators",
            "Effect": "Allow",
            "Principal":
            {
                "AWS":
                [
                    "arn:aws:iam::111122223333:user/KMSAdminUser",
                    "arn:aws:iam::111122223333:role/KMSAdminRole"
                ]
            },
            "Action":
            [
                "kms:Create*",
                "kms:Describe*",
                "kms:Enable*",
                "kms:List*",
                "kms:Put*",
                "kms:Update*",
                "kms:Revoke*",
                "kms:Disable*",
                "kms:Get*",
                "kms:Delete*",
                "kms:TagResource",
                "kms:UntagResource",
                "kms:ScheduleKeyDeletion",
                "kms:CancelKeyDeletion"
            ],
            "Resource": "*"
        },
        {
            "Sid": "Allow use of the key",
            "Effect": "Allow",
            "Principal":
            {
                "AWS":
                [
                    "arn:aws:iam::111122223333:user/ExampleUser",
                    "arn:aws:iam::111122223333:role/ExampleRole"
                ]
            },
            "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::111122223333:user/ExampleUser",
                    "arn:aws:iam::111122223333:role/ExampleRole"
                ]
            },
            "Action":
            [
                "kms:CreateGrant",
                "kms:ListGrants",
                "kms:RevokeGrant"
            ],
            "Resource": "*",
            "Condition":
            {
                "Bool":
                {
                    "kms:GrantIsForAWSResource": "true"
                }
            }
        }
    ]
}

密钥策略允许以下权限:

  • AWS 根用户账户对密钥的完全访问权限。
  • 主体 KMSAdminUser 和 KMSAdminRole 对密钥执行管理操作。
  • 主体 ExampleUser 和 ExampleRole 使用密钥。

相关信息

管理 AWS 访问密钥的最佳实践

AWS KMS 密钥

AWS 官方
AWS 官方已更新 1 年前