You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过Assume-Role实现DynamoDB细粒度访问控制失效排查

问题分析与解决

核心误解:IAM策略是授权控制,而非自动结果过滤

你对DynamoDB细粒度访问控制的理解存在关键偏差:IAM策略中的dynamodb:LeadingKeys条件是用来判断调用者是否有权限操作特定主键的数据,而不是自动帮你过滤返回结果。它不会修改scan命令的返回内容,只会在你尝试访问不符合条件的数据时拒绝请求。

如果执行不带任何过滤条件的aws dynamodb scan --table-name mytable,IAM策略不会拦截这个请求——因为你没有指定要访问的特定LeadingKey,策略的Condition无法触发权限校验,所以允许全表扫描并返回所有数据。

具体问题点

1. 策略中的变量错误

你使用的${www.amazon.com:user_id}变量不适用于Assumed Role场景:

  • 对于通过Assume-Role获取的身份,正确变量应是${aws:userid}(对应get-caller-identity返回的UserId:AROAXXXXXXXXXXXXXXXXX:myusername),或${aws:username}(对应Assumed Role后的用户名部分:myusername)。
  • 你的表中目标行的UserID是RoleName/myusername,当前变量无法匹配该值,即使策略生效也无法正确限制权限。

2. Condition操作符与场景不匹配

ForAllValues:StringEquals适用于批量操作(比如BatchGetItem),确保所有操作的主键都符合条件。但对于scan这类全表扫描操作,该操作符无法有效校验——因为扫描本身没有指定具体的LeadingKey集合,Condition无法进行匹配判断,导致策略直接放行。

正确的实现方式

步骤1:修正策略中的变量和Condition

假设你希望限制用户只能访问UserID为RoleName/myusername的数据,调整策略如下:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "dynamodb:GetItem",
                "dynamodb:Query"
            ],
            "Resource": "arn:aws:dynamodb:us-east-1:012345678901:table/mytable",
            "Condition": {
                "StringEquals": {
                    "dynamodb:LeadingKeys": "${aws:userid}"
                }
            }
        },
        // 若需允许scan,需配合FilterExpression,同时策略限制只能扫描自身数据
        {
            "Effect": "Allow",
            "Action": "dynamodb:Scan",
            "Resource": "arn:aws:dynamodb:us-east-1:012345678901:table/mytable",
            "Condition": {
                "StringEqualsIfExists": {
                    "dynamodb:LeadingKeys": "${aws:userid}"
                }
            }
        }
    ]
}
  • 优先使用Query操作(而非Scan),因为Query可直接通过主键过滤,IAM策略能准确校验权限。
  • 若必须使用Scan,需在调用时指定FilterExpression,同时策略用StringEqualsIfExists确保如果指定了LeadingKey则必须符合条件。

步骤2:调用命令时指定过滤条件

要获取自己的数据,不能直接执行无过滤的scan,需添加过滤参数:

aws dynamodb scan --table-name mytable --filter-expression "UserID = :userid" --expression-attribute-values '{":userid": {"S": "RoleName/myusername"}}'

更推荐使用效率更高的Query:

aws dynamodb query --table-name mytable --key-condition-expression "UserID = :userid" --expression-attribute-values '{":userid": {"S": "RoleName/myusername"}}'

步骤3:确认表分区键

dynamodb:LeadingKeys仅匹配表的分区键,如果你的表分区键不是UserID,策略中的该条件将完全无效,需确认表结构的分区键设置。

内容的提问来源于stack exchange,提问作者Farhan Yusufzai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 21:42:40