JS 上传的 AWS S3 bucket 项目只能从 Heroku 应用程序访问(已编辑)

JS 上传的 AWS S3 bucket 项目只能从 Heroku 应用程序访问(已编辑)

好的,我发现我最初遇到的问题,即存储桶中的每个项目都获得公共 ACL,这不是因为我的策略,而是因为我acl:public-read在上传时使用了 JavaScript 上传的预签名 URL。但我不想这样。我希望 heroku 应用程序能够访问照片,但不能访问世界其他地方。这可以在 Rails 中实现吗?预签名 URL 的概念可以用于访问和上传吗?我为上传设置了 CORS,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
    <AllowedOrigin>http://mylocalhost</AllowedOrigin>
    <AllowedOrigin>http://www.myherokuapp.com</AllowedOrigin>
    <AllowedMethod>PUT</AllowedMethod>
    <AllowedMethod>POST</AllowedMethod>
    <AllowedMethod>DELETE</AllowedMethod>
    <MaxAgeSeconds>3000</MaxAgeSeconds>
    <ExposeHeader>ETag</ExposeHeader>
    <ExposeHeader>x-amz-server-side-encryption</ExposeHeader>
    <ExposeHeader>x-amz-request-id</ExposeHeader>
    <ExposeHeader>x-amz-id-2</ExposeHeader>
    <AllowedHeader>*</AllowedHeader>
    <AllowedHeader>x-amz-acl</AllowedHeader>
</CORSRule>
</CORSConfiguration>

将 GET 添加到我的 CORS 中是否可以解决我的问题?当嵌入到网页中时,它是否会将照片的原始请求视为来自 heroku?还是来自浏览器?

------- 老问题 -----

我有一个 AWS S3 存储桶,我想将其保密,但通过我的 Heroku 应用程序才能访问。唯一的访问应该是来自 IAM 用户或使用预签名 URL 的 CORS 上传。存储桶中已经有一堆图像。这些是在 ACL 设置为 Public:READ 时上传的。我想撤消该操作,但首先我需要一个允许我的 Heroku 应用程序访问存储桶中每张图片的策略。所以我的目标是:

1)删除 bucket 中所有子项的 Public ACL

2)设置一个拒绝所有存储桶权限,然后允许我的根用户和我的 heroku IAM 用户(已设置)的所有访问。

我有一个存储桶策略:

{
  "Id": "Policy1525547050154",
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmt1525546474878",   
      "Action": "s3:*",
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::my-bucket",
      "Principal": {
        "AWS": [
          "arn:aws:iam::xxxxxxxxxxx:user/heroku-app"
        ]
      }
    },
    {
      "Sid": "Stmt1525547042878",
      "Action": "s3:*",
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::my-bucket",
      "Principal": {
        "AWS": [
          "arn:aws:iam::xxxxxxxxxxx:root"
        ]
      }
    }
  ]
}

我已经应用了此功能,它将应用于 Heroku IAM 用户上传到存储桶的每个新项目。但之前上传的项目似乎没有应用此功能。Web 控制台非常混乱,恕我直言,写得不好。我知道大多数大用户都会使用命令行控制台来执行所有这些操作。我是一名 Ruby/Rails 开发人员,拥有相当多的系统管理经验(AWS 之前),如果它实际上比 Web 控制台更有用,我不介意使用命令行。

编辑:好的,再次查看文档,我认为开头的 * 明确拒绝永远不会被后面的允许覆盖。所以我需要重新考虑我的策略,但它仍然不会改变如何覆盖以前保存的项目的 ACL。我会手动执行它们,但这里有数百个,我不想点击每一个。对我来说,顶层的 ACL 没有“递归应用于所有子项”的选项,这毫无意义。我的明确策略不应该覆盖它吗?

最新情况:我删除了策略中的明确拒绝。然后我转到我的 Heroku 应用程序,上传了一张新照片,并且可以执行应用程序应该执行的所有操作。但即使是新上传的内容也可以通过另一个浏览器的私人窗口会话公开访问,只需复制网址即可。我甚至在匿名代理中尝试了该网址,我可以查看照片。然后我从上传的照片中删除了公共 ACL,当我尝试通过我的 Heroku 应用程序查看它时,访问被拒绝。

答案1

因此,在阅读了几个关于这个主题的网站后,我得出的结论是:公共 ACL 设置在上传链接中,因为存储的图像并不敏感,所以 URL 的模糊性是提供项目的可接受做法。要使其更加私密,需要在每次访问时将每张图片传递到 Heroku 服务器。

相关内容