使用Terraform附加KMS密钥策略时遇MalformedPolicyDocumentException错误
错误含义与解决方案
错误含义
这个错误表示你配置的KMS密钥策略存在致命缺陷:应用该策略后,将没有任何主体具备修改该密钥策略的权限。AWS为了防止你彻底“锁死”密钥(无法再更新策略、管理密钥),会直接拒绝应用这种策略。
问题根源
你当前的策略把根用户(arn:aws:iam::${var.account}:root)的权限和CloudFront的权限放在同一条语句中,并添加了AWS:SourceArn条件——这意味着只有来自指定CloudFront分发的请求才能触发该权限。但修改密钥策略的请求来自你的IAM用户/根用户,并非CloudFront,因此根用户实际上无法执行修改策略的操作,触发了AWS的保护机制。
解决方案
拆分策略语句,单独为根用户(或管理员IAM实体)授予不受条件限制的密钥管理权限,再为CloudFront配置带条件的最小权限:
修改后的策略文档
data "aws_iam_policy_document" "key_policy" { # 语句1:允许根账户完全管理密钥(包括修改策略) statement { sid = "AllowRootAccountFullAccess" effect = "Allow" principals { type = "AWS" identifiers = ["arn:aws:iam::${var.account}:root"] } actions = [ "kms:*" ] resources = ["*"] } # 语句2:允许CloudFront仅在指定分发请求下使用密钥(遵循最小权限原则) statement { sid = "AllowCloudFrontKMSUse" effect = "Allow" principals { type = "Service" identifiers = ["cloudfront.amazonaws.com"] } actions = [ "kms:Decrypt", "kms:DescribeKey" ] resources = ["*"] condition { test = "StringEquals" variable = "AWS:SourceArn" values = ["${aws_cloudfront_distribution.s3_distribution.arn}"] } } }
关键说明
- 拆分语句:将根用户的管理权限与CloudFront的使用权限分离,确保根用户不受条件限制,始终能修改密钥策略。
- 最小权限:给CloudFront仅分配实际需要的
kms:Decrypt和kms:DescribeKey权限,替代原有的kms:*,降低权限风险。 - 优先级规则:KMS密钥策略直接控制密钥访问权限,优先级高于IAM用户权限——即使你的IAM用户有
AdministratorAccess,也必须在密钥策略中明确授予管理权限。
内容的提问来源于stack exchange,提问作者nealous3
相关产品推荐
相关产品推荐

