基于Amazon Cognito实现S3客户数据独立访问权限方案咨询
架构落地概念指导
核心逻辑完全可以实现你「不需要为每个用户单独创建IAM角色」的需求,通过Cognito属性映射+IAM动态会话权限即可完成全流程适配,具体实现逻辑如下:
前置基础配置
仅需要提前配置1次,后续用户注册不需要再修改IAM侧配置:
- 在Cognito用户池新增自定义属性
custom:sensor_id,设置属性编辑权限为仅管理员可修改,避免用户侧自行篡改绑定的传感器ID - 创建1个所有认证用户共用的通用IAM角色,用于Cognito身份池的授权准入,角色的基础权限策略参考如下,仅允许用户访问和自身绑定sensor ID匹配的S3路径资源:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["s3:GetObject", "s3:ListBucket"], "Resource": [ "arn:aws:s3:::你的S3存储桶名称/${aws:PrincipalTag/sensor_id}/*", "arn:aws:s3:::你的S3存储桶名称" ], "Condition": { "StringLike": { "s3:prefix": ["${aws:PrincipalTag/sensor_id}/*"] } } } ] }
如果你的业务是每个传感器对应独立S3桶,只需把Resource字段的桶名部分替换为${aws:PrincipalTag/sensor_id}即可适配。
- 配置Cognito身份池的主体标签映射规则,将用户池的
custom:sensor_id属性映射为IAM会话的sensor_id标签,设置映射属性为只读,避免会话过程中被篡改。
业务流程适配
完全匹配你预期的5步流程,不需要额外调整业务逻辑:
- 客户拿到带唯一sensor ID的传感器,无额外变化
- 客户注册时提交sensor ID,后台先校验该ID为企业已出货、未被绑定的合法ID,校验通过后写入用户池的
custom:sensor_id属性 - 不需要单独创建IAM角色,权限控制通过上述通用角色的动态标签匹配实现
- 用户登录后,前端用Cognito返回的ID凭证向身份池兑换AWS临时访问密钥,该密钥自动携带当前用户绑定的
sensor_id标签,天然只能访问对应路径的S3资源,不需要额外做角色切换逻辑 - 对应S3路径/桶新增数据时,不需要更新任何权限配置,用户直接即可访问
额外注意事项
- 如果需要支持单个用户绑定多个传感器ID,只需将
custom:sensor_id改为存储多值的JSON数组,同时调整IAM策略的Condition规则适配多值匹配即可 - 要确保传感器上传数据时,路径严格按照
sensor_id/xxx的规则存储,避免权限匹配失效
内容的提问来源于stack exchange,提问作者crabapus
相关产品推荐
相关产品推荐

