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


57

我确实在AWS中四处乱逛,试图找出我在这里缺少的内容。我想这样做,以便IAM用户可以从S3存储桶下载文件-而不只是将文件完全公开-但我被拒绝访问。如果有人能发现发生了什么事,我会被感动。

到目前为止,我所做的是:

  • 创建了一个名为my-user的用户(例如)
  • 为用户生成访问密钥,并将其放在EC2实例上的〜/ .aws中
  • 创建了一个存储桶策略,希望该策略可以为我的用户授予访问权限
  • 跑命令 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尽管我可以使用相同的命令和默认(根帐户?)访问密钥进行下载。

我也尝试添加用户策略。虽然我不知道为什么有必要这样做,但我认为这不会造成伤害,因此我将其附加到了用户身上。

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

结果相同。

Answers:


39

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


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

要从中复制的存储桶– SourceBucket

要复制到的存储桶– DestinationBucket

源AWS账户ID-XXXX–XXXX-XXXX

源IAM用户-src–iam用户

以下策略意味着– IAM用户-XXXX–XXXX-XXXX:src–iam用户在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


1
哦,天哪,你是我的英雄。我只是在存储桶级别缺少ListBucket许可。我仍然不知道为什么我需要通过ls bucket来从中存储对象,但这没关系。也许这只是使用aws命令的怪癖?
Josh Gagnon

是的,这很奇怪。您可能会认为,只有一个s3:*策略(尽管可能是不安全的)足以进行健全性测试。
塞尔吉奥

fml,该ListBucket权限浪费了2天。好
收成

花了很多时间..这是需要的答案。ListBucket-存储桶名称,GetObject-存储桶名称/ *
rsmoorthy

12

当我遇到相同的问题时,事实证明AWS需要启用服务器端加密。所以以下命令对我来说成功地工作了:

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

3
谢谢!在我的情况下,它是--sse aws:kms使用存储桶“默认” ...
Michael Yoo '18

如果您使用的是非默认KMS密钥,则还需要传递该密钥:--sse-kms-key-id 0123-abc-etc 但是,尚不清楚的部分是,要使用您自己的KMS密钥,您必须具有IAM权限,kms:GenerateDataKey否则您仍将被拒绝访问。
digarok

问题是关于下载..您正在将文件上传到加密的S3,因此需要密钥。
Ilhicas

4

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

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

即对拥有aws帐户的任何人进行公共读/写。


你测试过了吗?我给人的印象是,AWS账户实际上是指与我的组织相关的任何实体,即用户,EC2实例,IAM角色,但不是来自其他账户的人。我可能是错的,如果是这种情况,我将编辑我的文稿并快速审核我的存储桶。谢谢。
James Dunmore

1
对。S3 ACL中的“授权用户”被授权者是指所有AWS账户。它执行已签名的请求,但仅此而已。参考:链接
Andrew

3

我设法解决了这一问题,而无需编写策略-从S3控制台(Web ui)中,我选择了存储桶,然后在权限选项卡中选择了“任何经过身份验证的AWS用户”,并对所有复选框进行了标记。

更新:正如评论中指出的那样,“任何经过身份验证的AWS用户”不仅是您帐户中的用户,而且还是所有经过AWS身份验证的用户,请谨慎使用


我想这正在为您制定政策。勾选所有框将为您提供ListBucket等。
乔什·加农

我确定是的-我只知道写政策可能会很痛苦,那些复选框可能会给您带来更多
好处,

2

即使您的IAM策略设置正确,An error occurred (AccessDenied) when calling the <OPERATION-NAME> operation: Access Denied由于凭据上的MFA(多重身份验证)要求,您仍然会收到错误消息。这些可以使您措手不及,因为如果您已经登录到AWS控制台,则看来您的凭证可以正常使用,并且来自aws cli的权限被拒绝的错误消息不是特别有用。

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

基本上,您需要获取MFA设备的地址,并将其与设备中的代码一起发送以获取临时令牌。


你救了我的兄弟!
shintaroid

是的,这就是原因!为什么AWS在输出中没有显示此原因?
tommy.qichang

0

我只是简单地进入webUI并单击存储桶,然后进入权限然后进入策略。当我打开它时,我只是单击删除。我这样做是因为我认为它也是配置。

我回到了s3主页,然后单击存储桶并尝试将其删除,它起作用了。

即使当我通过aws-cli使用

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

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


0

一旦我通过尝试运行得到此错误:

aws s3 cp s3://[bucketName]/[fileName] .

在我没有权限的文件夹中。这很愚蠢,但是在继续之前,请确保您是所在文件夹的所有者!


0

当您插入无效的资源或对象名称时,就会出现问题。我在boto3中遇到了相同的问题(在我的情况下,这是无效的存储桶名称)

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.