33

我有一个用户 foo 具有以下权限(它不是任何组的成员):

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

然而,在我授予经过身份验证的用户的完全访问权限(这可能适用于任何人)之前,该用户似乎无法上传或执行大部分操作。这仍然不允许用户更改权限,因为在尝试执行时会在上传后抛出错误 do key.set_acl('public-read')

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

4

9 回答 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": {}
    }
  ]
}
于 2011-11-21T14:55:41.307 回答
21

选择的答案对我不起作用,但这个答案:

{
  "Statement": [
    {
      "Action": "s3:*",
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::my-bucket",
        "arn:aws:s3:::my-bucket/*"
      ]
    }
  ],
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "s3:ListAllMyBuckets",
      "Resource": "arn:aws:s3:::*"
    }
  ]
}

信用: http: //mikeferrier.com/2011/10/27/granting-access-to-a-single-s3-bucket-using-amazon-iam/

于 2012-11-21T16:25:56.043 回答
8

您了解AWS 策略生成器吗?

于 2012-10-05T09:23:55.863 回答
2

在编写 IAM 策略中有官方 AWS 文档:如何授予对 Amazon S3 存储桶的访问权限

只需复制并粘贴适当的规则,然后在所有语句中将“资源”键更改为您的存储桶的 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/*"]
        }
    ]
}
于 2017-06-21T14:21:59.857 回答
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/*"
        }
    ]
}
于 2015-01-25T14:26:38.893 回答
0

如果您因为无法弄清楚为什么 Cyber​​duck 无法设置对象 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:*但我认为这很高兴知道。

于 2015-11-23T11:31:05.640 回答
0

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

{  
   "Statement":[  
      {  
         "Effect":"Allow",
         "Action":"S3:*",
         "Resource":[  
            "arn:aws:s3:::bar",
            "arn:aws:s3:::bar/*"
         ]
      }
   ]
}
于 2017-11-02T15:22:43.760 回答
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/*"
            ]
        }
    ]
}
于 2019-06-21T07:20:20.790 回答
0

我最近能够让它工作的另一种方法是使用亚马逊的文档。对我来说,关键是将 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/*"
        ]
    }
]
}
于 2020-05-15T14:25:49.633 回答