如何使用AWS Cognito限制对S3文件的访问?

我正在创建一个Web应用程序,该应用程序需要将S3存储桶中的大文件提供给用户以供下载。我们应用程序中的用户由Cognito授权。我想要一个带有文件的S3存储桶,以使某些Cognito用户只能下载某些文件。从我的研究中,我发现了几种方法。据我所知,这些似乎都不完全适合我的用例。

AWS允许Cognito用户允许S3存储桶。这是如此接近我所需要的,但实际上似乎并不可用。在我们应用程序的安全性方案中,Cognito登录属于组织。每个组织都在后端共享其所有数据。因此,我需要允许数据库定义的组织中的所有登录名都可以访问S3存储桶,而不是按名称登录用户。

从某种程度上来说,预签名的URL似乎是一个典型的用例,但我认为仍然不是我真正需要的。预先签名的URL将为我提供一个到期URL,供用户下载文件。很好,所以我可以给每个用户一个可能是用户自定义的URL,但是我可以在后端发出多个URL。但是我真的不希望URL过期,我希望它能永远持续下去。这不是什么大问题,因为永久URL可能是API端点,可以重定向到动态创建的预签名URL(可能在一分钟后到期)。但是该URL将允许拥有它的任何人访问。这与我们的安全性模型不符,该模型通过登录将URL限制为Cognito用户。如果该URL通过用户剪切和粘贴或数据包嗅探器发出,则似乎安全性下降了。确定URL已过期,但对于该项目而言似乎并不正确。

我考虑过的另一个选项是自己编写代码,方法是使API端点创建可下载的文件流,该文件流通过将S3对象也作为文件流访问而创建。它将文件读入内存并将其流式传输给用户。此安全性似乎完全符合我们的需求,因为该API端点当然可以验证Cognito用户的auth令牌。但是,从S3存储桶读取数据到我的后端,然后再读取给用户,这是不必要的网络流量,它可能会变慢,并且在后端过程中可能需要大量内存。

尽管有正确的用户权限限制,似乎要切断中间人并允许用户直接访问S3存储桶将是最佳解决方案。我可以找到以适合我的项目的最佳实践推荐方式完成此任务的任何项目或教程。我认为我的项目有一个非常普遍的用例。有更好的方法吗?

songkings 回答:如何使用AWS Cognito限制对S3文件的访问?

我见过应用程序解决此问题的一种方法是仅使用带有无法猜测的S3对象名称的完全公共的存储桶。例如,您可以将用户文件存储在s3://public-bucket/<secure hash>中,然后在响应中将其重定向到该对象的公共URL,以便现在用户可以直接从S3下载。由于S3不允许您列出对象,因此从理论上讲这是安全的,因为对象的随机名称类似于密码,因此需要确切知道访问文件的权限。而且,由于到S3的所有流量都是通过SSL进行的,因此该URL永远不会在传输过程中公开。

现在我个人觉得有点讨厌,因为与密码不同,文件的名称在浏览器历史记录中以及其他位置都可见,但是如果数据不是很敏感的话,这并不是世界上最糟糕的事情..

您提到的我不同意的一件事:

  

我考虑过的另一个选择是自己在代码中实现   制作一个API端点,该端点创建可下载的文件流,   通过将S3对象也作为文件流访问来创建。   ...   但是从S3存储桶读取到我的后端,然后转到   用户不需要的网络流量,可能会变慢,并且还需要   后端进程中可能有很多内存

在我看来,这可能是最好的解决方案(使用Web服务器作为中介),因为您可以完全控制应用程序逻辑,并且可以安然入睡,因为知道恶作剧和数据泄露的可能性较小。

我非常怀疑它在计算上会有很多开销。通过S3进行数据流传输应该很快并且使用很少的内存(您可以在t2.micro上进行传输,除非有大量请求,否则就可以了)。所有的Web框架都应允许您在HTTP响应中流式传输数据,因此您根本不需要大步入内存。我已经建立了类似的东西,无论如何,这从来都不是我的性能瓶颈。

本文链接:https://www.f2er.com/3141667.html

大家都在问