为Amazon S3编写IAM策略和CORS配置

Nic*_*ick 4 cloud ruby-on-rails amazon-s3 amazon-web-services amazon-iam

我对这一切都很陌生但是能够在我的Rails应用程序中使用头像/图像上传器.用户可以将新的头像上传到我的S3存储桶,并且在web应用程序中显示头像.

为此,我不得不向用户授予"AmazonS3FullAccess"政策.这看起来有点太多了,因为来自应用程序的用户只需要写入(上传他的头像)并阅读(在网页上显示头像)权限.

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

{
  "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/*"]
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

Nyc*_*cen 8

我已经长出白发试图弄清楚正确的配置.这是一个适合我的方法:

{
    "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"
            ]
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

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

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

但是您还需要设置CORS配置.打开S3控制台,单击您的存储桶,显示其属性(右侧面板)并单击权限,您将能够编辑配置.

<?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>
Run Code Online (Sandbox Code Playgroud)

根据需要添加尽可能多的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"
            ]
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

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

  • 找到原因了:bucket名称前面有空格。您可能希望为将来遇到相同问题的任何访问者从您的答案中删除该空格。谢谢帮忙解决! (2认同)