如何通过Cognito和IAM实现DynamoDB的项目级细粒度访问控制?
实现方案
最简实现方案
结合AWS Cognito自定义属性与IAM细粒度策略,具体步骤如下:
- 步骤1:给Cognito用户添加自定义属性
在用户池的属性设置里,添加两个自定义属性:custom:role(存储用户角色:viewer/editor/super-editor)和custom:projects(存储用户可访问的项目代码,用逗号分隔,比如#PR001,#PR003,#PR005)。由于用户规模小,直接在Cognito控制台手动为每个用户配置这些属性即可。 - 步骤2:编写IAM访问策略
为访问DynamoDB的IAM角色(比如用户身份池对应的角色)添加带条件的权限策略,根据用户的角色和项目列表限制访问:
示例策略:
注:编辑器需要"部分数据编辑"的话,仅靠IAM策略无法实现字段级限制,这部分可以在应用层处理——接收更新请求时,检查用户角色,只允许修改指定字段;或者结合DynamoDB的条件表达式,在更新操作时限制可修改的属性。{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "dynamodb:GetItem", "dynamodb:Query", "dynamodb:Scan" ], "Resource": "arn:aws:dynamodb:REGION:ACCOUNT_ID:table/YOUR_TABLE", "Condition": { "ForAllValues:StringEquals": { "dynamodb:LeadingKeys": "${cognito-identity.amazonaws.com:custom:projects}" }, "StringEquals": { "cognito-identity.amazonaws.com:custom:role": "viewer" } } }, { "Effect": "Allow", "Action": [ "dynamodb:GetItem", "dynamodb:Query", "dynamodb:Scan", "dynamodb:PutItem", "dynamodb:UpdateItem" ], "Resource": "arn:aws:dynamodb:REGION:ACCOUNT_ID:table/YOUR_TABLE", "Condition": { "ForAllValues:StringEquals": { "dynamodb:LeadingKeys": "${cognito-identity.amazonaws.com:custom:projects}" }, "StringEquals": { "cognito-identity.amazonaws.com:custom:role": "editor" } } }, { "Effect": "Allow", "Action": [ "dynamodb:*" ], "Resource": "arn:aws:dynamodb:REGION:ACCOUNT_ID:table/YOUR_TABLE", "Condition": { "ForAllValues:StringEquals": { "dynamodb:LeadingKeys": "${cognito-identity.amazonaws.com:custom:projects}" }, "StringEquals": { "cognito-identity.amazonaws.com:custom:role": "super-editor" } } } ] }
能否在DynamoDB存储项目访问列表?是否安全?
完全可以,具体做法:
- 创建一个单独的用户权限表,主键用
user_id,属性包含role和projects(数组类型存储项目代码)。 - 访问业务数据之前,后端服务先查询这个权限表,获取当前用户的可访问项目和角色,再在应用层过滤业务数据请求,或者结合DynamoDB的查询条件(比如只查询用户可访问的项目代码)。
安全性说明:
- 只要正确配置IAM策略,限制只有你的后端服务能读写这个权限表,普通用户无法直接访问或修改该表,就是安全的。
- 禁止将权限表的信息返回给前端,所有权限校验逻辑都在后端完成,防止前端篡改权限数据。
- 对比Cognito自定义属性的方式,DynamoDB存储权限表的优势是更灵活(比如支持更复杂的权限规则),但需要额外维护一张表,且每次访问业务数据前多一次查询操作——鉴于你的用户规模小,这种额外开销完全可以接受。
补充建议
- 如果你需要更灵活的权限管理(比如后续用户规模扩大,或权限规则变复杂),可以考虑引入AWS IAM Access Analyzer验证策略的正确性,或者结合AWS AppSync的细粒度访问控制(AppSync可以直接基于Cognito claims做权限判断)。
- 无论用哪种方式,都要定期审计权限配置,确保没有多余的权限被授予。
内容的提问来源于stack exchange,提问作者redfuse
相关产品推荐
相关产品推荐

