我得到:

在调用ListObjects操作时发生错误(AccessDenied): AccessDenied

当我试图从S3存储桶中获取文件夹时。

使用该命令:

aws s3 cp s3://bucket-name/data/all-data/ . --recursive

桶的IAM权限如下所示:

{
"Version": "version_id",
"Statement": [
    {
        "Sid": "some_id",
        "Effect": "Allow",
        "Action": [
            "s3:*"
        ],
        "Resource": [
            "arn:aws:s3:::bucketname/*"
        ]
    }
] }

我需要改变什么才能成功复制和ls ?


当前回答

这不是最好的做法,但这将为你扫清障碍。 确保执行命令的用户在其权限下附加了以下策略。 答:PowerUserAccess b . AmazonS3FullAccess

其他回答

比起之前的答案,我更喜欢这个。它展示了如何使用YAML格式,并允许您使用一个变量来指定bucket。

    - PolicyName: "AllowIncomingBucket"
      PolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: "Allow"
            Action: "s3:*"
            Resource:
              - !Ref S3BucketArn
              - !Join ["/", [!Ref S3BucketArn, '*']]

对于启用了MFA的亚马逊用户,请使用以下命令: Aws s3 ls s3://桶名——profile mfa。

并首先通过运行准备配置文件mfa Aws STS get-session-token——serial-number arn: Aws:iam::123456789012:mfa/user-name——token-code 928371——duration 129600。(替换123456789012,user-name和928371)。

我认为错误是由于“s3:ListObjects”操作,但我不得不添加操作“s3:ListBucket”来解决“AccessDenied for ListObjects for s3 bucket”的问题

如果在minio的新版本上突然出现这个错误,那么原因是桶访问策略默认值从2021版本更改为2022版本。现在在2022版本中,默认情况下所有的桶(新创建的和现有的)都将访问策略设置为私有-仅提供服务器凭据来访问它们是不够的-你仍然会得到如下错误(这里:返回到python minio客户端):

S3Error: S3 operation failed; code: AccessDenied, message: Access Denied., resource: /dicts, request_id: 16FCBE6EC0E70439, host_id: 61486e5a-20be-42fc-bd5b-7f2093494367, bucket_name: dicts

要在2022版本中回滚到以前的安全设置,最快的方法是在MinIO控制台中(或通过mc客户端)将桶访问访问策略更改为Public。

我添加了一个与公认答案方向相同的答案,但有小的(重要的)差异,并添加了更多的细节。

考虑下面的配置:

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

该策略授予编程式写-删除访问权,并分为两部分: ListBucket操作提供了桶级别的权限,而其他PutObject/DeleteObject操作需要桶内对象的权限。

第一个Resource元素为ListBucket操作指定arn:aws:s3:::< bucket - name >,以便应用程序可以列出桶中的所有对象。

第二个Resource元素为PutObject指定arn:aws:s3:::< bucket - name >/*和DeletObject操作,以便应用程序可以写入或删除桶中的任何对象。

从安全角度考虑,为了指定桶级和对象级细粒度权限,将它们分离为两个不同的“arn”非常重要。

注意,如果我只在第二个块中指定GetObject,那么在编程访问的情况下,我将收到类似这样的错误:

Upload failed: <file-name> to <bucket-name>:<path-in-bucket>调用PutObject操作时发生错误(AccessDenied): AccessDenied。