【问题标题】:How can I use AWS Cognito to restrict access to S3 files?如何使用 AWS Cognito 限制对 S3 文件的访问?
【发布时间】:2020-03-04 12:16:30
【问题描述】:

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

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

在某种程度上,预签名 URL 似乎是一个典型的用例,但我认为仍然不是我真正需要的。预签名 URL 将为我提供一个过期 URL,供用户下载文件。很好,所以我可以给每个用户一个可能是用户自定义的 URL,但我可以在我的后端发出几个。但我真的不希望 URL 过期,我希望它永远存在。这不是什么大问题,因为永久 URL 可能是一个 API 端点,它重定向到动态创建的预签名 URL,该 URL 可能会在一分钟内到期。但是该 URL 将允许任何拥有它的人访问。这不符合我们通过登录将 URL 限制为 Cognito 用户的安全模型。如果该 URL 通过用户剪切和粘贴或者可能是数据包嗅探器而泄露,那么安全性似乎就会崩溃。确实该 URL 已过期,但它似乎并不完全适合该项目。

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

似乎切断中间人并允许用户直接访问 S3 存储桶(尽管有正确的用户权限限制)将是最佳解决方案。我只是可以找到以适合我项目的最佳实践推荐方式执行此操作的任何项目或教程。我认为我的项目有一个非常常见的用例。有没有更好的方法来做到这一点?

【问题讨论】:

  • 你的问题最后解决了吗?
  • 我刚刚以中间人的身份通过我的 HTTPS API。

标签: amazon-web-services amazon-s3 amazon-cognito pre-signed-url


【解决方案1】:

我见过应用程序解决此问题的一种方法是仅使用具有不可猜测的 S3 对象名称的完全公共存储桶。例如,您可以将用户文件存储在s3://public-bucket/<secure hash> 中,然后在响应中将它们重定向到该对象的公共 URL,这样现在用户就可以直接从 S3 下载了。因为 S3 不允许您列出对象,所以这在理论上是安全的,因为对象的随机名称有点像密码,需要准确知道才能访问文件。而且因为所有到 S3 的流量都通过 SSL,所以 URL 永远不会在传输过程中暴露。

现在我个人觉得这有点恶心,因为与密码不同,文件名可以在浏览器历史记录和其他地方看到,但如果数据不是很敏感,这可能不是世界上最糟糕的事情..

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

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

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

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

【讨论】:

  • “理论上安全”在这里的使用意味着“通过默默无闻的安全”,我不太喜欢。我什至不会称它为理论上安全的。我也不确定我们是否不同意你所说的我们不同意的内容。我认为这是我目前最好的解决方案。当然,额外的内存、网络流量和 CPU 使用率可能可以忽略不计并且值得。但我认为与用户直接访问 S3 存储桶相比,它增加了 CPU/内存/网络资源使用率的说法,我认为很难不同意。
  • 对,我说它不会有太多开销,而不是零开销。正如您所说,这是在大大改善控制和安全性的合理成本之间进行权衡。此外,我描述的方案不是通过隐匿方案实现的安全性,即使您知道系统是如何工作的,您也不能只发现 URL。像 Slack 这样的真实应用程序已经使用这种不可猜测的 URL 方案来提供文件 (ibuildings.nl/blog/2015/11/…),所以如果按照该链接讨论的那样正确实施,它还不错
猜你喜欢
  • 2017-07-22
  • 2016-11-23
  • 1970-01-01
  • 2020-09-27
  • 2020-08-05
  • 2019-07-08
  • 2017-12-22
  • 2017-09-17
  • 2021-12-05
相关资源
最近更新 更多