Amazon s3:“阻止公共访问”设置,以允许公共访问带有签名URL的私有写入

时间:2019-07-08 17:07:05

标签: node.js amazon-web-services express amazon-s3 aws-sdk

enter image description here我想通过签名的URL上传图像。这些图像应仅具有公共读取权限。我对启用或禁用哪些设置感到困惑。

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

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

当我将“ ACL”设置为“私有”时,我可以使用签名的URL将图像上传到客户端,但是如果我使用“公共读取”,则会出现访问被拒绝的情况。我也尝试添加

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

进入“ Bucket Policy”设置以获取公共读取权限,但由于公共访问设置,我再次获得“访问被拒绝”。

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

1 个答案:

答案 0 :(得分:2)

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/*"]
    }
  ]
}

如果只应该公开一些对象,那么您有几种选择。

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

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

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

第三种选择是使用对象ACL而不是存储桶策略。如果要上传的对象之间没有明显的区别,并且要让上传对象的对象决定对象是否公开,则需要使用此选项。如果不需要根据每个对象的情况在公共和私有情况之间进行选择,则应避免使用此选项,因为它是最难管理的对象,也是最容易跟踪对象运行情况的最简单方法。

最后一个音符。如果您正在使用存储桶策略来授予对对象的公共读取访问权限,则无需在ACL中指定s3params

并回答您的问题:

Am I using S3 is an unintended way?

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

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

CloudFront为您提供了一些不错的功能,例如额外的保护和AWS网络边缘的缓存,但是绝对不是强制性使用它,并且由于它不是免费服务,因此我建议您在选择以下内容之前仔细研究一下使用它,以免浪费资源(金钱)。