从 AWS S3 存储桶访问文件

Posted

技术标签:

【中文标题】从 AWS S3 存储桶访问文件【英文标题】:Accessing files from AWS S3 Bucket 【发布时间】:2020-06-15 23:12:51 【问题描述】:

我正在使用 NodeJS 将文件上传到我的 S3 存储桶中。作为回应,我收到了该文件的链接。

例如我收到https://my-bucket-name.s3.ap-south-1.amazonaws.com/testUpload_s.txt

该存储桶目前不允许公开访问。我应该如何安全地访问存储桶中的文件?我想知道下面的方法是否安全?

    允许对存储桶进行公共访问

    在上传过程中,每个文件都会被随机分配一个唯一的名称

    此文件名或响应 URL 存储在数据库中

    当必须提取文件时,我使用从 上传响应以从存储桶访问文件

这种方法安全吗?如果没有,还有其他方法可以做到吗?

【问题讨论】:

【参考方案1】:

有许多选项可以让客户端访问 S3 中的对象,包括:

    公开对象 要求客户端使用 AWS 凭证进行身份验证 为客户提供一个有时间限制的预签名 URL

它们各自服务于不同的用例。如果任何人都可以安全地访问该文件(例如,该文件是在公共网站上显示的图像),请使用 #1。如果客户端具有 AWS 凭证,请使用 #2。如果您不想公开文件但客户端没有 AWS 凭证,请使用 #3。注意 #3 预签名的 URL 是有时间限制的。

【讨论】:

那么如果我们考虑一个用户发布图片的社交平台,将对象公开并通过链接或文件名访问它是否安全?如果不是,这种情况下必须采用哪种方法? 只有您可以回答这个问题,因为这取决于您提供的服务的性质。如果用户通过服务知道他们发布的图像将公开可见,那么是的,将它们公开。如果他们希望它们是私有的,并且只对他们自己和他们明确与之共享的其他用户可见,则将它们设为私有并通过预签名 URL 共享。【参考方案2】:

您不需要存储 URL。您可以使用文件名查询 S3 存储桶中的对象。

对于从外部访问使用签名的 url。

https://docs.aws.amazon.com/sdk-for-go/v1/developer-guide/s3-example-presigned-urls.html

【讨论】:

你有关于如何从 NodeJS aws-sdk 为文件生成签名 url 的资源吗? 这是一个很好的例子***.com/questions/38831829/… 这是一个很好的例子...***.com/questions/38831829/…

以上是关于从 AWS S3 存储桶访问文件的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot Amazon AWS S3 存储桶文件下载 - 拒绝访问

只能从我的 ElasticBeanStalk 实例访问 AWS S3 存储桶

AWS S3 存储桶策略允许从特定 URL 的访问

如何使用aws java sdk将文件从S3存储桶从一个区域复制到另一个区域?

AWS CloudFront 拒绝访问 S3 存储桶

无需凭据即可从特定 IP 授予对 AWS S3 存储桶的访问权限