假设我想创建一个简单版的Dropbox网站,您可以在其中注册并执行上传,下载,删除,重命名等文件的操作 - 非常类似于this question 。我想使用Amazon S3来存储文件。使用AWS SDK非常容易,除了一件事:安全性。
显然,不应允许用户A访问用户B的文件。我可以通过处理我的应用程序中的权限来添加“通过默默无闻的安全性”,但是拥有公共文件并依赖它是不够的,因为任何拥有正确URL的人都可以访问他们无法访问的文件。因此,我搜索并浏览了AWS文档以寻找解决方案,但我一直无法找到合适的解决方案。问题是我能找到的所有内容都与基于AWS账户的权限有关,而且我不适合创建数千名IAM用户。我考虑过IAM用户,存储桶策略,S3 ACL,预签名URL等。
我可以确实通过授权我的应用程序中的所有内容并在我的存储桶上设置权限来解决这个问题,这样只有我的应用程序才能访问这些对象,然后让用户通过我的应用程序下载文件。但是,这会增加我的应用程序的负担,我真的希望人们直接通过Amazon S3下载文件以利用其可扩展性。
有没有办法可以做到这一点?为了澄清,我想让我的应用程序中的给定用户只能访问Amazon S3中的一部分对象,而不会创建数千个IAM用户,这些用户的可扩展性不高。
答案 0 :(得分:0)
让用户在您的应用程序的帮助下下载文件,而不是通过您的应用程序。
将每个链接作为指向应用程序端点的链接。当每个请求进入时,评估用户是否有权下载文件。使用用户的会话数据对此进行评估。
如果没有,请返回错误响应。
如果是,请预先签署对象的下载URL,并使用非常短的到期时间(例如5秒),并使用302 Found
重定向用户的浏览器,并在Location:
中设置签名的URL响应标题。只要在签名URL到期之前启动下载,如果URL已经过期,则不会中断该下载。
如果与您的应用程序的连接以及签名URL的方案都是HTTPS,则可以非常低的资源成本为任何未经授权的下载提供高水平的安全性。