【问题标题】:AWS S3 implementation for serving private files用于提供私有文件​​的 AWS S3 实施
【发布时间】:2018-04-24 12:43:11
【问题描述】:

用例:我们正在开发一个 Web 应用程序,客户要求我们使用 AWS S3 来存储图像。在应用程序中,每个人都将拥有自己的帐户并上传自己的图片,其中一些上传的图片将是公开的。

据我了解,我们可以通过使用预先设置的 URL 来上传图片来实现这一点。但我面临的问题是,如何限制其他用户访问图像。

【问题讨论】:

  • 您应该为每个登录用户提供一个唯一的预签名 URL,以便只有他们可以访问图像。

标签: node.js amazon-web-services amazon-s3


【解决方案1】:

使用 Amazon S3 有两种基本方法:

  • 仅将其用作存储介质,只能由您的应用程序访问,或者
  • 使用它直接向最终用户提供内容

在第一种情况下,只有您的应用程序可以访问存储在 S3 中的数据/文件。它必须检索内容并将其提供给用户。这是用于 Web 服务器的传统方法。

在第二种情况下,您可以生成包含对存储在 S3 中的文件的引用的 HTML 页面。例如,如果图像出现在网页中,src= 参数将指向 Amazon S3 URL。然后从 S3 提供该文件,而无需通过您的 Web 服务器。

这可以通过使用预签名 URL 来增强,预签名 URL 是限时 URL,提供对存储在 Amazon S3 中的私有内容的访问。它的工作原理是这样的:

  • 文件存储在 S3 中并保持私密(意味着不允许访问)
  • 您的应用程序完全负责确定哪些用户可以访问哪些文件
  • 当应用程序希望授予用户访问权限时(例如,他们可能想查看自己的照片),它会生成一个预签名 URL 并将其包含在 HTML 页面中
  • 当用户的网络浏览器使用预签名 URL 访问内容时
  • Amazon S3 接收请求,验证预签名 URL 上的签名和时间戳,如果获得批准,则提供文件以响应请求

预签名 URL 包括:

  • 对请求的对象的引用
  • 与有权访问对象的 IAM(身份和访问管理)实体关联的 访问密钥 - 例如,您可以创建一个具有必要权限的 IAM 用户,然后向您的应用程序提供这些访问凭据
  • 一个到期时间戳,在此之前预签名 URL 有效
  • 一种加密计算的签名,用于验证预签名 URL 是否由拥有访问密钥的实体创建(实际上,它会验证密码并对上述信息进行哈希处理)

预签名 URL 只需几行代码即可创建,无需调用 AWS API。

底线:将所有图片保密。您的应用程序会确认每个用户即时访问图像的权利,然后生成 URL 以授予限时访问权限。

【讨论】:

    【解决方案2】:

    如果您计划实施细粒度的访问控制,您可以采用多种方法。作为第一步,您需要为每个用户提供独特的空间来上传内容。这可以是存储桶中的存储桶或路径前缀(您将其视为目录)。

    一般来说,我建议为每个用户使用路径前缀对用户空间进行分区,这将允许您使用 IAM 角色或创建具有所需细粒度访问控制的预签名 URL,以便特定用户可以访问他们自己的空间。

    【讨论】:

      【解决方案3】:

      您可以使用签名的 url 和签名的 cookie 来提供私人内容。如果您无法更改应用程序,则使用私人链接可能不可行,签名的 cookie 可以提供帮助。此外,CloudFront 提供了进一步的安全性和效率改进,请查看http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/PrivateContent.html 的文档

      【讨论】:

        猜你喜欢
        • 2019-02-19
        • 1970-01-01
        • 1970-01-01
        • 2021-07-07
        • 2018-11-16
        • 1970-01-01
        • 2016-08-27
        • 2020-01-15
        • 2017-08-08
        相关资源
        最近更新 更多