AWS S3 IAM策略,用于对单个存储桶执行读写权限
在Michael Hartl’Rails教程的第11.4.4节“ 生产中的图像上传 ”中,建议使用Amazon Web Services S3作为云存储服务。 在页面底部的一个注释中,作者自己将本书的这一部分定义为“具有挑战性”,并且还表明它“可以跳过而不会失去连续性”。
实际上,本节最具挑战性的部分之一是找到一个合适的IAM策略,该策略可以附加到AWS上的IAM用户,以便授予IAM用户对S3存储桶的读写权限。
我发现在Stackoverflow上这是一个常见问题:例如,请参阅“ 尝试设置Amazon的S3存储桶:403禁止错误和设置权限 ”。
实际上, Amazon Web Services针对需要对单个S3存储桶具有读写权限的应用程序的解决方案不起作用,并且尝试上载图像的用户从Heroku的AWS服务器接收403禁止状态。
预定义的“AmazonS3FullAccess”策略确实有效,但不应将其视为最终解决方案,因为不需要向IAM用户授予太多权限,因此也不需要向应用程序授予权限,并且我认为也可能是安全漏洞。
那么正确的IAM政策是什么?
如果’AmazonS3FullAccess’策略有效,那么肯定会有一些对应用程序工作至关重要的操作。
除了存在似乎合乎逻辑的ListBucket
, PutObject
, GetObject
和DeleteObject
操作之外,我发现PutObjectAcl
也是必需的。
从AWS的访问控制列表(ACL)概述 :
“Amazon S3访问控制列表(ACL)使您能够管理对存储桶和对象的访问。每个存储桶和对象都有一个ACL作为子资源附加到它。它定义了哪些AWS账户或组被授予访问权限和访问类型。收到针对资源的请求后,Amazon S3会检查相应的ACL以validation请求者是否具有必要的访问权限。当您创建存储桶或对象时,Amazon S3会创建一个默认ACL,授予资源所有者对资源的完全控制权“
此外,从’PutObjectAcl’的文档 :
“此PUT操作的实现使用acl子资源为存在于存储桶中的对象设置访问控制列表(ACL)权限…对象的ACL设置为对象版本级别。默认情况下,PUT设置对象当前版本的ACL。“
我在亚马逊论坛的支持请求中找不到解释为什么PutObjectAcl
是必要的,但根据我的理解,可能是第一次将对象上传到存储桶中时创建对象的ACL的操作应该是明确的由进行上传的应用程序(或IAM用户)请求。 您可以在上面的亚马逊论坛讨论中找到我的政策的副本,如下所示:
{ "Version": "2012-10-17", "Statement": [ { "Action": [ "s3:ListBucket" ], "Effect": "Allow", "Resource": "arn:aws:s3:::" }, { "Action": [ "s3:DeleteObject", "s3:GetObject", "s3:PutObject", "s3:PutObjectAcl" ], "Effect": "Allow", "Resource": "arn:aws:s3::: /*" } ] }
还要考虑Heroku关于您的桶名称选择的建议 :避免例如标点符号。
- s3如何计算签名
- Rails3,S3,Paperclip附件是它自己的型号吗?
- Carrierwave处理的图像未上传到AWS S3
- Ruby on Rails / Paperclip / AWS :: S3 :: NoSuchBucket错误
- 使用RoR,FbGraph Gem和S3将照片发布到Heroku的Facebook Open Graph
- 为什么Ruby open-uri打开在我的unit testing中返回一个StringIO,但在我的控制器中是一个FileIO?
- 回形针可以从S3铲斗中读取照片几何图形吗?
- 阻止资产在本地进行预编译,以进行heroku rails asset_sync s3应用程序的本地生产测试
- 加载到Heroku时Carrierwave / fog / AWS问题“无法加载此类文件 – 雾”