【问题标题】:AccessDenied for ListObjects for S3 bucket when permissions are s3:*当权限为 s3 时,S3 存储桶的 ListObjects 的 AccessDenied:*
【发布时间】:2016-12-11 00:24:38
【问题描述】:

我得到:

调用 ListObjects 操作时发生错误(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/*"
        ]
    }
] }

我需要更改什么才能成功copyls

【问题讨论】:

  • 就我而言,我为一个用户配置了aws,并在另一个用户的名为 cronjob 的 bash 脚本中使用了它,这意味着访问密钥和访问令牌错误/未设置。我的解决方案是直接将凭据(AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY)放入我的 bash 脚本文件 as described here

标签: amazon-web-services amazon-s3 amazon-iam


【解决方案1】:

您已授予对 S3 存储桶内的对象执行命令的权限,但您未授予对存储桶本身执行任何操作的权限。

稍微修改您的政策将如下所示:

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

但是,这可能会提供比所需更多的权限。遵循 Granting Least Privilege 的 AWS IAM 最佳实践将如下所示:

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

【讨论】:

  • 此操作列表太宽。对于列表和版权,您建议采取哪些措施。
  • @domfarr 我只是尽可能地调整 OPs 政策以使其适合他。如果您有特定的问题,您应该将其作为一个单独的问题发布在此站点上,而不是使用 cmets 标记到这个问题上。尽管查看 S3 操作列表并构建所需的策略应该非常容易。
  • 我没有标记。 OP 确实要求复制和 ls 所需的内容。包括缺少存储桶级别 arn,但您没有调整操作...因此我的评论。
  • 也许直接为 EC3 分配适当的角色应该可行。 :)
  • 另外,请务必不要像我一样写"Resource": [ "arn:aws:s3:::bucketname/", "arn:aws:s3:::bucketname/*" ](即您只希望在* 之前添加一个斜线)——我花了4 个小时才意识到这个错误导致了我所有的listObjects 电话失败...
【解决方案2】:

如果您想使用命令“aws s3 cp s3://bucket-name/data/all-data/.--recursive”复制所有 s3 存储桶对象,如您所述,这是一个安全且最少的策略这样做:

{
  "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

希望这会有所帮助!

【讨论】:

  • 实际上,您似乎可以ListBucket限制为一个子键:stackoverflow.com/a/35952877/89218
  • 感谢您告诉我,我将在我当前的一些项目中尝试这个!
  • 谢谢。从没想过非第一个答案可能对我有帮助
  • 我已经编辑了答案以包含一个限制列出特定子文件夹下对象的条件。感谢您的帮助!
【解决方案3】:

我无法访问 S3,因为

  • 首先我在实例上配置了密钥访问权限(启动后无法附加角色)
  • 忘记了几个月
  • 附加角色到实例
  • 试图访问。 配置的密钥的优先级高于角色,并且由于未授予用户必要的 S3 权限而拒绝访问。

解决方案:rm -rf .aws/credentials,然后aws 使用角色。

【讨论】:

  • 完全相同的问题。这种情况的一个症状是一个用户可以访问另一个用户在同一个 EC2 节点上无法访问的东西。
【解决方案4】:

我在使用以下策略时遇到了同样的错误,尽管我对 s3:ListObjects 操作有“s3:ListBucket”。

{
"Version": "2012-10-17",
"Statement": [
    {
        "Action": [
            "s3:ListBucket",
            "s3:GetObject",
            "s3:GetObjectAcl"
        ],
        "Resource": [
            "arn:aws:s3:::<bucketname>/*",
            "arn:aws:s3:::*-bucket/*"
        ],
        "Effect": "Allow"
    }
  ]
 }

然后我通过添加一行来修复它 “arn:aws:s3:::bucketname”

{
"Version": "2012-10-17",
"Statement": [
    {
        "Action": [
            "s3:ListBucket",
            "s3:GetObject",
            "s3:GetObjectAcl"
        ],
        "Resource": [
             "arn:aws:s3:::<bucketname>",
            "arn:aws:s3:::<bucketname>/*",
            "arn:aws:s3:::*-bucket/*"
        ],
        "Effect": "Allow"
    }
 ]
}

【讨论】:

  • 这是我的问题 Bucket 上的通配符不适用于 ListBucket。我必须指定确切的存储桶名称。
【解决方案5】:

我遇到了同样的问题。我刚刚添加了凭据配置:

aws_access_key_id = your_aws_access_key_id
aws_secret_access_key = your_aws_secret_access_key

进入 "~/.aws/credentials" + 重启终端以获取默认配置文件。

如果是多配置文件--profile 需要添加arg:

aws s3 sync ./localDir s3://bucketName --profile=${PROFILE_NAME}

其中PROFILE_NAME

.bash_profile ( or .bashrc) -> export PROFILE_NAME="yourProfileName"

有关如何配置凭据和多配置文件的更多信息可以找到here

【讨论】:

    【解决方案6】:

    我尝试了以下方法:

    aws s3 ls s3.console.aws.amazon.com/s3/buckets/{bucket name}
    

    这给了我错误:

    An error occurred (AccessDenied) when calling the ListObjectsV2 operation: Access Denied
    

    使用此表格有效:

    aws s3 ls {bucket name}
    

    【讨论】:

      【解决方案7】:

      您必须通过"arn:aws:s3:::bucketname""arn:aws:3:::bucketname*" 为存储桶指定资源。后者是首选,因为它也允许对存储桶的对象进行操作。注意没有斜线!

      列出对象是对 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*"
              ]
          }
      ] 
      }
      

      【讨论】:

      • arn:aws:s3:::bucketname* 的问题在于它还允许访问arn:aws:s3:::bucketname-with-suffix
      • 正如所写,这是一个糟糕的政策;不要使用它。它应该允许 s3:ListBucket 针对 arn:aws:s3:::bucketname 和 s3:PutObject 针对 arn:aws:s3:::bucketname/*
      【解决方案8】:

      我认为错误是由于 "s3:ListObjects" 操作造成的,但我必须添加操作 "s3:ListBucket" 来解决“AccessDenied for S3 存储桶的 ListObjects"

      【讨论】:

        【解决方案9】:

        我添加的答案与已接受的答案方向相同,但差异很小(重要),并添加了更多细节。

        考虑下面的配置:

        {
          "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:::&lt;Bucket-Name&gt;,以便应用程序可以列出存储桶中的所有对象。

        第二个 Resource 元素为 PutObjectDeletObject 操作指定 arn:aws:s3:::&lt;Bucket-Name&gt;/*,以便应用程序可以写入或删除存储桶中的任何对象。

        出于安全原因,为了指定存储桶级别和对象级别的细粒度权限,将其分成两个不同的“arns”很重要。

        请注意,如果我在第二个块中仅指定 GetObject,那么在以编程方式访问的情况下,我会收到如下错误:

        Upload failed: &lt;file-name&gt; to &lt;bucket-name&gt;:&lt;path-in-bucket&gt; An error occurred (AccessDenied) when calling the PutObject operation: Access Denied.

        【讨论】:

          【解决方案10】:

          遇到了类似的问题,对我来说,问题是我在 bash_profile 中设置了不同的 AWS 密钥。

          我在这里回答了类似的问题:https://stackoverflow.com/a/57317494/11871462

          如果您的 bash_profile 中有冲突的 AWS 密钥,AWS CLI 会默认使用这些密钥。

          【讨论】:

            【解决方案11】:

            我遇到了这个问题 我的要求是允许用户写入特定路径

            {
                        "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>/*"
                        ]
                    },
            

            【讨论】:

              【解决方案12】:

              我比以前的任何答案都更喜欢这个。它展示了如何使用 YAML 格式并允许您使用变量来指定存储桶。

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

              【讨论】:

                【解决方案13】:

                要允许 s3 存储桶中的权限,请转到 s3 存储桶中的权限选项卡,然后在存储桶策略中将操作更改为此将允许执行所有操作:

                "Action":"*"
                

                【讨论】:

                  【解决方案14】:

                  我的问题是设置

                  env: 
                    AWS_ACCESS_KEY_ID: {{ secrets.AWS_ACCESS_KEY_ID }} 
                    AWS_SECRET_ACCESS_KEY: {{ secrets.AWS_SECRET_ACCESS_KEY }}
                  

                  再次,在 aws-sync GitHub Action 下作为环境变量。它们来自我的 GitHub 设置。尽管在我的情况下,我在上一步中扮演了一个角色,这将为我设置一些新的键到那些同名的环境变量中。所以我用坏的 GitHub 基本密钥覆盖了好的假设密钥。

                  如果您担任角色,请注意这一点。

                  【讨论】:

                    【解决方案15】:

                    我有同样的问题。我必须提供正确的资源和操作,资源是您所需权限中的存储桶的 arn 和操作。另请确保您拥有正确的用户 arn。以下是我的解决方案。

                    {
                        "Version": "2012-10-17",
                        "Id": "Policy1546414123454",
                        "Statement": [
                            {
                                "Sid": "Stmt1546414471931",
                                "Effect": "Allow",
                                "Principal": {
                                    "AWS": "arn:aws:iam::123456789101:root"
                                },
                                "Action": ["s3:ListBucket", "s3:ListBucketVersions"],
                                "Resource": "arn:aws:s3:::bucket-name"
                            }
                        ]
                    }
                    

                    【讨论】:

                      【解决方案16】:

                      这是对我有用的政策。

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

                      【讨论】:

                        【解决方案17】:

                        好的,对于已经完成上述所有操作但仍然遇到此问题的人,试试这个:

                        存储桶策略应如下所示:

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

                        然后保存并确保您的实例或 Lightsail 已连接到 AWS Configure 上的正确配置文件。

                        第一: 尝试在最后添加--recursive,运气好吗?没关系,试试下面的。

                        第二: 好的,现在试试这个:--no-sign-request

                        所以它应该是这样的:

                        sudo aws s3 sync s3://BUCKET_NAME /yourpath/path/folder --no-sign-request
                        

                        不客气?

                        【讨论】:

                          【解决方案18】:

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

                          所以我的解决方案是 - 在使用任何 AWS CLI 命令时使用配置文件 (mfa documentation) 提供 mfa 凭证。

                          【讨论】:

                            猜你喜欢
                            • 2014-12-06
                            • 2021-09-06
                            • 1970-01-01
                            • 2022-01-03
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 2012-02-22
                            • 2017-09-14
                            相关资源
                            最近更新 更多