在第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政策是什么?
答案 0 :(得分:6)
如果' AmazonS3FullAccess'政策是有效的,其中肯定会有一些对申请工作至关重要的行动。
除了存在似乎合乎逻辑的ListBucket
,PutObject
,GetObject
和DeleteObject
行为之外,我发现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选择你的桶名:避免例如标点符号。