我需要一个拥有单一存储桶完全访问权限的亚马逊S3用户。

36

我有一个名为foo的用户,其权限如下(它不是任何组的成员):

{
  "Statement": [
    {
      "Sid": "Stmt1308813201865",
      "Action": "s3:*",
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::bar"
    }
  ]
}

然而,该用户似乎无法上传文件或进行其他操作,直到我授予经过身份验证的用户完全访问权限(可能适用于任何人)。尽管如此,这仍然不能让用户更改权限,因为在上传后, 尝试执行 key.set_acl('public-read') 时会出现错误。

理想情况下,该用户应该对 bar 存储桶拥有完全访问权限,但没有其他权限。我做错了什么?

9个回答

44

您需要授予 s3:ListBucket 权限给存储桶本身。请尝试以下策略。

{
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "S3:*",
      "Resource": "arn:aws:s3:::bar/*",
      "Condition": {}
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:ListBucket"
      ],
      "Resource": "arn:aws:s3:::bar",
      "Condition": {}
    }
  ]
}

4
细节说明:似乎需要使用 bar/* 才能访问 bar 存储桶中的对象,而需要使用 bar 列出/修改存储桶本身。 - treat your mods well
使用Cyberduck访问具有上述权限的S3似乎不起作用。可能是因为Cyberduck需要像@Suman提到的ListAllMyBuckets。但是,如果您使用来自timkay.com的命令行工具,则可以完美地解决此问题。 - Thanh Nguyen
7
非常感谢,我他妈的讨厌 s3 带来的繁琐政策。浪费了 2 小时,直到最终找到解决办法。 - Nimo
9
如果在Cyberduck中将“更多选项”下的“路径”设置为存储桶名称,则可以正常工作。这样,您就不需要添加“ListAllMyBuckets”。 - Joar Leth
只是想确认一下@JoarLeth所说的:如果您在Cyberduck连接选项中设置了路径,则不需要ListAllMyBuckets权限。 - WickyNilliams

21

4
这允许列出所有存储桶,并不限制仅访问特定的存储桶。 - Thanh Nguyen
2
+1 给我:被投票的那个在 Ruby 的 Fog gem 中不起作用,但这个配置起作用了。 - Dirty Henry
6
错误。它会列出所有的存储桶,但是在策略中只提供对指定存储桶的访问权限。 - slayedbylucifer
我需要这个方法来允许我的IAM用户访问S3控制台。 - dannyman

8

是的,但它并没有回答问题。 - dannyman
2
政策生成器引发了更多问题,而非解决问题。 - woens

4

有一个官方的 AWS 文档,位于编写 IAM 策略:如何授予对 Amazon S3 存储桶的访问权限

只需复制并粘贴适当的规则,并在所有语句中将 "Resource" 键更改为您的存储桶 ARN。

对于编程访问,策略应为:

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

对于控制台访问,应该是:

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

1
最近我另一种让这个工作的方法是使用亚马逊的文档。对我来说关键是将IAM用户指向特定的存储桶而不是S3控制台。根据文档,“警告:更改这些权限后,用户在访问主Amazon S3控制台时会收到拒绝访问的错误。主控制台链接类似于以下链接:”

https://s3.console.aws.amazon.com/s3/home

相反,用户必须使用直接控制台链接到存储桶进行访问,类似于以下内容:

https://s3.console.aws.amazon.com/s3/buckets/awsexamplebucket/"

我的政策如下:

{
"Version": "2012-10-17",
"Statement": [
    {
        "Sid": "Stmt1589486662000",
        "Effect": "Allow",
        "Action": [
            "s3:*"
        ],
        "Resource": [
            "arn:aws:s3:::AWSEXAMPLEBUCKET",
            "arn:aws:s3:::AWSEXAMPLEBUCKET/*"
        ]
    }
]
}

0

对我来说可以运行:

{
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:GetBucketLocation",
                "s3:ListBucketMultipartUploads",
                "s3:ListBucketVersions"
            ],
            "Resource": "arn:aws:s3:::bucket_name_here"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:*Object*",
                "s3:ListMultipartUploadParts",
                "s3:AbortMultipartUpload"
            ],
            "Resource": "arn:aws:s3:::bucket_name_here/*"
        }
    ]
}

0

@cloudberryman的回答是正确的,但我喜欢让事情尽可能简短。这个答案可以简化为:

{  
   "Statement":[  
      {  
         "Effect":"Allow",
         "Action":"S3:*",
         "Resource":[  
            "arn:aws:s3:::bar",
            "arn:aws:s3:::bar/*"
         ]
      }
   ]
}

1
但是您的答案与cloudberryman的解释不等同。 您的示例提供对存储桶和存储桶内容的完全访问权限,而他只允许列出存储桶但允许访问内容。 在您的情况下,权限允许删除存储桶本身,这可能超过了大多数人想授予的权限。 - Larry

0

如果您一直因为无法解决Cyberduck无法设置对象ACL,但是可以在其他客户端(例如Panic Transmit)中使用而苦恼不已,那么这里有解决方案:

您需要将s3:GetBucketAcl添加到您的操作列表中,例如:

{
    "Statement": [
        {
            "Sid": "Stmt1",
            "Action": [
                "s3:GetBucketAcl",
                "s3:ListBucket",
                "s3:DeleteObject",
                "s3:GetObject",
                "s3:GetObjectAcl",
                "s3:PutObject",
                "s3:PutObjectAcl"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:s3:::your-bucket-name"
        }
    ]
}

当然,如果您对 s3:* 不那么严格,您就不需要这样做,但我认为了解这一点很好。


0
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                        "s3:GetBucketLocation",
                        "s3:ListAllMyBuckets"
                      ],
            "Resource": "arn:aws:s3:::*"
        },
        {
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::YOUR-BUCKET",
                "arn:aws:s3:::YOUR-BUCKET/*"
            ]
        }
    ]
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接