用户特定文件夹访问 S3

User Specific Folder access to S3

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

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

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

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

对于上述要求,我应该采用什么方法?任何代码 resources/docs 等.?

不应使用任何存储桶策略。应保留存储桶 'private' 并应通过以下两种方式之一向最终用户授予访问权限:

选项 1:提供临时 AWS 凭证

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

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

如果每个用户都有一个只授予对 'their sub-directory' 访问权限的策略,那么这就满足了他们 只能访问他们的特定文档 .[=13= 的要求]

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

选项 2:使用预签名 URLs

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

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

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

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