EC2绑定的SSM Parameter Store IAM授权策略不生效问题求助
问题根因与解决方案
核心问题根因
ssm:GetParametersByPath操作的IAM条件评估逻辑和Policy Simulator存在差异:你在Deny语句中使用的ssm:resourceTag条件键,对批量路径查询操作不生效。实际运行时,IAM在收到get-parameters-by-path请求的阶段,还未解析路径下的具体参数标签,会直接判定StringNotEquals条件成立,触发全局Deny,所以所有请求都会被拦截。Policy Simulator会预先代入你配置的参数标签做模拟,才会出现测试通过实际运行失败的情况。- 权限配置逻辑不符合最小化原则:你先开放全量
ssm:*权限再做Deny的逻辑风险极高,也容易出现条件匹配冲突的问题。
修复方案
直接调整权限逻辑,放弃先全量允许再拒绝的写法,按需求最小化配置权限:
修正后的策略示例
{ "Version": "2012-10-17", "Statement": [ // 仅允许指定标签的参数执行路径查询操作 { "Effect": "Allow", "Action": [ "ssm:GetParametersByPath" ], "Resource": "arn:aws:ssm:*:*:parameter/*", "Condition": { "StringEquals": { "aws:ResourceTag/env": "development-1" } } }, // 若参数为SecureString类型且使用自定义KMS密钥加密,需添加解密权限,使用AWS托管SSM密钥可省略该段 { "Effect": "Allow", "Action": "kms:Decrypt", "Resource": "arn:aws:kms:<你的区域>:<你的账户ID>:key/<你的KMS密钥ID>", "Condition": { "StringEquals": { "kms:EncryptionContext:aws:ssm:parameter:tag/env": "development-1" } } }, // 全局拒绝所有修改类SSM操作,完全禁止变更参数 { "Effect": "Deny", "Action": [ "ssm:PutParameter", "ssm:DeleteParameter", "ssm:DeleteParameters", "ssm:GetParameterHistory", "ssm:LabelParameterVersion", "ssm:PutParameterPolicy" ], "Resource": "*" } ] }
验证注意事项
- 若你需要同时支持单参数查询,可将
ssm:GetParameter、ssm:GetParameters添加到第一个Allow语句的Action列表中,标签条件可正常生效 - 测试时可先去掉
--with-decryption参数,如果无解密参数的请求可正常返回,说明是KMS权限配置问题,再调整对应KMS策略即可 - 确保EC2实例绑定的IAM角色的信任策略允许EC2服务代入角色,没有额外的权限边界限制
内容的提问来源于stack exchange,提问作者Charmander
相关产品推荐
相关产品推荐

