权限为s3时,对于S3存储桶的ListObjects的AccessDenied:*

use*_*335 106 amazon-s3 amazon-web-services

我正进入(状态

调用ListObjects操作时发生错误(AccessDenied):拒绝访问

当我尝试从我的S3存储桶中获取文件夹时.

使用此命令

aws s3 cp s3://bucket-name/data/all-data/ . --recursive
Run Code Online (Sandbox Code Playgroud)

存储桶的IAM权限如下所示

{
"Version": "version_id",
"Statement": [
    {
        "Sid": "some_id",
        "Effect": "Allow",
        "Action": [
            "s3:*"
        ],
        "Resource": [
            "arn:aws:s3:::bucketname/*"
        ]
    }
] }
Run Code Online (Sandbox Code Playgroud)

我需要做什么改变,以便能够copyls成功?

Mar*_*k B 160

您已授权对S3存储桶内的对象执行命令,但您未授权对存储桶本身执行任何操作.将您的政策修改为以下内容:

{
  "Version": "version_id",
  "Statement": [
    {
        "Sid": "some_id",
        "Effect": "Allow",
        "Action": [
            "s3:*"
        ],
        "Resource": [
            "arn:aws:s3:::bucketname",
            "arn:aws:s3:::bucketname/*"
        ]
    }
  ] 
}
Run Code Online (Sandbox Code Playgroud)

  • 这是一个太宽的动作列表.对于列表和复制权利,您建议采取哪些措施. (39认同)
  • 另外一定不要写"资源":["arn:aws:s3 ::: bucketname /","arn:aws:s3 ::: bucketname/*"]`就像我做的那样(即你只想要一个斜线)在`*`之前 - 花了我4个小时才意识到这个错误导致我所有的`listObjects`调用都失败了...... (6认同)
  • @domfarr我只是尽可能地调整OPs策略以使其适用于他.如果您有特定问题,则应将其作为单独的问题在本网站上发布,而不是在评论中添加标签.虽然查看S3操作列表并构建所需的策略应该非常容易. (5认同)
  • 我没有加标签。OP确实要求复制和ls需要什么。包括缺少存储桶级别的信息,但是您没有调整操作...因此,我发表了意见。 (4认同)

Rob*_*ith 28

如果你想使用你提到的命令"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/*"
          ]
      }
  ]
}
Run Code Online (Sandbox Code Playgroud)

此策略中的第一个语句允许列出存储桶内的对象.请注意,使用此设置,您还可以在此存储桶的子目录中列出对象.似乎不能仅对s3子目录赋予ls权限,因此尝试将此操作应用于资源"arn:aws:s3 ::: // bucket-name/data/all-data /"won'按预期工作(我已经测试并尝试了多种方法,这里的帮助将不胜感激).

此策略中的第二个语句允许在特定子目录中获取存储桶内的对象.这意味着您将能够复制"s3:// bucket-name/data/all-data /"路径中的任何内容.请注意,这不允许您从父路径复制,例如"s3:// bucket-name/data /".

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

希望这有帮助!


小智 9

您必须通过"arn:aws:3 ::: 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*"
        ]
    }
] 
}
Run Code Online (Sandbox Code Playgroud)

  • `arn:aws:s3 ::: bucketname*`的问题在于它还允许访问`arn:aws:s3 ::: bucketname-with-suffix` (19认同)
  • 正如所写,这是一项糟糕的政策;不要使用它。它应该允许 s3:ListBucket 针对 arn:aws:s3:::bucketname 和 s3:PutObject 针对 arn:aws:s3:::bucketname/* (3认同)

张健健*_*张健健 9

对于启用了 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、用户名和 928371)。 在此输入图像描述


Bon*_*mes 8

对于那些已经完成上述所有操作但仍然遇到此问题的人,请尝试以下操作:

存储桶策略应该如下所示:

{
    "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/*"
            ]
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

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

首先: 尝试--recursive在最后添加,幸运吗?不行,可以试试下面这个。

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

所以它应该看起来像这样:

sudo aws s3 sync s3://BUCKET_NAME /yourpath/path/folder --no-sign-request
Run Code Online (Sandbox Code Playgroud)

不客气


Put*_*nik 7

我无法访问S3,因为

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

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


Iho*_*lyk 7

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

aws_access_key_id = your_aws_access_key_id
aws_secret_access_key = your_aws_secret_access_key
Run Code Online (Sandbox Code Playgroud)

进入“~/.aws/credentials” + 重新启动默认配置文件的终端。

在多配置文件的情况下,需要添加--profile arg:

aws s3 sync ./localDir s3://bucketName --profile=${PROFILE_NAME}
Run Code Online (Sandbox Code Playgroud)

其中PROFILE_NAME

.bash_profile ( or .bashrc) -> export PROFILE_NAME="yourProfileName"
Run Code Online (Sandbox Code Playgroud)

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


Gab*_* Wu 5

使用以下策略时,我遇到了相同的错误,尽管我对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"
    }
  ]
 }
Run Code Online (Sandbox Code Playgroud)

然后我通过添加一行 “ 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"
    }
 ]
}
Run Code Online (Sandbox Code Playgroud)


Hen*_*nry 5

我尝试了以下方法:

aws s3 ls s3.console.aws.amazon.com/s3/buckets/{bucket name}
Run Code Online (Sandbox Code Playgroud)

这给了我错误:

An error occurred (AccessDenied) when calling the ListObjectsV2 operation: Access Denied
Run Code Online (Sandbox Code Playgroud)

使用这种形式工作:

aws s3 ls {bucket name}
Run Code Online (Sandbox Code Playgroud)