如何配置AWS S3仅允许应用已认证用户访问,关闭公共访问?
解决S3私有存储桶与Firebase认证用户访问的方案
1. 先彻底关闭S3公共访问
首先确保存储桶完全私有,消除公共访问风险:
- 登录AWS S3控制台,选中目标存储桶,进入「权限」标签页
- 找到「阻止公共访问(存储桶设置)」,勾选全部4项阻止规则并保存
- 阻止新的公共ACL和上传公共对象
- 移除通过任何ACL授予的公共访问权限
- 阻止新的公共存储桶策略
- 阻止公共和跨账户访问(若存储桶策略允许)
2. 基于Firebase认证实现授权访问
因为你的用户通过Firebase完成认证,推荐两种安全方案:
方案一:通过后端生成S3预签名URL(推荐,低复杂度)
这是最易维护的方式,所有S3操作都通过你的后端中转,前端不直接持有AWS凭证:
- 流程逻辑:
- 用户上传图片:前端先向你的后端(比如Firebase Cloud Functions)发起请求,后端验证用户Firebase身份后,生成S3预签名上传URL返回给前端,前端用该URL直接上传图片到S3
- 用户查看图片:前端请求后端获取目标图片的预签名下载URL,后端验证用户身份后生成URL返回,前端通过该URL加载图片
- 用户删除图片:前端请求后端,后端验证用户身份(确认是图片所有者)后,调用S3 API删除对应图片
- 权限配置:给后端服务(比如Cloud Functions的服务账号)配置IAM权限,允许对S3存储桶执行
s3:GetObject、s3:PutObject、s3:DeleteObject操作
方案二:Firebase认证换取AWS临时凭证(适合无后端场景)
如果想让前端直接访问S3,可通过OIDC身份提供商实现:
- 步骤:
- 在AWS IAM中创建OIDC身份提供商,地址填
https://securetoken.google.com/你的Firebase项目ID - 创建IAM角色,信任策略设置为仅允许Firebase认证用户访问,同时给角色添加精细的S3权限:
- 允许所有注册用户执行
s3:GetObject(针对所有图片路径,或按业务需求限制) - 仅允许用户对
user/{uid}/*路径执行s3:PutObject和s3:DeleteObject(确保用户只能操作自己的图片)
- 允许所有注册用户执行
- 前端用户登录后,从Firebase获取ID Token,调用AWS STS的
AssumeRoleWithWebIdentity接口,换取临时AWS凭证 - 前端用临时凭证直接调用S3 API完成图片操作
- 在AWS IAM中创建OIDC身份提供商,地址填
3. 优化建议:按用户ID规划存储路径
将图片按user/{用户UID}/{图片文件名}的结构存储,这样能更精准地控制权限,比如限制用户只能访问自己路径下的内容,避免越权操作。
4. 不推荐使用ACL
ACL属于老旧的权限控制方式,易出现配置混乱,AWS官方推荐用桶策略和IAM角色管理权限,所以尽量不要依赖ACL来实现用户访问控制。
内容的提问来源于stack exchange,提问作者Farid SISSINHO
相关产品推荐
相关产品推荐

