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

在应用用户场景下使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 10:48:03