尝试下载文件时从 s3 获取 403 禁止

Getting 403 forbidden from s3 when attempting to download a file

我在 s3 上有一个存储桶,一个用户获得了对该存储桶的完全访问权限。

我可以执行 ls 命令并查看存储桶中的文件,但下载失败:

A client error (403) occurred when calling the HeadObject operation: Forbidden

我还通过 IAM 控制台对授予完全 S3 权限的用户进行了尝试。同样的问题。

作为参考,这是我的 IAM 政策:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:ListAllMyBuckets",
            "Resource": "arn:aws:s3:::*"
        },
        {
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::mybucket",
                "arn:aws:s3:::mybucket/*"
            ]
        }
    ]
}

我也尝试添加存储桶策略,甚至创建存储桶 public,但仍然不行...此外,我尝试从控制台为存储桶中的文件设置单独的权限,并且收到一条错误消息,说我无法查看存储桶,这很奇怪,因为当消息出现时我正在从控制台查看它,并且可以 ls 存储桶中的任何内容。

编辑 我存储桶中的文件是使用我帐户的凭据从属于不同帐户的另一个存储桶复制到那里的。可能相关也可能不相关...

2nd EDIT 刚刚尝试从其他存储桶上传、下载和复制我自己的文件到这个存储桶或从这个存储桶,它工作正常。问题特别在于从另一个帐户的存储桶中放置的文件。

谢谢!

我认为您需要确保当 moving/copying 在具有 "bucket-owner-full-control" acl 的存储桶之间时将权限应用于对象。

以下是有关如何在移动或复制文件以及追溯时执行此操作的详细信息: https://aws.amazon.com/premiumsupport/knowledge-center/s3-bucket-owner-access/

此外,您可以在此处阅读有关各种预定义赠款的信息: http://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html#canned-acl

这里的问题源于您如何将文件放入存储桶中。具体来说,您在上传时拥有 and/or 权限的凭据 运行t。当我有多个 AWS 账户时,我 运行 遇到了类似的权限问题,即使我的存储桶策略非常开放(就像你的一样)。在上传到另一个帐户 (A2) 拥有的存储桶时,我不小心使用了一个帐户(称为 A1)的凭据。因此,A1 保留了对对象 的权限 ,而存储桶所有者没有获得这些权限。在这种情况下,上传时至少有 3 种可能的方法可以解决此问题:

  • 切换帐户。 运行 $export AWS_DEFAULT_PROFILE=A2 或者,对于更永久的更改,请修改 ~/.aws/credentials~/.aws/config 以将正确的凭据和配置移动到 [default] 下。然后重新上传。
  • 上传时指定其他配置文件:aws s3 cp foo s3://mybucket --profile A2
  • 开放存储桶拥有者的权限(不需要更改配置文件):aws s3 cp foo s3://mybucket --acl bucket-owner-full-control

请注意,前两种方式涉及拥有单独的 AWS 配置文件。如果您想保留两组可用的帐户凭据,这是可行的方法。您可以通过 aws configure --profile Foo 使用您的密钥、区域等设置配置文件。有关命名配置文件的更多信息,请参阅 here

还有一些稍微复杂的方法可以追溯执行此操作(post 上传),您可以阅读 here

要为新添加的文件正确设置适当的权限,请添加此存储桶策略:

[...]
{
    "Effect": "Allow",
    "Principal": {
        "AWS": "arn:aws:iam::123456789012::user/their-user"
    },
    "Action": [
        "s3:PutObject",
        "s3:PutObjectAcl"
    ],
    "Resource": "arn:aws:s3:::my-bucket/*"
}

您的存储桶政策更加开放,所以这不是阻碍您的原因。

但是,上传者需要为新创建的文件设置ACL。 Python 示例:

import boto3

client = boto3.client('s3')
local_file_path = '/home/me/data.csv'
bucket_name = 'my-bucket'
bucket_file_path = 'exports/data.csv'
client.upload_file(
    local_file_path,
    bucket_name, 
    bucket_file_path, 
    ExtraArgs={'ACL':'bucket-owner-full-control'}
)

来源:https://medium.com/artificial-industry/how-to-download-files-that-others-put-in-your-aws-s3-bucket-2269e20ed041(免责声明:由我撰写)