【问题标题】:AWS S3 Per Bucket Permission for non-AWS accounts非 AWS 账户的 AWS S3 每个存储桶权限
【发布时间】:2022-01-26 19:57:21
【问题描述】:

这个问题和Is it possible to give token access to link to amazon s3 storage?思路一致。

基本上,我们正在构建一个应用程序,用户组可以在其中保存图片,这些图片应该只对他们自己的组可见。 我们正在考虑为每个用户组使用一个文件夹,或者甚至可以为每个用户组使用一个独立的 S3 存储桶。

规则很简单:

  • A 组的任何成员都应该能够将图片添加到 A 组文件夹(或存储桶)
  • A 组的任何成员都应该能够读取 A 组文件夹(或存储桶)的所有图片
  • A 组的任何成员都不应访问任何图片

但是,上面提到的帖子使用的解决方案(临时预签名 URL)不可用,因为我们需要客户端能够在他的存储桶上写入文件以及读取他的存储桶上的文件,而无需对任何其他存储桶的任何访问。文件写入部分是这里的难点,也是我们不能使用预签名 URL 的原因。

此外,我们阅读的各种 AWS 安全帖子(例如 https://aws.amazon.com/blogs/security/writing-iam-policies-grant-access-to-user-specific-folders-in-an-amazon-s3-bucket/)中的解决方案并不适用,因为它们展示了如何控制对其他 AWS 账户的 IAM 组的访问。在我们的例子中,一组用户没有 IAM 帐户...

到目前为止,我们看到的唯一解决方案是不安全或浪费的

  • 向所有人开放存储桶并依靠混淆文件夹/存储桶名称(许多安全问题,包括暴力破解和读取/覆盖任何人的文件的能力)
  • 有一个后端充当应用程序和 S3 之间的外观,验证访问。 S3 没有公共访问权限,存储桶仅对后端具有的 IAM 角色开放。然而,这是对带宽的极大浪费,因为所有数据都将在该后端的 EC2 实例上传输

有更好的解决方案吗? S3 可以实现这种自定义访问吗?

【问题讨论】:

  • 不,后端将是这样做的方式。为直接匿名上传打开存储桶是一种糟糕的安全做法。
  • 请勿通过上传公开存储桶,需要一天时间才能找到它们。 CapitalOne 就是一个很好的例子:Capital One Breach: Is Your AWS Environment Just as Susceptible?。最简单的方法是将 Cognito 与 Lambda 连接起来并以这种方式上传。或者为用户提供每个存储桶的 IAM 角色,并让他们使用 SAML 登录。
  • “(临时预签名 URL)不可用” ... 为什么不呢?后端可以根据应用程序特定的用户身份验证生成预签名帖子或获取 URL。
  • 别担心,出于安全原因,我们不打算公开存储桶,如帖子中所述!关于上传文件的预签名 URL,我认为它不起作用的原因是因为要获得 S3 对象的预签名 URL,您需要....一个 S3 对象。因此,我认为没有办法在没有文件的情况下生成预签名的 URL 来执行 PUT。一个看起来非常骇人听闻的解决方案的选项是让后端预先创建该文件的假版本,然后创建预签名的 URL 以在应用程序中使用。但是,如果应用从不上传怎么办...
  • 经过更多阅读后,似乎虽然 AWS UI 需要 S3 对象已经存在才能生成预签名 URL,但使用 API 似乎是可能的 (medium.com/@aidan.hallett/…)

标签: amazon-web-services amazon-s3


【解决方案1】:

实现目标的正确方法是使用Amazon S3 pre-signed URLs,它们是提供对私有对象的临时访问的限时 URL。

你也可以Upload objects using presigned URLs - Amazon Simple Storage Service

流程基本上是:

  • 用户对您的后端应用进行身份验证
  • 当用户想要访问私有对象时,后端会验证他们是否被允许访问该对象(使用您自己的业务逻辑,例如您提到的组)。如果他们被允许访问该对象,后端会生成一个预签名的 URL。
  • 将预签名的 URL 返回给用户的浏览器,例如将其放入 <img src="..."> 标记中。
  • 当用户的浏览器请求对象时,S3 验证预签名 URL 中的签名。如果它是有效的并且时间段没有过期,S3 提供请求的对象。 (否则返回Access Denied。)

用户上传对象时使用类似的过程:

  • 用户对您的后端应用进行身份验证
  • 他们请求上传文件的机会
  • 您的后端应用会生成一个 S3 预签名 URL,该 URL 包含在用于上传的 HTML 页面中
  • 您的后端应跟踪数据库中的对象,以便知道谁执行了上传并跟踪允许谁访问该对象(例如特定用户或组)

您的后端应用全权负责决定特定用户是否可以上传/下载对象。然后,它通过预签名的 URL 将实际的上传/下载过程移交给 S3。这减少了服务器上的负载,因为所有上传/下载都直接进出 S3。

【讨论】:

    猜你喜欢
    • 2019-06-28
    • 2022-01-03
    • 2018-10-12
    • 1970-01-01
    • 1970-01-01
    • 2017-07-21
    • 2019-05-10
    • 1970-01-01
    • 2012-02-22
    相关资源
    最近更新 更多