AWS S3 IAM策略,用于对单个存储桶

时间:2016-02-07 15:05:23

标签: ruby-on-rails heroku amazon-s3 railstutorial.org

在第11.4.4章' Image upload in production' Michael Hartl' Rails教程建议使用Amazon Web Services S3作为云存储服务。在页面底部的一个注释中,作者自己将本书的这一部分定义为"挑战"并且还建议在不失去连续性的情况下跳过它#34;

本节最具挑战性的部分之一是找到一个合适的IAM策略,该策略可以附加到AWS上的IAM用户,以便授予IAM用户对S3存储桶的读写权限。

我发现在Stackoverflow上这是一个常见问题:例如参见' Trying to set up Amazon's S3 bucket: 403 Forbidden error & setting permissions'。

实际上,Amazon Web Services's solution对于需要对单个S3存储桶具有读写权限的应用程序不起作用,尝试上传图像的用户从Heroku的AWS服务器接收403禁止状态。

预定义的AmazonS3FullAccess'策略确实有效,但它不应被视为最终解决方案,因为不需要向IAM用户授予太多权限,因此也不需要向应用程序授予权限,并且我认为也可能是安全漏洞。

正确的IAM政策是什么?

1 个答案:

答案 0 :(得分:6)

如果' AmazonS3FullAccess'政策是有效的,其中肯定会有一些对申请工作至关重要的行动。

除了存在似乎合乎逻辑的ListBucketPutObjectGetObjectDeleteObject行为之外,我发现PutObjectAcl也是必要的。

来自AWS的Access Control List (ACL) Overview

" Amazon S3访问控制列表(ACL)使您可以管理对存储桶和对象的访问。每个存储桶和对象都有一个ACL作为子资源附加到它。它定义了哪些AWS账户或组被授予访问权限以及访问类型。当收到针对资源的请求时,Amazon S3会检查相应的ACL以验证请求者是否具有必要的访问权限。创建存储桶或对象时,Amazon S3会创建一个默认ACL,以授予资源所有者对资源的完全控制权。

此外,来自documentation on 'PutObjectAcl'

" PUT操作的这种实现使用acl子资源为存在于存储桶中的对象设置访问控制列表(ACL)权限...对象的ACL设置为对象版本水平。默认情况下,PUT设置对象当前版本的ACL。"

我无法在亚马逊论坛的my request of support中找到解释为什么PutObjectAcl是必要的解释,但根据我的理解,可能是第一次创建对象的ACL时的操作上传到存储桶中,应由进行上传的应用程序(或IAM用户)明确请求。您可以在以上亚马逊论坛讨论及以下内容中找到我的政策副本:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": [
        "s3:ListBucket"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::<bucket-name>"
    },
    {
      "Action": [
        "s3:DeleteObject",
        "s3:GetObject",
        "s3:PutObject",
        "s3:PutObjectAcl"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::<bucket-name>/*"
    }
  ]
}

还要考虑Heroku's suggestions选择你的桶名:避免例如标点符号。