如何再次将AWS S3公用文件夹设为私有?
我正在测试一些临时数据,因此我在一个存储桶中公开了整个文件夹。我想再次限制其访问权限。那么如何再次将文件夹设为私有?
答案 0 :(得分:54)
接受的答案效果很好 - 似乎也在给定的s3路径上递归设置ACL。但是,这也可以通过名为s3cmd的第三方工具更轻松地完成 - 我们在公司中大量使用它,它似乎在AWS社区中相当受欢迎。
例如,假设您有这种s3存储桶和目录结构: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/
您也可以选择仅在给定的s3“目录”(即非递归)上设置权限/ ACL,只需省略上述命令中的--recursive
。
要使s3cmd
生效,您首先必须通过s3cmd --configure
向s3cmd提供您的AWS访问权限和密钥(有关详情,请参阅http://s3tools.org/s3cmd)。
答案 1 :(得分:35)
根据我的理解,管理控制台中的'Make public'选项递归地为目录中的每个对象添加一个公共授权。 您可以通过右键单击一个文件,然后单击“属性”来查看。然后,您需要点击“权限”,并且应该有一行:
Grantee: Everyone [x] open/download [] view permissions [] edit permission.
如果您在此目录中上传新文件,则该文件将不具有此公共访问权限,因此是私有的。
如果只有几个键或使用脚本,则需要手动删除公共读取权限。
我在Python中使用'boto'模块编写了一个小脚本,以递归方式删除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个对象的文件夹中对它进行了测试。如果你有批次的密钥,可能需要一些时间才能完成,并且可能需要采用并行方法。
答案 2 :(得分:10)
对于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
答案 3 :(得分:8)
我实际上按照本指南http://aws.amazon.com/articles/5050/
使用了亚马逊的用户界面
答案 4 :(得分:7)
在AWS S3存储桶列表(AWS S3 UI)中,您可以手动将 个文件公开为或单个文件的权限。 >通过公开整个文件夹内容(为澄清起见,我指的是存储桶中的文件夹)。要将公共属性恢复为私有,请单击文件,然后转到权限并单击“所有人”标题下的径向按钮。您将获得另一个浮动窗口,您可以在其中取消选中* read object“属性。不要忘记保存更改。如果尝试访问该链接,则应该看到典型的“ Access Denied”消息。我已附上了两个屏幕截图第一个显示文件夹列表,单击文件并按照上述步骤操作,将显示第二个屏幕截图,其中显示了四个步骤。请注意,要修改多个文件,一个人将需要使用先前文章中建议的脚本。 -Kf
答案 5 :(得分: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存储桶权限选项卡下的任何存储桶策略。
答案 6 :(得分:2)
尽管@kintuparantu的答案非常有用,但值得一提的是,由于result$ = first$.pipe(merge(second$))
部分,脚本仅占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
对我没有任何结果,因此我将其删除。自他创建脚本以来,功劳仍归@kintuparantu。
答案 7 :(得分: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
,您就可以开始了。玩得开心!
答案 8 :(得分:0)
答案 9 :(得分:0)
亚马逊现在已经解决了这个问题:
选中以下复选框,将存储桶及其内容再次设为私有:
如果存储桶具有公共策略,则阻止公共和跨帐户访问
答案 10 :(得分:0)
如果您想要一个简单易用的单线纸,可以使用AWS Powershell Tools。 AWS Powershell工具的参考可以为found here。我们将使用Get-S3Object和Set-S3ACL Commandlet。
$TargetS3Bucket = "myPrivateBucket"
$TargetDirectory = "accidentallyPublicDir"
$TargetRegion = "us-west-2"
Set-DefaultAWSRegion $TargetRegion
Get-S3Object -BucketName $TargetS3Bucket -KeyPrefix $TargetDirectory | Set-S3ACL -CannedACLName private
答案 11 :(得分:0)
有两种方法可以解决此问题:
Make Public
选项的s3存储桶中阻止访问目录,您可以在其中执行 ascobol 脚本(我只是用boto3重写了该脚本)#!/usr/bin/env python
#remove public read right for all keys within a directory
#usage: remove_public.py bucketName folderName
import sys
import boto3
BUCKET = sys.argv[1]
PATH = sys.argv[2]
s3client = boto3.client("s3")
paginator = s3client.get_paginator('list_objects_v2')
page_iterator = paginator.paginate(Bucket=BUCKET, Prefix=PATH)
for page in page_iterator:
keys = page['Contents']
for k in keys:
response = s3client.put_object_acl(
ACL='private',
Bucket=BUCKET,
Key=k['Key']
)
欢呼