【问题标题】:Writing an IAM policy and CORS configuration for Amazon S3为 Amazon S3 编写 IAM 策略和 CORS 配置
【发布时间】:2015-08-02 04:55:30
【问题描述】:

我对这一切都很陌生,但能够让头像/图像上传器在我的 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/*"]
    }
  ]
}

【问题讨论】:

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


    【解决方案1】:

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

    {
        "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/访问密钥,请前往该用户的“安全凭证”选项卡并生成一些。这使您可以更好地控制谁在使用该策略。

    您还可以编辑此策略以允许匿名访问,方法是指定“Principal”:“*”,如 cmets 中 @therealprashant 所建议的那样,请参阅 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 策略中,可以省略“主体”(就像我在此处所做的那样)。在授权期间,“主体”被评估为策略附加到的实体。

    【讨论】:

    • 感谢 Nycen,我试过了,但不幸的是没有成功(日志中仍然 403 Forbidden)。我的域名是mydomain.herokuapp.com。我已经尝试过 CORS 配置:https://mydomain.herokuapp.comhttps://*.herokuapp.comhttp://mydomain.herokuapp.comhttp://*.herokuapp.com 但在尝试上传头像图像时都没有成功。在策略中,我将 mybucket 替换为我的存储桶名称。
    • 顺便问一下,我还需要在存储桶的权限下设置一个被授予者吗?
    • 不,你不需要。但是您需要确保您的 html 表单设置正确。你可以使用类似github.com/waynehoover/s3_direct_upload
    • 我认为html表单设置正确。如果我将用户的策略设置为 AmazonS3FullAccess,我使用了 railstutorial.org (railstutorial.org/book/user_microposts#sec-micropost_images) 的步骤,并且表单功能正常。
    • 找到原因:bucket名前面有空格。对于遇到相同问题的任何未来访问者,您可能希望从答案中删除该空格。感谢您帮助解决!
    猜你喜欢
    • 2012-05-18
    • 2021-02-13
    • 1970-01-01
    • 2023-03-29
    • 2023-04-07
    • 2013-01-07
    • 2021-07-11
    • 2019-11-18
    • 2013-08-05
    相关资源
    最近更新 更多