策略驱动授权
S3 的访问控制以结构化策略为核心:策略里写明谁(主体)、对哪些资源(桶或键前缀)、能做哪些动作(Action)、在什么条件下(来源地址、加密要求、标签等)被允许或拒绝。评估时机把显式拒绝放在最高优先级,因此一条精准的拒绝规则可以覆盖所有宽松的允许规则。
基本信息
| 策略形式 | JSON 文档,含效果、主体、动作、资源、条件五要素 |
|---|---|
| 策略类型 | 桶策略(资源侧)、身份策略(账号侧) |
| 评估原则 | 显式拒绝优先,默认拒绝,只有被允许才放行 |
| 权限要求 | 配置策略需要桶的拥有者或等价管理权限 |
常见授权场景
- 只读公开:允许匿名读取指定前缀,用于静态站点与 CDN 源站
- 跨账号共享:给合作方账号授予指定桶前缀的读写权限
- 强制加密:条件里要求必须使用加密头,否则拒绝写入
- 限制来源:只允许指定网段或指定网关访问,屏蔽直接公网访问
- 按标签隔离:以对象标签作为条件,实现数据分级访问控制
策略结构示意
策略结构示意
# 读法:谁 -> 在什么条件下 -> 对哪些资源 -> 做什么
# Effect : Allow / Deny
# Principal : 账号、用户或匿名访问者
# Action : s3:GetObject、s3:PutObject、s3:ListBucket 等
# Resource : 桶本身与对象路径,对象路径用通配符匹配前缀
# Condition : 来源地址、是否加密、标签、时间等约束
# 注意:桶级动作与对象级动作要分别授权,混在一起会出现列举成功但读取被拒策略要素与易错点
| 要素 | 作用 | 常见错误 |
|---|---|---|
| Principal | 指定被授权方 | 匿名访问的写法不当,导致整桶对外开放 |
| Resource | 指定桶与对象路径 | 只授权对象却期望能列举桶 |
| Action | 指定允许的操作 | 用通配符覆盖了删除等高风险动作 |
| Condition | 附加约束 | 条件取值写错导致策略永远不生效 |
加固建议
- 从默认拒绝出发,只添加业务真正需要的动作,不用通配符省事
- 把公开读限定到具体前缀,明确禁止对桶的列举权限
- 对写操作附加加密条件,防止明文对象落盘
- 定期用访问日志核对策略是否被绕过,特别是公网直连的请求
- 变更策略前先在测试桶验证,策略错误会立刻影响线上读取
桶策略与身份策略是叠加生效的:两边都允许才放行(显式拒绝除外),排查「权限明明给了还是被拒」时要把两侧一起看。
把桶设为匿名可读且允许列举,等于把全部对象清单公开;即使单个对象不含敏感信息,清单本身也是重要的信息泄露面。