Ruby on rails AWS S3 IAM针对单个存储桶的读写权限策略
在Michael Hartl的Rails教程的第11.4.4章中,建议使用Amazon Web Services S3作为云存储服务。在页面底部的一个注释中,作者本人将本书的这一部分定义为“具有挑战性”,并建议“可以跳过而不失去连续性” 事实上,本节最具挑战性的部分之一是找到一个合适的IAM策略,该策略可以附加到AWS的IAM用户,以便授予IAM用户对S3存储桶的读写权限 我发现Stackoverflow中的这一点是一个常见问题:请参阅实例“” 实际上,对于需要在单个S3存储桶上具有读写权限的应用程序,该应用程序不起作用,尝试上载图像的用户从Heroku的AWS服务器收到403禁止状态 预定义的“AmazonS3FullAccess”策略确实有效,但不应将其视为最终解决方案,因为不需要向IAM用户以及应用程序授予过多权限,而且我认为这可能是一个安全缺陷Ruby on rails AWS S3 IAM针对单个存储桶的读写权限策略,ruby-on-rails,heroku,amazon-s3,railstutorial.org,Ruby On Rails,Heroku,Amazon S3,Railstutorial.org,在Michael Hartl的Rails教程的第11.4.4章中,建议使用Amazon Web Services S3作为云存储服务。在页面底部的一个注释中,作者本人将本书的这一部分定义为“具有挑战性”,并建议“可以跳过而不失去连续性” 事实上,本节最具挑战性的部分之一是找到一个合适的IAM策略,该策略可以附加到AWS的IAM用户,以便授予IAM用户对S3存储桶的读写权限 我发现Stackoverflow中的这一点是一个常见问题:请参阅实例“” 实际上,对于需要在单个S3存储桶上具有读写权限的应
那么什么是正确的IAM策略?如果“AmazonS3FullAccess”策略有效,那么其中肯定有一些操作对于应用程序的运行至关重要 除了
ListBucket
、PutObject
、GetObject
和DeleteObject
操作,它们的存在似乎是合乎逻辑的,我发现PutObjectAcl
也是必要的
来自AWS的:
“Amazon S3访问控制列表(ACL)使您能够管理对bucket和对象的访问。每个bucket和对象都有一个作为子资源附加到其上的ACL。它定义授予哪些AWS帐户或组访问权限以及访问类型。当收到针对资源的请求时,Amazon S3会检查相应的ACL,以验证请求者是否具有必要的访问权限。创建bucket或对象时,Amazon S3会创建默认ACL,授予资源所有者对资源的完全控制权“
此外,从以下方面:
PUT操作的此实现使用acl子资源为已存在于bucket中的对象设置访问控制列表(acl)权限…对象的acl在对象版本级别设置。默认情况下,PUT设置对象当前版本的acl
我在亚马逊论坛上找不到关于为什么需要PutObjectAcl
的解释,但据我所知,创建对象ACL的操作可能是在对象第一次上传到bucket中时进行的,并且应该由进行上传的应用程序(或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>/*"
}
]
}
{
“版本”:“2012-10-17”,
“声明”:[
{
“行动”:[
“s3:ListBucket”
],
“效果”:“允许”,
“资源”:“arn:aws:s3:”
},
{
“行动”:[
“s3:DeleteObject”,
“s3:GetObject”,
“s3:PutObject”,
“s3:PutObjectAcl”
],
“效果”:“允许”,
“资源”:“arn:aws:s3::/*”
}
]
}
还要考虑选择bucket名称:例如,避免使用标点符号。您缺少一个
,s3:PutObject
之后的,并且当前的AWS约束也需要一个主体和值。感谢您注意到缺少的逗号。我编辑了原始代码。然而,“主体”元素仅与bucket策略相关,正如文档中所指定的:IAM策略是用户策略