首页 > 解决方案 > 对 S3 的用户特定文件夹访问

问题描述

我有一个应用程序,用户可以在其中上传他们的文档(假设某些文档是敏感文档,例如 ID 证明)。我的 S3 存储桶结构是这样的,每个用户都有自己的文件夹,其中保存了他/她的文档。

应用程序在 MEAN 堆栈上运行。

截至目前,存储桶是公开的。(敏感文件上传是未来的补充)。

我希望登录用户只能访问他/她的文档。此外,文档 URL 应该是安全的。(可能是预签名的 URL)

对于上述要求,我应该采取什么方法?任何代码资源/文档等..?

标签: node.jsangularamazon-s3mean-stackpre-signed-url

解决方案


不应使用任何存储桶策略。存储桶应保持“私有”,并应通过以下两种方式之一授予最终用户访问权限:

选项 1:提供临时 AWS 凭证

如果有“智能”客户端(例如移动应用程序或浏览器中的 JavaScript),您的后端可以使用AWS Security Token Service生成临时凭证。然后,客户端可以使用这些凭证直接与 AWS 服务对话,例如访问 Amazon S3 中的对象以及读取/写入 DynamoDB 中的数据。

后端负责对用户进行身份验证、生成临时凭证并将其传递给客户端,但不参与对 AWS 的后续调用。可以将策略附加到这些临时凭证以授予权限,例如“允许来自此 Amazon S3 存储桶的此特定子目录(路径)的 GetObject”。

如果每个用户都有一个只允许访问“他们的子目录”的策略,那么这符合您的要求,即他们只能访问他们的特定文档

实现上述内容的一种常见方法是使用Amazon Cognito进行身份验证和分配权限。

选项 2:使用预签名 URL

在客户端是不直接使用 AWS 凭证调用 AWS 服务的简单网页的情况下,安全在后端使用预签名 URL 进行处理。

当后端生成链接到私有对象(例如 via )的网页时,<img src='...'>后端应该:

  • 验证用户是否有权访问私有对象
  • 生成Amazon S3 预签名 URL,这是一个提供对私有对象的临时访问的限时 URL
  • 将该 URL 插入 HTML 页面,或将其作为链接提供(例如到 PDF)
  • 当用户的浏览器使用该 URL 向 S3 请求对象时,S3 服务将验证签名以确认用户有权访问私有对象且未超过到期时间
  • 如果签名被确认,S3 将回传私有对象

此方法使后端可以完全控制用户可以访问 S3 中的哪些对象。它可以在数据库中维护这个列表,或者它可以依赖对象的路径来确定这个访问。这甚至可以扩展到允许用户之间共享对象。例如,想象一个照片共享应用程序,其中用户想要与另一个用户共享照片。他们可以通过 UI 指示这一点,后端可以将其存储在数据库中。稍后,当用户想要查看共享照片时,后端会检查数据库以确认其权限,然后生成预签名 URL 以查看共享对象,即使它位于不同的路径中。


推荐阅读