Amazon s3:"Block public access" 设置允许 public 使用签名 url 读取私有写入

Amazon s3: "Block public access" settings to allow for public read private write with signed url

我想通过已签名的 url 上传图片。图像应仅具有 public 读取权限。我对需要启用或禁用哪些设置感到困惑。

如果我禁用所有 "Block public access" 设置,它将按预期工作。我担心的是 AWS 建议打开这些权限。图片显示我提到的设置。

  const s3 = new aws.S3();
  const s3Params = {
    Bucket: process.env.S3_BUCKET,
    Key: fileName,
    Expires: 60,
    ContentType: fileType,
    ACL: 'private'
  };

当我将 "ACL" 设置为 "private" 时,我可以在客户端上传带有签名 url 的图像,但如果我使用 "public-read",我得到拒绝访问。我也尝试添加

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

到 "Bucket Policy" 设置以获得 public 读取权限,但由于 public 访问设置,我再次被拒绝访问。

获得 public 读取、私有写入访问权限的最安全方式是什么? 我使用 S3 是一种意想不到的方式吗? 我是否应该使用 CloudFront 服务来提供这些图像 publicly?

S3 block public access 只是另一层保护,主要目的是防止您意外授予 public 对 bucket/objects.

的访问权限

您遇到的 access-denied 消息是由于提到的 S3 block public access 功能导致您无法设置 public 访问您的 bucket/objects(正是您尝试做)。

如果您的用例需要 public 访问 S3 对象并且您知道自己在做什么,那么您 can/need 禁用此功能(或至少禁用某些 sub-options基于您将如何授予访问权限)。示例是托管在 S3 上的 public 网站,它明确要求您允许 public 读取。

设置对象访问权限的最佳方式取决于您是否希望存储桶内的每个对象都public可读。

如果每个对象都应该 public 可读,那么实现这一点的最简单方法是通过存储桶策略 - 您已包含在 post 中的那个。

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

如果只有部分对象应该public可读,那么您有多种选择。

第一个选项可能是最容易实现的 - 为私有对象和 non-private 对象创建单独的存储桶。如果可能,这通常是首选方式,因为您可以将机密数据与 public 数据分开处理,并且最不容易出错。

第二种选择是在单个存储桶中创建单独的文件夹,其中一个文件夹可以保存机密数据,另一个文件夹可以保存 public 数据。然后您可以再次使用存储桶策略并仅添加对特定文件夹的读取权限。

"Resource":["arn:aws:s3:::myapp/public/*"]

第三个选项是使用对象 ACL 而不是存储桶策略。当正在上传的对象之间没有明确的区别并且您想让正在上传对象的人决定对象是否应该是 public 时,您需要选择此选项。如果您不需要在 public 和 private on per object case 之间做出选择,那么您应该避免使用此选项,因为它是最难管理的选项,也是最容易忘记对象正在发生的事情的选项。

最后一个音符。如果您使用存储桶策略授予对对象的 public 读取访问权限,则无需在 s3params.

中指定 ACL

并回答您的问题:

Am I using S3 is an unintended way?

不,授予 public 对您的 bucket/objects 的读取权限完全没问题,只要您有意这样做。这些额外的保护层之所以存在,是因为 S3 存储桶也用于存储高度机密的数据,有时,有人会无意中更改设置,这可能会造成巨大的损害,具体取决于存储在其中的数据的性质。因此,public 云提供商正在努力让设置 public 对其数据存储的访问变得更加困难,以便更改此设置不会被错误地做出,而是应该做出明智的决定。

Am I suppose to use the CloudFront service to serve these images publicly?

CloudFront 为您提供了一些很好的功能,例如在 AWS 网络边缘的额外保护和缓存,但绝对不是强制使用它,并且由于它不是一项免费服务,我建议您先仔细研究一下选择使用它,这样您就不会毫无意义地浪费您的资源(金钱)。