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

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

我在 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虽然我可以使用相同的命令和默认(根帐户?)访问密钥下载。

我也尝试添加用户策略。虽然我不知道为什么需要这样做,但我认为这不会有什么坏处,所以我将其附加到 my-user。

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

结果相同。

答案1

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


您不必向所有人开放权限。使用以下源和目标上的存储桶策略,使用 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

答案2

当我遇到同样的问题时,结果发现 AWS 要求启用服务器端加密。因此,以下命令对我来说成功了:

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

答案3

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

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

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

答案4

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

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

相关内容