在应用用户场景下使用S3策略变量及IAM角色实现分级访问控制方案咨询
S3动态层级访问权限配置方案
前提说明
你之前认为S3策略变量仅适用于IAM用户是误解,aws:PrincipalTag等策略变量同时支持IAM角色的STS会话标签,完全可以满足你动态赋权的需求,不需要为每个单独用户创建IAM实体,共用你计划的6类预定义IAM角色即可实现。
第一步:统一规范S3桶目录结构
先约定固定的目录层级,后续权限策略全部基于该结构匹配:
s3://<你的桶名称> ├── headquarters/ # 总部根目录 │ ├── admin/ # 总部管理员私有目录 │ │ └── <管理员用户ID>/ # 单个总部管理员私有目录 │ ├── staff/ # 总部普通员工私有目录 │ │ └── <员工用户ID>/ # 单个总部普通员工私有目录 │ └── public/ # 总部向下公开的公共目录 ├── region/ # 区域根目录 │ └── <区域ID>/ # 单个区域根目录 │ ├── admin/ # 该区域管理员私有目录 │ │ └── <管理员用户ID>/ # 单个区域管理员私有目录 │ ├── staff/ # 该区域普通员工私有目录 │ │ └── <员工用户ID>/ # 单个区域普通员工私有目录 │ └── public/ # 该区域向下公开的公共目录 └── area/ # 片区根目录 └── <片区ID>/ # 单个片区根目录 ├── admin/ # 该片区管理员私有目录 │ └── <管理员用户ID>/ # 单个片区管理员私有目录 ├── staff/ # 该片区普通员工私有目录 │ └── <员工用户ID>/ # 单个片区普通员工私有目录 └── public/ # 该片区公开的公共目录
第二步:配置IAM角色信任规则
为你预先创建的6类IAM角色统一配置信任策略,允许你的应用后端调用STS服务的AssumeRole接口时传递自定义会话标签,示例信任策略如下:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws-cn:iam::<你的账号ID>:role/<你的应用后端服务角色>" }, "Action": [ "sts:AssumeRole", "sts:TagSession" ] } ] }
第三步:为每类IAM角色配置动态权限策略
以总部管理员角色的权限策略为例,核心通过会话标签变量动态匹配权限,不需要为每个用户单独修改策略:
{ "Version": "2012-10-17", "Statement": [ // 允许访问自己的私有目录 + 所有低于总部层级的内容 { "Effect": "Allow", "Action": "s3:*", "Resource": [ "s3://<你的桶名称>/headquarters/admin/${aws:PrincipalTag/user_id}/*", "s3://<你的桶名称>/headquarters/public/*", "s3://<你的桶名称>/region/*", "s3://<你的桶名称>/area/*" ] }, // 显式禁止访问其他总部管理员的私有目录 { "Effect": "Deny", "Action": "s3:*", "Resource": "s3://<你的桶名称>/headquarters/admin/*", "Condition": { "StringNotEquals": { "s3:prefix": "headquarters/admin/${aws:PrincipalTag/user_id}/" } } }, // 显式禁止访问总部普通员工的私有目录 { "Effect": "Deny", "Action": "s3:*", "Resource": "s3://<你的桶名称>/headquarters/staff/*" } ] }
其他5类角色按照同样逻辑调整权限范围即可:
- 总部普通员工:额外增加禁止访问所有总部管理员私有目录的规则,仅保留自己的普通员工私有目录、总部公共目录、所有区域和片区目录的访问权限
- 区域管理员:仅允许访问自己所属区域的私有目录、本区域公共目录、所有下属片区目录,禁止访问总部所有私有目录、其他区域的所有私有目录
- 其余角色以此类推匹配你定义的权限规则即可
第四步:运行时动态生效逻辑
整个权限生效流程不需要提前为用户预配置任何权限,用户访问时动态生成对应权限的凭证:
- 用户登录应用,后端校验身份后,获取用户的层级、角色、唯一ID、所属区域ID/片区ID等属性
- 后端调用STS的
AssumeRole接口,选择对应用户层级角色的IAM角色ARN,传入上述属性作为会话标签,获取有效期可控的临时访问AK/SK和会话Token - 前端直接使用该临时凭证访问S3,或者后端用该凭证代理用户的S3访问请求,S3会自动根据策略中的变量匹配当前用户的权限,完全动态生效
注意事项
- 显式Deny规则优先级高于所有Allow规则,所有跨用户的私有目录访问限制必须通过显式Deny实现,避免出现权限溢出
- 调用
AssumeRole时必须申请sts:TagSession权限,否则会话标签不会生效,权限策略无法匹配 - 建议开启S3桶的访问日志功能,方便后续审计权限是否符合预期
内容的提问来源于stack exchange,提问作者tenet testuser1
相关产品推荐
相关产品推荐

