如何限制IAM用户使用KMS密钥?RDS加密CMK合规GDPR及政策问题
问题解答
核心需求可行性
你完全可以通过配置KMS密钥策略限制自身对目标密钥的使用权限,以此契合GDPR中数据访问最小权限的要求——比如禁止自己执行数据库加解密、快照创建/恢复这类依赖KMS密钥的操作。
当前密钥策略的问题
你的现有策略存在以下关键缺陷:
- 权限过度开放:策略中使用
kms:Create*、kms:Get*等通配符操作,涵盖了kms:CreateGrant、kms:GetKeyPolicy等高风险权限,甚至可能间接让你绕开限制执行加解密操作。 - 缺少拒绝逻辑:仅靠允许语句无法实现“限制自身使用”的目标,必须添加Deny(拒绝)语句,明确禁止你执行
kms:Decrypt、kms:Encrypt、kms:GenerateDataKey(RDS加密核心依赖操作),以及关联快照的kms:CreateGrant等敏感操作。 - 资源范围不合理:
resources = ["*"]会让权限作用于所有KMS密钥,你应该将资源限定为目标CMK的ARN,避免影响其他密钥。 - 未授权RDS服务权限:RDS服务需要具备该CMK的使用权限才能完成数据库加密、快照操作,你的策略完全没有给RDS服务主体(如
arn:aws:iam::你的账户ID:role/aws-service-role/rds.amazonaws.com/AWSServiceRoleForRDS)授权,会导致RDS无法正常使用该密钥。
修正方向示例
符合需求的密钥策略需包含三部分核心逻辑:
- 授权RDS服务执行必要的KMS操作;
- 明确拒绝自身执行敏感操作;
- 保留自身对密钥的合规管理权限。
示例修正后的策略片段:
data "aws_iam_policy_document" "kms" { # 允许RDS服务使用密钥完成加密相关操作 statement { effect = "Allow" principals { type = "AWS" identifiers = ["arn:aws:iam::你的账户ID:role/aws-service-role/rds.amazonaws.com/AWSServiceRoleForRDS"] } actions = [ "kms:Encrypt", "kms:Decrypt", "kms:GenerateDataKey", "kms:CreateGrant", "kms:DescribeKey" ] resources = ["arn:aws:kms:你的区域:你的账户ID:key/目标CMK-ID"] } # 拒绝自身执行敏感的密钥操作 statement { effect = "Deny" principals { type = "AWS" identifiers = ["${local.arn}"] } actions = [ "kms:Encrypt", "kms:Decrypt", "kms:GenerateDataKey", "kms:CreateGrant" ] resources = ["arn:aws:kms:你的区域:你的账户ID:key/目标CMK-ID"] } # 保留自身对密钥的管理权限(按需调整) statement { effect = "Allow" principals { type = "AWS" identifiers = ["${local.arn}"] } actions = [ "kms:DescribeKey", "kms:EnableKey", "kms:DisableKey", "kms:TagResource", "kms:UntagResource", "kms:ScheduleKeyDeletion", "kms:CancelKeyDeletion" ] resources = ["arn:aws:kms:你的区域:你的账户ID:key/目标CMK-ID"] } }
注意:AWS权限评估中Deny优先级高于Allow,确保拒绝语句能覆盖所有敏感操作。
内容的提问来源于stack exchange,提问作者Mohammed Salah
相关产品推荐
相关产品推荐

