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

时间:2016-08-04 18:26:09

标签: amazon-web-services amazon-s3

我正在

  

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

16 个答案:

答案 0 :(得分:134)

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

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

答案 1 :(得分:19)

如果要使用命令" aws s3 cp s3:// bucket-name / data / all-data /递归复制所有s3存储桶对象。 --recursive"正如您所提到的,这是执行此操作所需的最低政策:

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

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

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

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

希望这有帮助!

答案 2 :(得分: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*"
        ]
    }
] 
}

答案 3 :(得分:4)

我无法访问S3,因为

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

解决方案:WKWebViewConfiguration * config = [WKWebViewConfiguration new]; config.websiteDataStore = [WKWebsiteDataStore nonPersistentDataStore]; webView = [[WKWebView alloc]initWithFrame:viewFrame configuration:config]; ,然后rm -rf .aws/credentials使用角色。

答案 4 :(得分:2)

我在使用如下政策时遇到了同样的错误,虽然我有" 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"
    }
  ]
 }

然后我通过添加一行来修复它 &#34; arn:aws:s3 ::: bucketname&#34;

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

答案 5 :(得分:2)

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

答案 6 :(得分:2)

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

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

答案 7 :(得分:1)

我尝试了以下操作:

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}

答案 8 :(得分:0)

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

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

如果您的bash_profile中的AWS密钥冲突,则AWS CLI默认为这些密钥。

答案 9 :(得分:0)

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

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

答案 10 :(得分: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>/*PutObject操作指定DeletObject,以便应用程序可以写入或删除存储桶中的任何对象。

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

请注意,如果我在第二个块中仅指定了GetObject,将会发生的情况是,在进行程序访问的情况下,我将收到类似以下的错误:

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

答案 11 :(得分:0)

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

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

答案 12 :(得分:0)

我的问题是设置

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 基本密钥覆盖了好的假设密钥。

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

答案 13 :(得分:0)

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

答案 14 :(得分:0)

这是对我有用的政策。

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

答案 15 :(得分:-1)

要在s3存储桶中允许权限,请转至s3存储桶中的“权限”标签,然后在存储桶策略中将操作更改为此,这将允许执行所有操作:

let test1 = '2=2'; 
let test2 = '8<7'; 
let test3 = '5=13';
let test4 = '15>4'; 

function isTrue(relation) {
    let separate = []; 
    let num1 = 0;
    let num2 = 0;
    let newArray = []; 
    let a = 0;
    let b = 0; 
    if (relation.includes('=')) { 
        separate = relation.split('='); 
        num1 = parseInt(separate[0]);
        num2 = parseInt(separate[1]); 
        newArray = [num1, num2]; 
        a = newArray[0];
        b = newArray[1]; 
        if (a === b) {
            return true; 
        } else {
            return false;
        }
    } else if (relation.includes('<')) {
        separate = relation.split('<'); 
        num1 = parseInt(separate[0]);
        num2 = parseInt(separate[1]); 
        newArray = [num1, num2]; 
        a = newArray[0];
        b = newArray[1]; 
        if (a < b) {
            return true; 
        } else {
            return false;
        }
    } else if (relation.includes('>')) {
        separate = relation.split('>'); 
        num1 = parseInt(separate[0]);
        num2 = parseInt(separate[1]); 
        newArray = [num1, num2]; 
        a = newArray[0];
        b = newArray[1]; 
        if (a > b) {
            return true; 
        } else {
            return false;
        }
    } else {
        return 'This is not a valid comparison. Please try again.'; 
    }
}

isTrue(test1);
isTrue(test2);
isTrue(test3);
isTrue(test4);