首页 文章

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

提问于
浏览
49

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

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

9 回答

  • 2

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

    Grantee:  Everyone  [x] open/download  [] view permissions   [] edit permission.
    

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

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

    我使用'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)
    

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

  • 3

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

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

    现在再次将整个 scripts "directory-tree"(即包括子目录及其文件)私有化:

    s3cmd setacl --acl-private --recursive s3://mybucket.com/topleveldir/scripts/
    

    如果你想要的话,也可以很容易地再次公开 scripts "directory-tree":

    s3cmd setacl --acl-public --recursive s3://mybucket.com/topleveldir/scripts/
    

    您也可以选择仅在给定的s3 "directory"上设置权限/ ACL(即非递归),只需在上述命令中省略 --recursive 即可 .

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

  • 8

    对于AWS CLI,它非常简单 .

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

    对于单个对象:

    aws s3api put-object-acl --acl private --bucket <bucket-name> --key file.txt
    

    对于桶中的所有对象(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
    
  • 9

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

    although it looks somewhat different than that guide

  • 52

    在AWS S3存储桶列表(AWS S3用户界面)中,您可以通过将整个文件夹内容公开来手动公开一个文件 or 来修改 individual 文件的权限(澄清一下,我指的是存储桶中的文件夹) . 要将公共属性恢复为私有,请单击该文件,然后转到权限并单击"EVERYONE" Headers 下的径向按钮 . 你得到第二个浮动窗口,你可以取消选中* read object " attribute. Don't forget to save the change. If you try to access the link, you should get the typical " Access Denied“消息 . 我附上了两个截图 . 第一个显示文件夹列表 . 单击文件并按照上述步骤显示第二个截图,显示了4个步骤 . 请注意,要修改多个文件,需要使用之前帖子中提出的脚本 . -Kf

    First: Bucket listing in AWS-S3


    Second:steps to change access permission

  • 33

    截至目前,根据boto docs你可以这样做

    #!/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:
        # options are 'private', 'public-read'
        # 'public-read-write', 'authenticated-read'
        k.set_acl('private')
    

    此外,您可以考虑删除s3存储桶的权限选项卡下的任何存储桶策略 .

  • 1

    虽然@kintuparantu 's answer works great, it'值得一提,但由于 awk 部分,该脚本仅占 ls 结果的最后部分 . 如果文件名中包含空格, awk 将只获取由空格分隔的文件名的最后一段,而不是整个文件名 .

    Example: 具有类似 folder1/subfolder1/this is my file.txt 的路径的文件将导致名为 file.txt 的条目 .

    为了防止在使用他的脚本时,你必须用一系列变量占位符替换 awk {print $NF} 中的 $NF ,这些占位符占'split by space'操作将导致的段数 . 由于文件名可能有相当大的数量在他们的名字中有空格,我更新了代码:

    #!/bin/sh
    aws s3 ls --recursive s3://plusplus-staging | 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 plusplus-staging --key "$line"
    done
    

    我还要提一下,使用 cut 对我没有任何结果,所以我将其删除了 . 积分仍然留给@kintuparantu,因为他 Build 了脚本 .

  • 4

    我今天这样做了 . 我的情况是我有一些顶级目录,其文件需要私有 . 我确实有一些需要的文件夹被公之于众 .

    我决定像许多其他人已经展示过的那样使用 s3cmd . 但是考虑到大量文件,我想为每个目录运行并行 s3cmd 作业 . 由于它需要一天左右的时间,我想在EC2机器上将它们作为后台进程运行 .

    我使用 t2.xlarge 类型设置了一个Ubuntu机器 . 在 s3cmd 失败后,我选择了xlarge,并在微实例上显示内存不足的消息 . xlarge可能有点过分,但这台服务器只能运行一天 .

    登录服务器后,我安装并配置了 s3cmd

    sudo apt-get install python-setuptools wget https://sourceforge.net/projects/s3tools/files/s3cmd/2.0.2/s3cmd-2.0.2.tar.gz/download mv download s3cmd.tar.gz tar xvfz s3cmd.tar.gz cd s3cmd-2.0.2/ python setup.py install sudo python setup.py install cd ~ s3cmd --configure

    我最初尝试使用 screen ,但有一些问题,主要是进程从 screen -r 下降,尽管运行正确的屏幕命令,如 screen -S directory_1 -d -m s3cmd setacl --acl-private --recursive --verbose s3://my_bucket/directory_1 . 所以我做了一些搜索,找到了 nohup 命令 . 这是我最终得到的:

    nohup s3cmd setacl --acl-private --recursive --verbose s3://my_bucket/directory_1 > directory_1.out & nohup s3cmd setacl --acl-private --recursive --verbose s3://my_bucket/directory_2 > directory_2.out & nohup s3cmd setacl --acl-private --recursive --verbose s3://my_bucket/directory_3 > directory_3.out &

    使用多光标错误,这变得非常简单(我使用 aws s3 ls s3//my_bucket 列出目录) .

    这样做可以根据需要 logout ,然后重新登录并拖尾任何日志 . 你可以拖尾多个文件,如: tail -f directory_1.out -f directory_2.out -f directory_3.out

    所以设置 s3cmd 然后使用 nohup ,因为我演示了你很好 . 玩得开心!

  • 0

    enter image description here

    如果您有S3浏览器,您可以选择将其设为公开或私有 .

相关问题