Amazon s3 S3:将公用文件夹重新设为专用文件夹?

Amazon s3 S3:将公用文件夹重新设为专用文件夹?,amazon-s3,amazon-web-services,acl,Amazon S3,Amazon Web Services,Acl,如何使AWS S3公用文件夹再次成为专用文件夹 我正在测试一些暂存数据,所以我在一个bucket中公开了整个文件夹。我想再次限制它的访问。那么,如何使文件夹再次成为私有文件夹呢?据我所知,管理控制台中的“公开”选项会递归地为目录中的每个对象添加公开授权。 您可以通过右键单击一个文件,然后单击“属性”来查看。然后,您需要单击“权限”,应该有一行: Grantee: Everyone [x] open/download [] view permissions [] edit permis

如何使AWS S3公用文件夹再次成为专用文件夹


我正在测试一些暂存数据,所以我在一个bucket中公开了整个文件夹。我想再次限制它的访问。那么,如何使文件夹再次成为私有文件夹呢?

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

 Grantee:  Everyone  [x] open/download  [] view permissions   [] edit permission.
如果在此目录中上载新文件,则不会设置此公共访问权限,因此是私有的

您需要逐个删除公共读取权限,如果只有几个键,可以手动删除,也可以使用脚本删除

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

#/usr/bin/env python
#删除目录中所有密钥的公共读取权限
#用法:删除_public.py bucketName folderName
导入系统
进口boto3
BUCKET=sys.argv[1]
PATH=sys.argv[2]
s3client=boto3.client(“s3”)
paginator=s3client.get_paginator('list_objects_v2'))
页面迭代器=paginator.paginate(Bucket=Bucket,前缀=PATH)
对于页面迭代器中的页面:
keys=第[“内容”]
对于k in键:
response=s3client.put\u object\u acl(
ACL='private',
桶=桶,
Key=k['Key']
)

我在一个只有两个对象的文件夹中测试了它,它成功了。如果你有大量的按键,可能需要一段时间才能完成,而且可能需要一个并行的方法。

我实际上是按照这个指南使用了Amazon的UI


接受的答案效果很好-似乎也在给定的s3路径上递归设置ACL。然而,这也可以通过一个名为的第三方工具更容易地实现——我们在我的公司大量使用它,而且它似乎在AWS社区中相当流行

例如,假设您有这种s3 bucket和dir结构:
s3://mybucket.com/topleveldir/scripts/bootstrap/tmp/
。现在假设您已经使用AmazonS3控制台将整个
脚本
的“目录”标记为public

现在,要使整个
脚本
的“目录树”递归地(即包括子目录及其文件)再次私有化:

s3cmd setacl --acl-private --recursive s3://mybucket.com/topleveldir/scripts/
如果需要,还可以轻松地将
脚本
的“目录树”再次递归公开:

s3cmd setacl --acl-public --recursive s3://mybucket.com/topleveldir/scripts/
您还可以选择仅在给定的s3“目录”(即非递归)上设置权限/ACL,只需在上述命令中省略
--recursive


要使
s3cmd
工作,您首先必须通过
s3cmd--configure
(请参阅以了解更多详细信息)向s3cmd提供AWS访问权限和密钥。

到目前为止,根据

#/usr/bin/env python
#删除目录中所有密钥的公共读取权限
#用法:删除_public.py bucketName folderName
导入系统
进口波托
bucketname=sys.argv[1]
dirname=sys.argv[2]
s3=boto.connect_s3()
bucket=s3.get_bucket(bucketname)
keys=bucket.list(dirname)
对于k in键:
#选项有“私有”、“公共读取”
#“公共读写”,“身份验证读”
k、 设置acl(“专用”)

也可以考虑删除S3桶权限表下的任何桶策略。对于AWS CLI,

< P>,它是相当直接的。 如果对象为:
s3:///file.txt

对于单个对象:

aws s3api put-object-acl --acl private --bucket <bucket-name> --key file.txt
aws s3api放置对象acl--acl private--bucket--key file.txt
对于桶中的所有对象(bash one liner):

aws s3 ls——递归s3://|cut-d'-f5-|awk'{print$NF}'|同时读取行;做
回音“$line”
aws s3api放置对象acl--acl专用--bucket--key“$line”
完成

从AWS S3 bucket列表(AWS S3 UI)中,您可以在手动公开一个文件后修改个人文件的权限,或者通过公开整个文件夹内容(澄清一下,我指的是bucket中的文件夹)。要将public属性恢复为private,请单击该文件,然后转到permissions并单击“EVERYONE”标题下的径向按钮。您将获得第二个浮动窗口,可以在其中取消选中“读取对象”属性。不要忘记保存更改。如果您尝试访问链接,您将获得典型的“拒绝访问”“留言。我附上了两个截图。第一个显示文件夹列表。单击该文件并遵循上述步骤,将显示第二个屏幕截图,其中显示了4个步骤。请注意,要修改多个文件,需要使用前面文章中建议的脚本-Kf



尽管@Varun Chandak的答案非常有效,但值得一提的是,由于
awk
部分的原因,脚本只解释了
ls
结果的最后一部分。如果文件名中有空格,
awk
将只获取文件名的最后一段,而不是整个文件名

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

为了防止在仍然使用他的脚本时出现这种情况,您必须将
awk{print$NF}
中的
$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
我还应该提到,使用
cut
#!/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
#!/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']
                    )