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

Jos*_*non 60 amazon-s3 aws-cli

我真的在 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"
      }
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

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

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

{
  "Statement": [
    {
      "Sid": "Stmt1384889624746",
      "Action": "s3:*",
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::my-bucket/*"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

结果一样。

小智 42

我也在为此苦苦挣扎,但我在这里找到了一个答案/sf/answers/1201408141/帮助我解决了这个问题。在下面重新发布答案。


您不必向所有人开放权限。在源和目标上使用以下存储桶策略,以便使用 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"}
   }
]
}
Run Code Online (Sandbox Code Playgroud)

在 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"}
   }
]
}
Run Code Online (Sandbox Code Playgroud)

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

  • 天哪,你是我的英雄。我只是在存储桶级别缺少 ListBucket 权限。我仍然不知道为什么我需要 ls 存储桶才能从中 cp 一个对象,但这没关系。也许这只是使用 aws 命令的一个怪癖? (2认同)

小智 16

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

aws s3 cp test.txt s3://my-s3-bucket --sse AES256
Run Code Online (Sandbox Code Playgroud)

  • 谢谢!就我而言,使用存储桶“默认”是`--sse aws:kms`... (3认同)

Mar*_*ian 6

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

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

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


小智 5

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

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

即任何拥有 aws 帐户的人都可以公开读/写。