如何安全地配置 s3 以访问网站

How to securely configure s3 for website access

我想安全地设置一个 s3 存储桶,但要提供 public 对图像、pdf、文档等网站资产的访问权限。似乎没有一种简单的方法可以做到这一点。

我已经尝试设置一个启用了阻止 Public 访问权限的新存储桶。我认为这是保护存储桶的最佳方式,但无法在此存储桶中启用 viewing/downloading 个文件。

我希望能够从浏览器 view/download 网站文件,但总是收到拒绝访问错误。

默认情况下,Amazon S3 存储桶中的所有内容都是私有的。

如果您希望 public 访问内容,可以通过以下几种方式完成:

  • 桶级别通过提供桶策略:这是提供对整个桶或部分桶的访问的理想选择一个水桶。
  • 对象级别 通过使用访问控制列表 (ACL):这允许在逐个对象的基础上进行细粒度控制。
  • 选择性地,通过创建 预签名 URL:这允许您的应用程序确定是否应允许特定应用程序用户访问

所有三种方法都允许通过 URL 访问 Amazon S3 中的对象。这与使用 AWS 凭据对 Amazon S3 进行 API 调用完全不同,这将允许在用户级别进行控制。

根据您的描述,存储桶策略似乎最能满足您的需求,例如:

{
  "Version":"2012-10-17",
  "Statement":[
    {
      "Sid":"PublicPermission",
      "Effect":"Allow",
      "Principal": "*",
      "Action":["s3:GetObject"],
      "Resource":["arn:aws:s3:::my-bucket/*"]
    }
  ]
}

这就是说:允许任何人从我的桶中获取对象

注意policy指定允许哪些调用,所以可以允许上传、下载、删除等,在上面的例子中,只允许GetObject,也就是说objects可以[=64] =] 但未上传、删除等

资源中的 /* 允许通过在 存储桶中指定路径 来进一步控制,因此可以仅授予对存储桶的一部分的访问权限.

使用存储桶策略时,还需要停用阻止 Public 访问 设置以允许使用存储桶策略。这是一个额外的保护层,可确保存储桶不会意外 public 可访问。

另一方面,如果您的实际目标是保持内容的私密性但有选择地将其提供给应用程序用户,那么您可以使用 预签名 URL.一个例子是照片网站,人们可以在其中查看他们的私人照片,但这些照片 public 不可访问。

这将通过让用户对应用程序进行身份验证来处理。然后,当他们希望访问照片时,应用程序会确定他们是否允许查看照片。如果是这样,应用程序将生成一个 pre-signed URL 以授予对对象的临时访问权限。一旦过期,link 将不再有效。