Amazon S3文件权限,从其他帐户复制时拒绝访问

问题描述 投票:14回答:6

我有一组视频文件从一个AWS Bucket从另一个帐户复制到我自己的存储桶中的帐户。

我现在遇到一个问题,当我尝试将所有文​​件公开时,我收到了拒绝访问错误的所有文件。

具体来说,我登录到我的AWS账户,进入S3,深入查看文件夹结构,找到其中一个视频文件。

当我查看此特定文件时,文件上的权限选项卡不会显示分配给任何人的任何权限。未分配任何用户,组或系统权限。

在权限选项卡的底部,我看到一个小框,显示“错误:访问被拒绝”。我无法改变文件的任何内容。我无法添加元数据。我无法将用户添加到该文件中。我无法将文件设为Public。

有没有办法让我可以控制这些文件,以便我可以公开它们?有超过15,000个文件/大约60GB的文件。我想避免下载和重新上传所有文件。

在这里的一些帮助和建议下,我尝试了以下内容。我在我的桶中创建了一个名为“media”的新文件夹。

我试过这个命令:

aws s3 cp s3://mybucket/2014/09/17/thumb.jpg s3://mybucket/media --grants read=uri=http://acs.amazonaws.com/groups/global/AllUsers full=emailaddress=my_aws_account_email_address

调用HeadObject操作时收到致命错误403:禁止。

amazon-web-services amazon-s3 file-permissions
6个回答
23
投票

一个非常有趣的难题!幸运的是,有一个解决方案。

首先,回顾一下:

  • 账户A中的A桶
  • 账户B中的B桶
  • 帐户A中的用户将对象复制到Bucket B(已被授予相应的权限)
  • 存储桶B中的对象仍属于帐户A,帐户B无法访问

我设法重现了这一点,并确认帐户B中的用户无法访问该文件 - 甚至不是帐户B中的root用户!

幸运的是,事情可以修复。 aws s3 cp中的AWS Command-Line Interface (CLI)命令可以在复制到同一名称时更新文件的权限。但是,要触发此操作,您还必须更新其他内容,否则会出现此错误:

此复制请求是非法的,因为它试图将对象复制到自身而不更改对象的元数据,存储类,网站重定向位置或加密属性。

因此,可以使用以下命令更新权限:

aws s3 cp s3://my-bucket/ s3://my-bucket/ --recursive --acl bucket-owner-full-control --metadata "One=Two"
  • 必须由帐户运行具有对象访问权限的用户(例如,最初将对象复制到Bucket B的用户)
  • 元数据内容并不重要,但需要强制更新
  • --acl bucket-owner-full-control将授予帐户B许可,以便您能够正常使用这些对象

最终结果:你可以使用一个水桶!


2
投票
aws s3 cp s3://account1/ s3://accountb/ --recursive --acl bucket-owner-full-control 

1
投票

如果有人试图这样做但使用Hadoop / Spark作业而不是AWS CLI。

  • 步骤1:在帐户A中授予用户将对象复制到Bucket B的相应权限。(在上面的答案中提到)
  • 步骤2:使用Hadoop Configuration设置fs.s3a.acl.default配置选项。这可以在conf文件或程序中设置: 配置文件: <property> <name>fs.s3a.acl.default</name> <description>Set a canned ACL for newly created and copied objects. Value may be Private, PublicRead, PublicReadWrite, AuthenticatedRead, LogDeliveryWrite, BucketOwnerRead, or BucketOwnerFullControl.</description> <value>$chooseOneFromDescription</value> </property> 编程方式: spark.sparkContext.hadoopConfiguration.set("fs.s3a.acl.default", "BucketOwnerFullControl")

1
投票

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

[...]
{
    "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(免责声明:由我撰写)


0
投票

我担心你无法按照自己的意愿转让所有权。这是你做的:

旧帐户将对象复制到新帐户。

这样做的“正确”方式(假设您想要承担新帐户的所有权)将是:

新帐户从旧帐户复制对象。

看到小而重要的区别? S3 docs有点解释它。

我认为你可以通过复制同一个存储桶中的所有文件,然后删除旧文件,而无需下载整个文件。确保您可以在执行复制后更改权限。这样可以节省一些钱,因为您无需支付下载所有内容的数据传输费用。


0
投票

通过推杆

--acl bucket-owner-full-control让它发挥作用。

© www.soinside.com 2019 - 2024. All rights reserved.