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

问题描述 投票:53回答:10

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

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

amazon-s3 amazon-web-services acl
10个回答
37
投票

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

 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个对象的文件夹中对它进行了测试。如果您有许多密钥,可能需要一些时间才能完成,并且可能需要采用并行方法。


0
投票

enter image description here

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


54
投票

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

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

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

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

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

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

您也可以通过在上述命令中省略--recursive来选择仅在给定的s3“目录”(即非递归)上设置权限/ ACL。

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


11
投票

对于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
投票

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

First: Bucket listing in AWS-S3


Second:steps to change access permission


8
投票

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


3
投票

截至目前,根据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存储桶的权限选项卡下的任何存储桶策略。


2
投票

虽然@ kintuparantu的答案很有效,但值得一提的是,由于awk部分,脚本只占ls结果的最后部分。如果文件名中包含空格,awk将只获取由空格分隔的文件名的最后一段,而不是整个文件名。

示例:具有folder1/subfolder1/this is my file.txt之类路径的文件将生成一个名为file.txt的条目。

为了防止在使用他的脚本的同时,你必须用一系列变量占位符替换$NF中的awk {print $NF},这些占位符解释了“按空格分割”操作会导致的段数。由于文件名可能有一个他们的名字中有相当多的空格,我夸张地说,但说实话,我认为一种全新的方法可能会更好地处理这些案件。这是更新的代码:

#!/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,因为他建立了脚本。


1
投票

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

我决定像许多其他人已经展示的那样使用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,因为我演示了你很好。玩得开心!


1
投票

看起来亚马逊现在解决了这个问题:

选中以下复选框可使存储桶及其内容再次保密:

如果存储桶具有公共策略,则阻止公共和跨帐户访问

https://aws.amazon.com/blogs/aws/amazon-s3-block-public-access-another-layer-of-protection-for-your-accounts-and-buckets/

enter image description here

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