Amazon s3:“阻止公共访问”设置以允许使用签名 url 进行公共读取私有写入

Joh*_*ong 7 amazon-s3 amazon-web-services node.js express aws-sdk

在此处输入图片说明我想通过签名的网址上传图片。图像应仅具有公共读取访问权限。我对需要启用或禁用哪些设置感到困惑。

如果我禁用所有“阻止公共访问”设置,它会按预期工作。我担心的是 AWS 建议打开这些权限。图片显示了我提到的设置。

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

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

{
  "Version":"2012-10-17",
  "Statement":[
    {
      "Sid":"AddPerm",
      "Effect":"Allow",
      "Principal": "*",
      "Action":["s3:GetObject"],
      "Resource":["arn:aws:s3:::myapp/*"]
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

到“存储桶策略”设置以获得公共读取访问权限,但由于公共访问设置,我再次被拒绝访问。

拥有公共读取、私有写入访问权限的最安全方式是什么?我使用 S3 是一种意外的方式吗?我是否应该使用 CloudFront 服务来公开提供这些图像?

Mat*_*ava 11

S3 block public access 只是另一层保护,主要目的是防止您意外授予对存储桶/对象的公共访问权限。

access-denied您遇到的消息是由于上述S3 block public access功能导致您无法设置对存储桶/对象的公共访问权限(正是您尝试执行的操作)。

如果您的用例需要对 S3 对象进行公共访问并且您知道自己在做什么,那么您可以/需要禁用此功能(或至少一些基于您将如何授予访问权限的子选项)。示例是托管在 S3 上的公共网站,它明确要求您允许公众阅读。

设置对象访问权限的最佳方式是什么取决于您是否希望存储桶中的每个对象都可以公开读取。

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

{
  "Version":"2012-10-17",
  "Statement":[
    {
      "Sid":"AddPerm",
      "Effect":"Allow",
      "Principal": "*",
      "Action":["s3:GetObject"],
      "Resource":["arn:aws:s3:::myapp/*"]
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

如果只有一些对象应该是公开可读的,那么您有多种选择。

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

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

"Resource":["arn:aws:s3:::myapp/public/*"]
Run Code Online (Sandbox Code Playgroud)

第三个选项是使用对象 ACL 而不是存储桶策略。当正在上传的对象之间没有明显区别并且您想让上传对象的人决定该对象是否应该公开时,您需要选择此选项。如果您不需要在每个对象的情况下在公共和私有之间进行选择,那么您应该避免使用此选项,因为它是最难管理的选项,也是最容易忘记对象正在发生的事情的选项。

只有最后一个注意事项。如果您使用存储桶策略授予对对象的公共读取访问权限,则无需ACLs3params.

并回答您的问题:

我使用 S3 是一种意外的方式吗?

不,只要您打算这样做,就可以授予对您的存储桶/对象的公共读取访问权限。这些额外的保护层之所以存在是因为 S3 存储桶也用于存储高度机密的数据,并且根据存储在其中的数据的性质,有时有人会无意中更改可能造成巨大损害的设置。因此,公共云提供商正试图让为其数据存储设置公共访问变得更加困难,以便更改此设置不会是错误的,而应该是明智的决定。

我是否应该使用 CloudFront 服务来公开提供这些图像?

CloudFront 为您提供了一些不错的功能,例如 AWS 网络边缘的额外保护和缓存,但绝对不是必须使用它,而且由于它不是免费服务,我建议在选择使用它之前仔细研究它,以便你不会无意义地浪费你的资源(钱)。