如何再次将AWS S3公用文件夹设为私有?
我正在测试一些临时数据,所以我在一个桶中公开了整个文件夹。我想再次限制它的访问权限。那么如何让文件夹再次保密呢?
根据我的理解,管理控制台中的“公共”选项以递归方式为目录中的每个对象添加公共授权。您可以通过右键单击一个文件,然后单击“属性”来查看。然后,您需要点击“权限”,并且应该有一行:
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个对象的文件夹中对它进行了测试。如果您有许多密钥,可能需要一些时间才能完成,并且可能需要采用并行方法。
接受的答案很有效 - 似乎也在给定的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)。
对于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
我实际上在本指南http://aws.amazon.com/articles/5050/之后使用了亚马逊的用户界面
截至目前,根据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存储桶的权限选项卡下的任何存储桶策略。
虽然@ 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,因为他建立了脚本。
我今天这样做了。我的情况是我有一些顶级目录,其文件需要私有。我确实有一些文件夹需要公开。
我决定像许多其他人已经展示的那样使用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
,因为我演示了你很好。玩得开心!
看起来亚马逊现在解决了这个问题:
选中以下复选框可使存储桶及其内容再次保密:
如果存储桶具有公共策略,则阻止公共和跨帐户访问