用于提供私人文件的AWS S3实施

用于提供私人文件的AWS S3实施

问题描述:

用例:我们正在开发一个Web应用程序,并且客户请求我们使用AWS S3来存储图像。在应用程序中,每个人都将拥有自己的帐户并上传自己的图片,一些上传的图片将公开。用于提供私人文件的AWS S3实施

根据我的理解,我们可以通过使用预先链接的URL来实现此目的,以上载图像。但是我面临的问题是,如何限制对其他用户的图像访问。

+1

你应该给每个登录的用户的唯一签署的预网址所以只有他们可以访问的图像。 – samayo

有两种使用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给予时间限制的访问。

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

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

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