桶策略与访问控制
桶策略是一段 JSON,描述谁在什么条件下能对哪些对象做什么操作。它由主体、动作、资源、条件和效果五部分构成,配合账号侧的身份策略与防盗链设置,构成对象存储的权限体系。配置时最大的风险是「打开公网可读写」:一条放宽语句就能让整个桶的权限形同虚设,而从控制台界面上很难一眼看出来。
基本信息
| 五要素 | Effect、Principal、Action、Resource、Condition |
|---|---|
| 判断逻辑 | 桶策略与账号身份策略叠加判断,显式拒绝优先于允许 |
| 常见动作 | GetObject、PutObject、DeleteObject、ListBucket |
| 条件维度 | 来源 IP、协议要求(强制 HTTPS)、Referer 防盗链 |
| 验证方式 | 改完用匿名访问或受限身份实际验证一次 |
典型使用场景
- 开放只读静态资源:让指定网段或 CDN 回源读取公开素材
- 限制来源网段:只允许公司出口 IP 或指定 VPC 访问私有桶
- 强制 HTTPS:禁止通过明文协议访问对象
- 防盗链:限制只有指定站点的页面可以引用资源
- 跨账号授权:给合作方账号只读访问某个前缀下的对象
桶策略片段(允许指定网段只读)
桶策略片段(允许指定网段只读)
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Principal": ["*"],
"Action": ["oss:GetObject"],
"Resource": ["acs:oss:*:*:my-app-assets/public/*"],
"Condition": {"IpAddress": {"acs:SourceIp": ["203.0.113.0/24"]}}
}
]
}要素读法
| 要素 | 含义 | 风险点 |
|---|---|---|
| Effect | 允许或拒绝 | 显式拒绝会覆盖其他允许 |
| Principal | 授权给谁 | 写通配符等于对所有人开放 |
| Action | 允许的动作 | 带上写与删除动作风险陡增 |
| Resource | 作用对象路径 | 前缀写得过宽会覆盖整个桶 |
| Condition | 生效条件 | 条件写错时策略可能静默失效 |
把 Principal 设为通配符且 Action 含写入与删除动作,等于开放公网读写;每次变更后做一次匿名访问验证,确认权限没有被放大。
排权限问题时桶策略、账号身份策略、临时凭证权限三处都要看:上传接口用了临时密钥但桶策略仍放开匿名读写,权限控制就失去意义。
策略建议按文件管理:JSON 存进版本库、变更走评审记录,避免有人在控制台点几下就把整个桶的读写放开了,事后也无人知晓。