如何让STS AssumeRole传递的细粒度DynamoDB权限生效?
解决STS AssumeRole传递的内联策略不生效问题
核心原因
你传递的--policy参数是IAM权限边界(Permission Boundary),它的作用是限制角色已有的权限范围,而非直接授予权限。这就是为什么:
- 角色无任何附加策略时,会报权限不足(没有基础权限可被限制)
- 给角色附加全量权限策略后,内联策略的条件未生效(条件键拼写错误导致校验失效)
分步解决方案
1. 给IAM角色附加基础权限策略
先在IAM控制台给test-dynamodb-role附加以下基础策略,确保角色拥有DynamoDB操作的基础权限:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["dynamodb:*"], "Resource": [ "arn:aws:dynamodb:*:*:table/my-dynamo-table", "arn:aws:dynamodb:*:*:table/my-dynamo-table/index/*" ] } ] }
2. 修正内联策略的错误
你的原策略存在两个关键问题:
- 条件键
dynamodb: LeadingKeys多了空格,正确写法是dynamodb:LeadingKeys ForAllValues仅适用于批量操作(如BatchGetItem),单条GetItem/Query用普通操作符即可
修正后的内联策略:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["dynamodb:*"], "Resource": ["arn:aws:dynamodb:*:*:table/my-dynamo-table"], "Condition": { "StringLike": { "dynamodb:LeadingKeys": ["leading-key:*"] } } }, { "Effect": "Allow", "Action": ["dynamodb:Query", "dynamodb:GetItem"], "Resource": ["arn:aws:dynamodb:*:*:table/my-dynamo-table/index/*"], "Condition": { "StringEquals": { "dynamodb:LeadingKeys": ["leading-key"] } } } ] }
3. 修正AssumeRole命令
为避免JSON转义错误,建议将内联策略保存为文件(如inline-policy.json),再执行命令:
aws sts assume-role \ --role-arn arn:aws:iam::12345678:role/test-dynamodb-role \ --role-session-name dynamo-cmd-line-test \ --policy file://inline-policy.json
4. 修正GetItem命令的JSON格式
原命令的--key参数转义有误,改用单引号避免转义问题:
aws dynamodb get-item --table-name my-dynamo-table --key '{ "Id": { "S": "leading-key:93be7f8b-7c13-4248-1b28-ad2cf92b237f" }}' --profile temp-sts
验证效果
- 当查询
leading-key:*格式的主键时,操作会成功 - 尝试查询其他前缀的主键时,会触发权限拒绝,说明内联策略的条件已生效
内容的提问来源于stack exchange,提问作者glenatron
相关产品推荐
相关产品推荐

