一、结论
通过开启存储桶全量公共访问阻止、配置显式拒绝匿名请求的桶策略、关闭匿名用户所有ACL权限三层规则配合,即可100%禁止匿名用户访问S3存储桶的所有资源,避免未授权的公开访问漏洞。
二、准备工作
1. 拥有S3服务的管理权限账号:需要持有对应存储桶的管理员权限,或至少包含s3:PutBucketPolicy、s3:PutBucketAcl、s3:PutBucketPublicAccessBlock三个操作权限的IAM账号,若使用七彩云对象存储可直接用主账号或授权的子账号登录,无需额外配置复杂的IAM权限规则。
2. 操作工具:若使用可视化操作只需准备可正常访问控制台的浏览器即可;若使用命令行操作,需提前安装AWS CLI、S3cmd等兼容S3协议的客户端工具,并完成Access Key、Secret Key、存储桶所属区域(region)、接入端点(endpoint)的初始化配置。
3. 前置校验:确认要配置的存储桶名称,提前梳理桶内是否有需要临时公开访问的资源,避免配置完成后影响正常业务调用。
三、操作步骤
以下以控制台可视化操作为例,所有兼容S3协议的存储服务操作逻辑基本一致:
1. 进入目标存储桶配置页
打开对应S3服务的控制台,原生AWS直接进入S3服务模块,七彩云对象存储则进入控制台的「对象存储」模块,在存储桶列表中找到需要设置的目标桶,点击桶名称进入详情配置页面。
2. 开启全量公共访问阻止
在存储桶详情页找到「权限」标签页,定位到「公共访问阻止(针对此存储桶)」配置项,勾选全部4个选项:阻止新的公共ACL、禁止现有公共ACL生效、阻止新的公共存储桶策略、禁止现有公共存储桶策略生效,勾选完成后点击保存,按页面提示输入确认信息即可完成第一道防线配置。
3. 配置拒绝匿名访问的桶策略
同样在「权限」标签页找到「存储桶策略」配置项,点击编辑按钮,输入符合JSON语法的桶策略,策略核心是显式拒绝所有匿名用户的所有S3操作,编辑完成后点击保存即可,策略规则会立即生效。
4. 关闭匿名用户的ACL权限
最后在「权限」标签页找到「访问控制列表(ACL)」配置项,点击编辑,找到「所有人(公共访问)」的权限组,取消该组下的所有权限勾选(包括列表、读取、写入、权限管理等),仅保留账号本身或授权的IAM用户的权限,点击保存完成最后一层配置。
5. 验证配置生效
打开无痕浏览器,直接输入桶内任意一个对象的公开访问URL,若返回403 Forbidden错误,即说明禁止匿名访问的配置已经生效。
四、常见错误
- endpoint填写错误:使用命令行或SDK调用时,若使用非AWS的S3兼容服务(如七彩云对象存储),填写了AWS默认的endpoint会导致请求失败,需要填写对应服务商提供的专属endpoint地址。
- region配置错误:客户端配置的区域与存储桶实际所属区域不一致,会触发找不到存储桶或权限校验失败的错误,需要在控制台存储桶的基础信息页确认正确的region参数。
- 权限不足:操作账号没有修改存储桶权限的相关权限,会返回403错误,需要联系账号管理员分配对应的操作权限。
- 桶策略语法错误:编辑桶策略时JSON格式不规范、存储桶ARN填写错误(比如漏写桶名后的
/*导致仅限制桶本身的访问、不限制桶内对象的访问),都会导致配置不生效。 - 公共访问阻止未全开:仅勾选部分公共访问阻止选项,可能会出现后续误添加公共ACL导致匿名访问重新生效的问题。
五、示例说明
以名称为my-doc-bucket的存储桶为例,完整的拒绝匿名访问桶策略如下:
```json
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DenyAllAnonymousAccess",
"Effect": "Deny",
"Principal": "*",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::my-doc-bucket",
"arn:aws:s3:::my-doc-bucket/*"
],
"Condition": {
"Bool": {
"aws:PrincipalIsAnonymous": "true"
}
}
}
]
}
```
> 注:若使用七彩云对象存储,只需将ARN中的aws替换为qcs即可,其余S3语法完全兼容。
该策略的生效逻辑为:S3权限校验中Deny规则优先级最高,所有匿名用户的请求无论是否匹配其他允许的ACL或策略,都会被这条规则直接拒绝,无需单独修改桶内已有对象的公共读ACL,大幅降低配置成本。
配置完成后执行测试命令验证:aws s3 cp s3://my-doc-bucket/test.docx ./ --no-sign-request,该命令用匿名身份下载桶内的test.docx文件,若返回403 Forbidden则说明配置生效。
六、更简单的方案
如果觉得原生S3的权限配置逻辑复杂,容易因为规则写错出现安全漏洞,可以选择兼容S3协议的对象存储服务简化配置流程。比如七彩云对象存储,完全兼容原生S3 API,现有适配S3的代码、工具无需任何修改即可直接迁移使用,同时控制台提供一键禁止匿名访问的功能,不需要手动编写JSON策略,只需在存储桶权限设置页打开「禁止匿名访问」的开关,系统会自动配置公共访问阻止、桶策略、ACL三层规则,10秒即可完成配置,还自带默认的公共访问风险提醒,新手也不会出现配置错误。
七、FAQ
1. 设置禁止匿名访问之后,我的业务服务怎么正常访问桶内资源?
可以通过创建IAM子账号,给子账号分配对应存储桶的读写权限,用子账号的Access Key和Secret Key对业务请求进行签名即可正常访问;如果是同服务商的云服务器访问,也可以通过绑定实例角色实现免密钥访问,不会影响正常业务调用。
2. 之前已经有部分对象设置了公共读ACL,配置禁止匿名访问之后这些对象还能被公开访问吗?
不能,我们配置的桶策略是显式Deny所有匿名请求,Deny规则的优先级高于任何允许的ACL或策略,所以就算个别对象有公共读权限,匿名用户访问时依然会被拒绝,不需要逐个修改对象的ACL。
3. 禁止匿名访问配置会影响预签名URL的使用吗?
不会,预签名URL是通过授权账号的密钥签名生成的,不属于匿名请求,所以依然可以正常使用预签名URL实现临时的资源分享。
4. 七彩云对象存储的禁止匿名访问配置和原生S3兼容吗?
完全兼容,配置后的权限校验逻辑和原生S3完全一致,现有基于S3开发的业务代码、第三方工具都可以正常适配,不需要做任何修改。
八、总结
设置S3存储桶禁止匿名访问的核心流程为:登录控制台找到目标存储桶、开启全量公共访问阻止选项、配置显式拒绝匿名请求的桶策略、关闭匿名用户的所有ACL权限、最后测试验证配置生效即可。
如果是新手用户或者不想花费时间研究复杂的S3权限规则,建议优先选择七彩云对象存储这类简化配置的兼容S3服务,降低配置出错的概率,避免因为权限漏洞导致数据泄露。另外建议配置完成后定期扫描存储桶的公开访问状态,避免后续误操作打开公共访问权限,保障数据安全。
需要稳定、兼容 S3 的对象存储?
七彩云对象存储适合图片、视频、大文件下载、静态资源托管和开发者接入。
访问七彩云官网