首页 文章

添加完全控制标头后,无法从S3下载对象

提问于
浏览
0

场景:

我有基于IP条件的公共读/写桶 .

当匿名用户上传文件时,所有者是 65a011a29cdf8ec533ec3d1ccaae921c 我无法重命名/移动/复制此类文件,因为我'm lacking permissions and bucket replication is not working for them for the same reason. However i can delete (because I' m桶所有者)和白名单IP中的其他人都可以使用S3提供的链接下载它们 .

此标头已添加到用于上载内容的脚本中,以解决复制问题 .

{'x-amz-grant-full-control': 'id=my canonical id'}

现在我完全控制对象和复制工作正常,但我不能使用S3或wget或CLI的链接下载它们实际上没有人能...

HTTP request sent, awaiting response... 403 Forbidden
2017-09-22 00:04:32 ERROR 403: Forbidden.

只有S3 Web界面中文件概述的下载按钮似乎可以正常工作 .

为什么在应用此ACL后,对象不再符合存储桶策略?

2 回答

  • 0

    好吧,我认为可能是这种情况,但想确认一些细节 .

    S3有两种不同的权限模型: Access Control Lists (ACL)和 Bucket Policies .

    Access Control Lists

    S3中的每个对象都有自己的 Access Control List (ACL) . 有了这个,个人用户可以授予对单个文件的读访问权限 . 这也可以授予对Bucket Owner的访问权限以便能够控制文件 .

    Bucket Policies

    这使用更具描述性的权限格式,类似于IAM策略 . 有了它,可以为跨账户访问,特定IAM用户和角色等授予访问权限 .

    Bucket Policies are only observed when the owner of the object is also the owner of the bucket .

    Options

    • 让您的脚本同时授予对象的ACL公共读取权限

    • 使用您的应用程序(EC2,Lambda)生成的签名网址,以允许用户代表您安全上传

    • 让对象所有者动态更改 . 这将涉及在PutObject上执行的lambda函数,如果存储桶拥有者和对象所有者不同,则将对象复制回来 .

  • 0

    您好Jamie谢谢您的简明回答,我想出了这个脚本,将所有者从匿名更改为桶主:

    #!/usr/bin/env bash
    
    ARRAY=($(aws s3 ls --recursive s3://mybucket/folder/ | awk '{print $4}'))
    
    for key in "${ARRAY[@]}"; do
      echo "$key";
      aws s3api put-object-acl \
      --bucket mybucket        \
      --key "$key"             \
      --grant-full-control     \
      --no-sign-request        \
      "id=bucket owner canonical id"; done
    
    aws s3 mv s3://mybucket/folder/ s3://mybucket/folder-copy/ --recursive
    sleep 10;
    aws s3 mv s3://mybucket/folder-copy/ s3://mybucket/folder/ --recursive
    

    大约150GB的数据需要68m45.076s . 不打算再使用匿名上传了:)

相关问题