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

Posted

技术标签:

【中文标题】Amazon s3:“阻止公共访问”设置以允许使用签名 URL 进行公共读取私有写入【英文标题】:Amazon s3: "Block public access" settings to allow for public read private write with signed url 【发布时间】:2019-11-18 05:54:50 【问题描述】:

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

如果我禁用所有“阻止公共访问”设置,它会按预期工作。我担心的是 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/*"]
    
  ]

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

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

【问题讨论】:

【参考方案1】:

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

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

并回答您的问题:

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

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

我想使用 CloudFront 服务来提供这些图像吗 公开?

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

【讨论】:

非常感谢您的详细回答!

以上是关于Amazon s3:“阻止公共访问”设置以允许使用签名 URL 进行公共读取私有写入的主要内容,如果未能解决你的问题,请参考以下文章

我应该如何在 Amazon S3 上配置“阻止公共访问”?

阻止公共访问设置的哪些组合使我的 s3 存储桶对所有人可见?

Amazon Web Services:设置 S3 策略以允许 putObject 和 getObject 但拒绝 listBucket

使用 Amazon S3 阻止公有访问

令人困惑的 s3 存储桶策略上传问题

允许搜寻器访问其他帐户中的Amazon S3存储桶