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


134

我正进入(状态:

调用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成功?


1
就我而言,我已经aws为一个用户配置并在另一个用户的cronjob称为bash脚本中使用了它,这意味着访问密钥和访问令牌错误/未设置。我的解决方案是将凭据(AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY)直接放入bash脚本文件中,如此处所述
Uwe Keim '18

Answers:


199

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

稍微修改策略如下所示:

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

但是,这可能会提供比所需更多的权限。遵循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/*"
          ]
      }
  ]
}

40
动作列表太宽。对于列表和复制权,您建议采取的措施是。
dom farr

6
@domfarr我只是在尽可能少地调整OP政策以使其适用于他。如果您有特定的问题,则应将其作为单独的问题发布在此网站上,而不要在该问题上添加评论。尽管查看S3操作列表并构建所需的策略应该很容易。
Mark B

4
我没有标记。OP确实要求复制和ls需要什么。包括缺少存储桶级别的arn,但是您没有调整Actions ...因此我发表了评论。
dom farr

1
也许直接将适当的角色分配给EC3应该可行。:)
ChikuMiku

6
另外请确保不要"Resource": [ "arn:aws:s3:::bucketname/", "arn:aws:s3:::bucketname/*" ]像我那样写(即,您只想在之前加一个斜线*)–花了我4个多小时才意识到这个错误导致我的所有listObjects电话都失败了
Daniel Kis-Nagy

35

如您所述,如果要使用命令“ 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存储桶的信息,并且要将列表限制为该存储桶中的仅子目录,您可以编辑“ 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

希望这可以帮助!


1
实际上,似乎可以限制ListBucket在一个子项上:stackoverflow.com/a/35952877/89218
paleozogt

感谢您让我知道,我将在我当前的一些项目中尝试!
罗伯·史密斯

谢谢。没想到非第一答案可能对我有帮助
Vyacheslav Tsivina

确实有可能,aws.amazon.com
blogs / security /…

我已经编辑了答案,以包含一个条件来限制列出位于特定子文件夹下的对象。谢谢您的帮助!
罗伯·史密斯

8

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

列出对象是对Bucket的一项操作。因此,需要执行动作“ s3:ListBucket”。将对象添加到存储桶是对对象的一项操作。因此,需要采取措施“ s3:PutObject”。当然,您可能需要根据需要添加其他操作。

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

21
问题arn:aws:s3:::bucketname*在于它还允许访问arn:aws:s3:::bucketname-with-suffix
Guss

1
按照书面规定,这是一个糟糕的政策。不要使用它。应该允许针对arn:aws:s3 ::: bucketname的s3:ListBucket和针对arn:aws:s3 ::: bucketname / *的s3:PutObject / *
jarmod

7

我无法访问S3,因为

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

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


1
完全一样的问题。一个症状是一个用户可以访问另一个用户无法在同一EC2节点上执行的操作。
Doc Kaos

6

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

4

我以为该错误是由于“ s3:ListObjects”操作引起的,但我不得不添加操作 “ s3:ListBucket”以解决“针对S3存储桶的ListObjects的AccessDenied”问题


4

我面临着同样的问题。我刚刚添加了凭据配置:

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"

有关如何配置凭据和多配置文件的更多信息,请参见此处。


2

我尝试了以下方法:

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}

0

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

请考虑以下配置:

{
  "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元素arn:aws:s3:::<Bucket-Name>用于指定ListBucket操作,以便应用程序可以列出存储桶中的所有对象。

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

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

请注意,如果仅GetObject在第二个块中指定了内容,那么在程序访问的情况下,我将收到类似以下的错误:

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



-1

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

{
            "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>/*"
            ]
        },
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.