ruby-on-rails - 为 Amazon S3 编写 IAM 策略和 CORS 配置

标签 ruby-on-rails amazon-web-services amazon-s3 cloud amazon-iam

我对这一切都很陌生,但已经能够让头像/图像上传器在我的 Rails 应用程序中工作。用户可以将新头像上传到我的 S3 存储桶,该头像会显示在 Web 应用程序中。

为此,我不得不向用户授予“AmazonS3FullAccess”策略。这似乎有点过分,因为来自应用程序的用户只需要写入(上传他的头像)和读取(在网页上显示头像)权限。

您是否同意编写自定义策略比使用 AmazonS3FullAccess 更好?
如果是这样,我已经尝试了下面的策略代码(从 here 采用),但这不起作用(尝试上传头像图像时出现 403 禁止错误)。任何建议如何更正此代码?

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": ["s3:ListBucket"],
      "Resource": ["arn:aws:s3:::mybucket"]
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:PutObject",
        "s3:GetObject",
        "s3:DeleteObject"
      ],
      "Resource": ["arn:aws:s3:::mybucket/*"]
    }
  ]
}

最佳答案

我已经长了白头发,试图找出正确的配置。这是一个对我有用的:

{
    "Statement": [
        {
            "Sid": "AllowPublicRead",
            "Action": [
                "s3:ListBucket",
                "s3:GetObject",
                "s3:PutObject",
                "s3:PutObjectAcl",
                "s3:DeleteObject"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::mybucket/*",
                "arn:aws:s3:::mybucket"
            ]
        }
    ]
}

此策略应附加到适当的实体(“附加实体选项卡”),该实体可以是专用用户。如果您需要 API/访问 key ,请前往该用户的“安全凭证”选项卡并生成一些。这使您可以更好地控制谁在使用该策略。

您还可以按照@therealprashant 在评论中的建议,通过指定 "Principal":"*"来编辑此策略以允许匿名访问,请参阅 the docs了解更多信息。

但是您还需要设置 CORS 配置。
打开 S3 console ,单击您的存储桶,显示其属性(右侧面板)并单击权限,您将能够编辑配置。
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
    <CORSRule>
        <AllowedOrigin>http://*.example.com</AllowedOrigin>
        <AllowedMethod>GET</AllowedMethod>
        <AllowedMethod>POST</AllowedMethod>
        <AllowedMethod>PUT</AllowedMethod>
        <MaxAgeSeconds>3000</MaxAgeSeconds>
        <AllowedHeader>*</AllowedHeader>
    </CORSRule>
    <CORSRule>
        <AllowedOrigin>http://example.com</AllowedOrigin>
        <AllowedMethod>GET</AllowedMethod>
        <AllowedMethod>POST</AllowedMethod>
        <AllowedMethod>PUT</AllowedMethod>
        <MaxAgeSeconds>3000</MaxAgeSeconds>
        <AllowedHeader>*</AllowedHeader>
    </CORSRule>
</CORSConfiguration>

根据需要添加尽可能多的 CORSRule,尤其是在您还需要 https 时。

希望这会有所帮助。

编辑

这是我现在实际使用的修改版本。
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:AbortMultipartUpload",
                "s3:ListBucket",
                "s3:GetObject",
                "s3:PutObject",
                "s3:PutObjectAcl",
                "s3:DeleteObject",
                "s3:GetObjectVersion"
            ],
            "Resource": [
                "arn:aws:s3:::mybucket/*",
                "arn:aws:s3:::mybucket"
            ]
        }
    ]
}

注意:在附加到 IAM 用户、组或角色的 IAM 策略中可以省略“principal”(就像我在这里所做的那样)。在授权期间,“主体”被评估为策略所附加的实体。

关于ruby-on-rails - 为 Amazon S3 编写 IAM 策略和 CORS 配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30358220/

相关文章:

ruby-on-rails - 如何传递 simple_form 隐藏字段参数来创建操作

amazon-web-services - 我可以暂停 ECS 服务而不是删除它吗?

amazon-web-services - 重命名 ECS 服务

ruby-on-rails - 如何为通过 Active Storage 上传的 S3 文件设置缓存控制?

amazon-web-services - aws cloudformation中的先有鸡还是先有蛋的问题

post - 如何通过 POST 处理 S3 浏览器上传中的错误

ruby-on-rails - 如何解析服务器端(rails)中的复选框值?

ruby-on-rails - Google API Ruby 客户端(gem)错误 `uninitialized constant Google::APIClient::UploadIO`

ruby-on-rails - rails bin/rails 文件如何/做什么

python - 无法使用 python 解析 boto3 客户端 json 响应