用于提供私人文件的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,并具有所需的精细访问控制,以便特定用户可以访问自己的空间。