针对单个存储桶的读取和写入权限的 AWS S3 IAM 策略
Posted
技术标签:
【中文标题】针对单个存储桶的读取和写入权限的 AWS S3 IAM 策略【英文标题】:AWS S3 IAM policy for read and write permissions on a single bucket 【发布时间】:2016-02-07 15:05:22 【问题描述】:在 Michael Hartl 的 Rails 教程的第 11.4.4 章“Image upload in production”中,建议使用 Amazon Web Services S3 作为云存储服务。在页面底部的注释中,作者本人将本书的这一部分定义为“具有挑战性”,并建议“可以跳过而不会失去连续性”。
确实,本部分最具挑战性的部分之一是找到一个合适的 IAM 策略,该策略可以附加到 AWS 的 IAM 用户,以便授予 IAM 用户对 S3 存储桶的读取和写入权限。
我在 *** 发现这是一个常见问题:例如,请参阅“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】:如果“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:避免使用标点符号。
【讨论】:
您在s3:PutObject
之后缺少,
,并且当前的AWS 约束还需要Principal
和值。
感谢您注意到缺少的逗号。我编辑了原始代码。然而,“Principal”元素仅在存储桶策略中相关,如文档中所述:amzn.to/2nJEu7q IAM 策略是用户策略以上是关于针对单个存储桶的读取和写入权限的 AWS S3 IAM 策略的主要内容,如果未能解决你的问题,请参考以下文章
有没有人达到过 Amazon S3 存储桶的读取或写入上限?
如何授予 Amazon SES 写入您的 Amazon S3 存储桶的权限