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

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

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

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

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

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

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

这可以通过使用预先签名的URL来增强,这些URL是有时间限制的URL,可以访问存储在Amazon S3中的私人内容。 它是这样工作的:

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

预先签名的URL由以下部分组成:

  • 对所请求的对象的引用
  • 与具有访问对象权限的IAM(身份和访问pipe理)实体关联的访问密钥 – 例如,您可以创build具有必要权限的IAM用户,然后将这些访问凭据提供给您的应用程序
  • 预先签名的URL有效的到期时间戳
  • 一个encryption计算的签名 ,用于validation预先签名的URL是由拥有访问密钥的实体创build的(有效地,它validation密码并散列上述信息)

预先签名的URL可以通过几行代码创build,不需要调用AWS API。

底线:保持所有图像的私密性。 您的应用程序确认每个用户有权访问图像,然后生成URL以授予时间限制的访问权限。

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

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

通常我会build议用户为每个用户分配一个path前缀,这将允许您使用IAMangular色或创build预先签名的URL,并具有所需的精细访问控制,以便特定用户可以访问自己的空间。