亚马逊S3下载身份验证

21

我在Amazon S3中创建了一个存储桶,上传了2个文件并将它们设为公开。 我有链接可以从互联网上的任何地方访问它们。 现在我想对可以下载文件的人进行一些限制。 有人可以帮我吗?我尝试过文档,但被搞糊涂了。

我希望在使用公共链接下载时,它会要求某些凭据或其他方式来验证用户。这可能吗?

2个回答

33

默认情况下,Amazon S3中的所有对象都是私有的。您可以添加权限以使人们可以访问您的对象。这可以通过以下方式完成:

  • 单个对象上的访问控制列表权限
  • 存储桶策略
  • IAM用户和组
  • 预签名URL

只要这些方法中至少有一种授予权限,您的用户就可以从Amazon S3访问对象。

1. 单个对象上的访问控制列表

在Amazon S3管理控制台中的“公开”选项会向所有Internet用户授予打开/下载权限。这可以用于授予特定对象的公共访问权限。

2. 存储桶策略

可以使用存储桶策略来授予整个存储桶或存储桶的一部分的访问权限。还可以用它来指定访问限制。例如,策略可以将存储桶中特定目录对特定IP地址范围、特定时间的用户公开,并且仅在通过SSL访问存储桶时才公开。

存储桶策略是一种良好的方式,用于在不必为每个单独对象指定权限的情况下授予许多对象(例如特定目录)的公共访问权限。这通常用于从S3存储桶提供的静态网站。

3. IAM用户和组

这类似于定义存储桶策略,但是将权限分配给特定用户或用户组。因此,只有这些用户有权访问对象。当访问对象时,用户必须进行身份验证,因此最常用于通过AWS API访问对象,例如使用AWS命令行界面(CLI)中的aws s3命令。

用户在调用API时,不需要弹出验证窗口,而是必须提供身份验证信息。一种简单的方法是将用户凭据存储在本地配置文件中,当CLI调用S3 API时,自动使用。

4. 预签名URL

预签名URL可用于授予对S3对象的访问权限,作为“覆盖”访问控制的一种方式。通过追加到URL中的到期时间和签名,可以访问通常私有的对象。这是一种非常好的方法,可以在不需要Web服务器的情况下提供私有内容。

通常,应用程序在希望授予对象访问权限时构造预签名URL。例如,假设您有一个照片共享网站,用户已经通过您的网站进行了身份验证。现在,您希望在Web页面中显示他们的照片。这些照片通常是私有的,但您的应用程序可以生成预签名URL,授予它们访问照片的临时权限。预签名URL将在特定日期/时间后过期。


在预签名 URL 的方法中,如果有人监听我们的请求 URL 并在路由器或其他地方获取 URL,那么他现在就可以访问数据!我们应该如何处理这种情况(甚至我们需要吗)?想象一下,如果请求的负载中包含身份验证令牌,现在它可能已经被处理了。 - meshkati
1
请不要在旧问题的评论中提问,而是提出一个新的问题。然而,答案是......如果您通过HTTPS进行通信,则消息内容将无法被读取。 - John Rotenstein
小心!默认情况下,桶是使用公共访问权限创建的!! - MikeW
@MikeW 默认情况下,存储桶并不会“使用公共访问”创建。 - John Rotenstein
你必须显式地将 @BlockXXX 设置为 TRUE。 https://docs.aws.amazon.com/zh_cn/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket-publicaccessblockconfiguration.html - MikeW
@MikeW 不管“阻止公共访问”设置如何,只有分配了授予公共访问权限的 Bucket Policy 的存储桶才是公共的。 - John Rotenstein

0
关于预签名URL,签名在请求头中,因此应该在HTTPS/TLS加密内。但请自行检查。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接