使用aws cli从Amazon S3下载时,导致访问被拒绝的原因是什么?

我真的在AWS中徘徊,试图找出我在这里失踪的东西。 我想使它成为一个IAM用户可以从S3存储桶下载文件 – 而不是只是使文件完全公开 – 但我得到访问被拒绝。 如果任何人都可以发现什么closures,我会兴奋。

到目前为止我所做的是:

  • 创build了一个名为my-user的用户(为了举例)
  • 为用户生成访问密钥,并将其放入EC2实例的〜/ .aws中
  • 创build了我希望为我的用户授予访问权限的存储桶策略
  • 运行命令aws s3 cp --profile my-user s3://my-bucket/thing.zip .

时段策略:

 { "Id": "Policy1384791162970", "Statement": [ { "Sid": "Stmt1384791151633", "Action": [ "s3:GetObject" ], "Effect": "Allow", "Resource": "arn:aws:s3:::my-bucket/*", "Principal": { "AWS": "arn:aws:iam::111122223333:user/my-user" } } ] } 

结果是A client error (AccessDenied) occurred: Access Denied虽然我可以使用相同的命令和默认(root帐户)访问键下载。

我也尝试添加用户策略。 虽然我不知道为什么这是必要的,我认为它不会受到伤害,所以我把它附加到我的用户。

 { "Statement": [ { "Sid": "Stmt1384889624746", "Action": "s3:*", "Effect": "Allow", "Resource": "arn:aws:s3:::my-bucket/*" } ] } 

相同的结果。

    我也在为此苦苦挣扎,但是我在这里find了一个解决这个问题的答案https://stackoverflow.com/a/17162973/1750869 。 重新下面的答案。


    您不必向每个人开放权限。 在源和目标上使用以下Bucket策略,使用IAM用户从一个帐户中的存储桶复制到另一个帐户

    从 – SourceBucket复制桶

    桶复制到 – DestinationBucket

    源AWS账户ID – XXXX-XXXX-XXXX

    源IAM用户 – src-iam-user

    以下策略意味着IAM用户XXXX-XXXX-XXXX:src-iam-user在SourceBucket / *上具有s3:ListBucket和s3:GetObject特权,在DestinationBucket / *上具有s3:ListBucket和s3:PutObject特权。

    在SourceBucket上,策略应该是这样的:

     { "Id": "Policy1357935677554", "Statement": [ { "Sid": "Stmt1357935647218", "Action": [ "s3:ListBucket" ], "Effect": "Allow", "Resource": "arn:aws:s3:::SourceBucket", "Principal": {"AWS": "arn:aws:iam::XXXXXXXXXXXX:user/src–iam-user"} }, { "Sid": "Stmt1357935676138", "Action": ["s3:GetObject"], "Effect": "Allow", "Resource": "arn:aws:s3::: SourceBucket/*", "Principal": {"AWS": "arn:aws:iam::XXXXXXXXXXXX:user/src–iam-user"} } ] } 

    在DestinationBucket的政策应该是:

     { "Id": "Policy1357935677554", "Statement": [ { "Sid": "Stmt1357935647218", "Action": [ "s3:ListBucket" ], "Effect": "Allow", "Resource": "arn:aws:s3::: DestinationBucket", "Principal": {"AWS": "arn:aws:iam::XXXXXXXXXXXX:user/src–iam-user"} }, { "Sid": "Stmt1357935676138", "Action": ["s3:PutObject"], "Effect": "Allow", "Resource": "arn:aws:s3::: DestinationBucket/*", "Principal": {"AWS": "arn:aws:iam::XXXXXXXXXXXX:user/src–iam-user"} } ] } 

    要运行的命令是s3cmd cp s3://SourceBucket/File1 s3://DestinationBucket/File1

    我不会推荐James提到的“任何经过身份validation的AWS用户”选项。

    这样做会添加一个存储区级别的ACL,允许任何AWS账户(不仅仅是您的IAM用户)为该存储区列出/删除/修改acls。

    即对任何拥有aws账户的人来说公开读/写。

    我设法解决这个问题,而不必写政策 – 从S3控制台(networking用户界面)我select了存储桶,并在权限选项卡中select“任何经过身份validation的AWS用户”和门票的所有框。

    更新:正如在评论中指出的“任何经过身份validation的AWS用户”不仅仅是您帐户中的用户,它是所有AWSauthentication的用户,请谨慎使用

    即使您的IAM策略设置正确,仍可以An error occurred (AccessDenied) when calling the <OPERATION-NAME> operation: Access Denied如下An error occurred (AccessDenied) when calling the <OPERATION-NAME> operation: Access Denied由于证书的MFA(多重身份validation)要求, An error occurred (AccessDenied) when calling the <OPERATION-NAME> operation: Access Denied 。 这些可以抓住你的警惕,因为如果你已经login到AWS控制台,它会出现你的凭据工作正常,并从aws cli拒绝错误信息的权限并不特别有用。

    关于如何使用aws cli设置MFA,有一些很好的说明:

    • AWS – 使用MFA令牌validationAWS CLI
    • 堆栈溢出 – 如何在AWS CLI中使用MFA?

    基本上,您需要获得MFA设备的地址,并使用设备中的代码发送该代码以获取临时令牌。

    当我遇到同样的问题时,事实certificate,AWS需要启用服务器端encryption。 所以下面的命令为我成功地工作:

     aws s3 cp test.txt s3://my-s3-bucket --sse AES256 

    我只是简单地走在webUI上,点击了桶,然后去权限,然后去政策。 当我打开它,我只是点击删除。 我这样做,我认为这也是configuration。

    我回到主页s3页面,然后点击存储桶,试图删除它,它的工作。

    即使我是通过aws-cli使用的

     $ aws s3 rb s3://bucket-name --force 

    无论如何,那是对我有用的东西。 权限策略阻止您删除存储桶。