【问题标题】:User Specific Folder access to S3对 S3 的用户特定文件夹访问
【发布时间】:2021-10-01 16:47:15
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 您的应用程序如何允许用户访问文档?它是否通过AWS Security Token Service 向他们颁发临时凭据,并且他们在客户端或浏览器中使用这些凭据来访问来自 S3 的内容,您的应用程序是否只是提供指向 S3 内容的链接而不颁发临时 STS 凭据?
  • 我的应用程序将文档 url 存储在 MongoDb 集合中。而且,不,它不使用 AWS 安全令牌服务。

标签: node.js angular amazon-s3 mean-stack pre-signed-url


【解决方案1】:

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

选项 1:提供临时 AWS 凭证

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

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

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

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

选项 2:使用预签名 URL

在客户端是简单的网页直接使用 AWS 凭证调用 AWS 服务的情况下,安全性在后端使用 pre-签名的 URL。

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

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

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

【讨论】:

  • 嗨,约翰,感谢您的详细回答。我认为选项 1 对我的用例来说是一个更好的选择,因为我不希望 URL 过期,并且我希望用户能够在需要时查看他们的文档。另一方面,我的 MongoDb 位于 EC2 实例上,将限制入站/出站流量,以禁止从 mongo 客户端访问 mongodb(仅允许通过 ssh 访问),达到我的目的吗?
  • 渲染页面时,应在后端生成预签名 URL。因此,用户不应该看到过期的 URL,除非他们长时间打开页面,然后尝试点击链接。至于你的 Mongo 设置,我不太明白你的问题,所以我无法回答。
猜你喜欢
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
  • 2015-12-15
  • 2015-05-28
  • 2017-09-17
  • 2022-09-29
  • 1970-01-01
  • 2011-12-03
相关资源
最近更新 更多