当权限为 s3 时,S3 存储桶的 ListObjects 的访问被拒绝:*

AccessDenied for ListObjects for S3 bucket when permissions are s3:*

我得到:

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

当我尝试从我的 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

您已授予对 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/*"
          ]
      }
  ]
}

我无法访问 S3,因为

  • 首先我在实例上配置了密钥访问(启动后无法附加角色)
  • 几个月都忘了
  • 将角色附加到实例
  • 已尝试访问。 配置的密钥的优先级高于角色,访问被拒绝,因为用户未被授予必要的 S3 权限。

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

您必须通过 "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*"
        ]
    }
] 
}

尽管我有 "s3:ListBucket" 用于 s3:ListObjects 操作,但我在使用如下策略时遇到了同样的错误。

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

如果您想使用您提到的命令 "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

希望对您有所帮助!

我以为错误是由于 "s3:ListObjects" 操作造成的,但我不得不添加操作 "s3:ListBucket"解决问题"AccessDenied for ListObjects for S3 bucket"

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

aws_access_key_id = your_aws_access_key_id
aws_secret_access_key = your_aws_secret_access_key

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

在多profile的情况下--profile 需要添加arg:

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

其中 PROFILE_NAME:

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

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

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

我在这里回答了一个类似的问题:

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

我尝试了以下方法:

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}

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

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

我添加的答案与已接受答案的方向相同,但有一些小(重要)差异,并添加了更多详细信息。

考虑以下配置:

{
  "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 操作需要桶内对象的权限。

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

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

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

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

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

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

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

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

"Action":"*"

我的问题是设置

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

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

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

我遇到了同样的问题。我必须提供正确的资源和操作,资源是您的桶的 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"
        }
    ]
}

这是对我有用的政策。

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

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

存储桶策略应如下所示:

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

不客气

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

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

已开启MFA的亚马逊用户请使用: aws s3 ls s3://bucket-name --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)。