Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails AWS S3 IAM针对单个存储桶的读写权限策略_Ruby On Rails_Heroku_Amazon S3_Railstutorial.org - Fatal编程技术网

Ruby on rails AWS S3 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存储桶上具有读写权限的应

在Michael Hartl的Rails教程的第11.4.4章中,建议使用Amazon Web Services S3作为云存储服务。在页面底部的一个注释中,作者本人将本书的这一部分定义为“具有挑战性”,并建议“可以跳过而不失去连续性”

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

我发现Stackoverflow中的这一点是一个常见问题:请参阅实例“”

实际上,对于需要在单个S3存储桶上具有读写权限的应用程序,该应用程序不起作用,尝试上载图像的用户从Heroku的AWS服务器收到403禁止状态

预定义的“AmazonS3FullAccess”策略确实有效,但不应将其视为最终解决方案,因为不需要向IAM用户以及应用程序授予过多权限,而且我认为这可能是一个安全缺陷


那么什么是正确的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策略是用户策略