我得到:

在调用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 ?


当前回答

您必须通过“arn:aws:s3:::bucketname”或“arn:aws:3:: bucketname*”为桶指定Resource。后者是首选,因为它也允许对桶的对象进行操作。注意这里没有斜杠!

列出对象是Bucket上的一个操作。因此,需要执行“s3:ListBucket”操作。 向Bucket中添加对象是object上的操作。因此,需要动作“s3:PutObject”。 当然,您可能希望根据需要添加其他操作。

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

其他回答

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

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

我有这个问题 我的要求,我想让用户写入特定的路径

{
            "Sid": "raspiiotallowspecificBucket",
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::<bucketname>/scripts",
                "arn:aws:s3:::<bucketname>/scripts/*"
            ]
        },

这个改变解决了问题

{
            "Sid": "raspiiotallowspecificBucket",
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::<bucketname>",
                "arn:aws:s3:::<bucketname>/*"
            ]
        },

我在尝试在本地同步整个s3桶时遇到了类似的问题。对我来说,在我的帐户上强制执行MFA(多因素身份验证),这是在通过AWS CLI执行命令时所必需的。

因此,我的解决方案是-使用概要文件(mfa文档)提供mfa凭据,同时使用任何AWS CLI命令。

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

如果需要复制所有s3桶对象,请使用“aws s3 cp s3://bucket-name/data/all-data/”命令。正如你提到的,这里有一个安全且最小的策略来做到这一点:

{
  "Version": "2012-10-17",
  "Statement": [
      {
          "Effect": "Allow",
          "Action": [
              "s3:ListBucket"
          ],
          "Resource": [
              "arn:aws:s3:::bucket-name"
          ],
          "Condition": {
              "StringLike": {
                  "s3:prefix": "data/all-data/*"
              }
          }
      },
      {
          "Effect": "Allow",
          "Action": [
              "s3:GetObject"
          ],
          "Resource": [
              "arn:aws:s3:::bucket-name/data/all-data/*"
          ]
      }
  ]
}

此策略中的第一个语句允许列出特定桶的子目录中的对象。该资源需要是S3存储桶的arn,为了将列表限制为该存储桶中的子目录,您可以编辑“S3:prefix”值。

此策略中的第二条语句允许在特定子目录的桶中获取对象。这意味着“s3://bucket-name/data/all-data/”路径中的任何内容都可以复制。请注意,这不允许你从父路径复制,如“s3://bucket-name/data/”。

此解决方案专门用于限制AWS CLI命令的使用;如果您需要通过AWS控制台或API限制S3访问,则需要更多策略。我建议大家去https://aws.amazon.com/blogs/security/writing-iam-policies-grant-access-to-user-specific-folders-in-an-amazon-s3-bucket/看看。

类似的问题可以在这里找到,这让我想到了我给出的解决方案。 https://github.com/aws/aws-cli/issues/2408

希望这能有所帮助!