S3:再次将公用文件夹设为私有?

Goo*_*ets 56 acl amazon-s3 amazon-web-services

如何再次将AWS S3公用文件夹设为私有?

我正在测试一些临时数据,所以我在一个桶中公开了整个文件夹.我想再次限制它的访问权限.那么如何让文件夹再次保密呢?

non*_*ing 55

接受的答案很有效 - 似乎也在给定的s3路径上递归设置ACL.但是,这也可以通过名为s3cmd的第三方工具更轻松地完成- 我们在公司中大量使用它,它似乎在AWS社区中相当受欢迎.

例如,假设你有这种s3桶和dir结构:s3://mybucket.com/topleveldir/scripts/bootstrap/tmp/.现在假设您已scripts使用Amazon S3控制台将整个"目录" 标记为公共.

现在再次将整个scripts"目录树"递归(即包括子目录及其文件)私有:

s3cmd setacl --acl-private --recursive s3://mybucket.com/topleveldir/scripts/
Run Code Online (Sandbox Code Playgroud)

scripts如果你想要的话,也可以很容易地再次公开"目录树":

s3cmd setacl --acl-public --recursive s3://mybucket.com/topleveldir/scripts/
Run Code Online (Sandbox Code Playgroud)

您也可以通过简单地省略--recursive上述命令,选择仅在给定的s3"目录"(即非递归)上设置权限/ ACL .

为了s3cmd工作,您首先必须通过s3cmd提供您的AWS访问和密钥s3cmd --configure(有关详细信息,请参阅http://s3tools.org/s3cmd).


asc*_*bol 38

根据我的理解,管理控制台中的"公共"选项以递归方式为目录中的每个对象添加公共授权.您可以通过右键单击一个文件,然后单击"属性"来查看.然后,您需要点击"权限",并且应该有一行:

 Grantee:  Everyone  [x] open/download  [] view permissions   [] edit permission.
Run Code Online (Sandbox Code Playgroud)

如果您在此目录中上传新文件,则它将不具有此公共访问集,因此是私有的.

如果只有几个键或使用脚本,则需要手动删除公共读取权限.

我使用'boto'模块在Python中编写了一个小脚本,以递归方式删除S3文件夹中所有键的'public read'属性:

#!/usr/bin/env python
#remove public read right for all keys within a directory

#usage: remove_public.py bucketName folderName

import sys
import boto

bucketname = sys.argv[1]
dirname = sys.argv[2]
s3 = boto.connect_s3()
bucket = s3.get_bucket(bucketname)

keys = bucket.list(dirname)

for k in keys:
    new_grants = []
    acl = k.get_acl()
    for g in acl.acl.grants:
        if g.uri != "http://acs.amazonaws.com/groups/global/AllUsers":
            new_grants.append(g)
    acl.acl.grants = new_grants
    k.set_acl(acl)
Run Code Online (Sandbox Code Playgroud)

我在一个包含(仅)2个对象的文件夹中对它进行了测试.如果您有许多密钥,可能需要一些时间才能完成,并且可能需要采用并行方法.

  • 你已经回答了我的问题,所以我接受了你的回答.然而,亚马逊的这一点很糟糕.我们必须编写脚本来重新设置私有内容吗?太可怕了.ascobol,谢谢你的帮助 (14认同)

Var*_*dak 11

对于AWS CLI,它非常简单.

如果对象是: s3://<bucket-name>/file.txt

对于单个对象:

aws s3api put-object-acl --acl private --bucket <bucket-name> --key file.txt
Run Code Online (Sandbox Code Playgroud)

对于桶中的所有对象(bash one-liner):

aws s3 ls --recursive s3://<bucket-name> | cut -d' ' -f5- | awk '{print $NF}' | while read line; do
    echo "$line"
    aws s3api put-object-acl --acl private --bucket <bucket-name> --key "$line"
done
Run Code Online (Sandbox Code Playgroud)

  • 你的回答很好,但我有点错过了脚本中每个工具在做什么的解释,所以人们不会盲目地执行它。此外,**文件名中包含空格的问题**。我已经发布了一个带有以下更改的新答案,但所有功劳仍然归功于您:) (3认同)

K F*_*K F 11

从AWS S3存储列表(AWS的S3 UI),您可以修改个别制作后文件的权限,无论是手动一个文件公开通过使整个文件夹的内容公开(为了澄清,我指的是一个文件夹中的桶内).要将公共属性恢复为私有,请单击该文件,然后转到权限并单击"每个人"标题下的径向按钮.你得到第二个浮动窗口,你可以取消选中*read object属性.不要忘记保存更改.如果你试图访问链接,你应该得到典型的"拒绝访问"消息.我附上了两个截图第一个显示文件夹列表.单击该文件并按照上述步骤显示第二个屏幕截图,其中显示了4个步骤.请注意,要修改多个文件,需要使用之前帖子中提出的脚本. -KF

第一:在AWS-S3中的Bucket列表


第二:更改访问权限的步骤


com*_*e N 8

我实际上按照本指南使用亚马逊的UI http://aws.amazon.com/articles/5050/

虽然它看起来与那个指南有些不同


Luc*_*rra 6

虽然@Varun Chandak 的回答效果很好,但值得一提的是,由于awk部分原因,脚本仅占ls结果的最后一部分。如果文件名中有空格,awk将只得到文件名的最后一段由空格分割,而不是整个文件名。

示例:路径为 like 的文件folder1/subfolder1/this is my file.txt将生成名为 just 的条目file.txt

为了防止在仍然使用他的脚本时发生这种情况,您必须用一系列变量占位符替换$NFin awk {print $NF},这些占位符说明了“按空格分割”操作将导致的段数。由于文件名可能有相当大的他们名字中的空格数,我夸张了,但老实说,我认为一种全新的方法可能会更好地处理这些情况。这是更新后的代码:

#!/bin/sh
aws s3 ls --recursive s3://my-bucket-name | awk '{print $4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17,$18,$19,$20,$21,$22,$23,$24,$25}' | while read line; do
    echo "$line"
    aws s3api put-object-acl --acl private --bucket my-bucket-name --key "$line"
done
Run Code Online (Sandbox Code Playgroud)

我还应该提到使用cut对我没有任何结果,所以我删除了它。感谢@Varun Chandak,因为他构建了脚本。