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

时间:2017-05-01 16:33:33

标签: amazon-web-services amazon-s3 file-permissions

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

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

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

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

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

有没有办法可以控制这些文件以便我公开?有超过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:Forbidden。

7 个答案:

答案 0 :(得分:22)

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

首先,回顾一下:

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

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

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

  

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

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

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权限,以便您能够正常使用这些对象

最终结果:您可以使用的水桶!

答案 1 :(得分:1)

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

答案 2 :(得分:1)

万一有人尝试使用Hadoop / Spark作业而不是AWS CLI来做同样的事情。

  • 步骤1:授予帐户中的用户适当的复制权限 反对桶B。(在上面的答案中提到)
  • 步骤2:使用Hadoop配置设置fs.s3a.acl.default配置选项。这可以在conf文件或程序中设置:

    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")

答案 3 :(得分: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(免责声明:由我撰写)

答案 4 :(得分:0)

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

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

&#34;对&#34;这样做的方式(假设您想要承担新帐户的所有权)将是:

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

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

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

答案 5 :(得分:0)

通过放置

  

-acl桶所有者完全控制   使它起作用。

答案 6 :(得分:0)

boto3“ copy_object”解决方案:

向目标存储桶所有者提供授予控制权

client.copy_object(CopySource=copy_source, Bucket=target_bucket, Key=key, GrantFullControl='id=<bucket owner Canonical ID>')
  • 获取控制台
  • 选择存储区,“权限”标签,“访问控制列表”标签