安全地从 S3 存储桶提供图像的架构

问题描述 投票:0回答:2

我正在构建一个小型网站,其中涉及用户上传稍后显示的图像。图像存储在 S3 存储桶中。

有时,我需要一次显示大量此类图像,并且我不确定如何最好地适应这种情况,而又不允许公众访问 S3。

目前,当向服务器发出请求时,服务器从 S3 下载对象,然后将文件返回给客户端 - 这是可以理解的缓慢。我希望能够返回 S3 URL 并从那里加载客户端(因此流量不必通过我的服务器,并且我不必等待从 S3-> 服务器下载图像->客户端,但我也不希望 S3 存储桶 URL 不安全且任何人都可以访问。

解决这个问题的最佳架构是什么?有没有办法给予人们对存储桶的非常短暂的临时许可?是否可以将其范围限制为特定网址?

我在 stackoverflow 和 github 上查找了类似的问题,但其中大多数似乎与文件的上传方式以及不安全地访问它们有关。

python amazon-web-services security amazon-s3 fastapi
2个回答
2
投票

按照 @jarmod 的建议,您可以对对象的 URL 进行预签名。

在这种情况下,一旦需要共享图像,您需要为该对象创建预签名 URL 并共享此 URL。

您的服务器只会提供 URL。用户将直接访问图像,而无需您的服务器参与请求。

AWS 网站解释了如何使用预签名 URL:


0
投票

执行此操作的最佳架构类似于 S3 前面的 CDN 或图像代理,允许对发送到客户端的 URL 进行签名,甚至可能进行加密。您希望通过下载并将其传递给客户端来避免发送整个文件,这是正确的。

请参阅 imgproxy,这是一个开源图像代理,可以调整图像大小、对图像 URL 进行签名和加密、从 S3 存储桶提供图像等。还有一些替代品也可以做类似的事情。

如果是我,我会使用服务器端实现来加密/签名 URL 并将其传递给客户端。我会在图像代理的响应上配置标头,以确定浏览器应缓存图像多长时间。

我发现这篇有用的博客文章描述了这种流程的基本设置。

© www.soinside.com 2019 - 2024. All rights reserved.