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

时间:2012-02-11 07:35:21

标签: amazon-s3 amazon-web-services acl

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

我正在测试一些临时数据,因此我在一个存储桶中公开了整个文件夹。我想再次限制其访问权限。那么如何再次将文件夹设为私有?

12 个答案:

答案 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/

使用了亚马逊的用户界面

although it looks somewhat different than that guide

答案 4 :(得分:7)

在AWS S3存储桶列表(AWS S3 UI)中,您可以手动将 个文件公开为或单个文件的权限。 >通过公开整个文件夹内容(为澄清起见,我指的是存储桶中的文件夹)。要将公共属性恢复为私有,请单击文件,然后转到权限并单击“所有人”标题下的径向按钮。您将获得另一个浮动窗口,您可以在其中取消选中* read object“属性。不要忘记保存更改。如果尝试访问该链接,则应该看到典型的“ Access Denied”消息。我已附上了两个屏幕截图第一个显示文件夹列表,单击文件并按照上述步骤操作,将显示第二个屏幕截图,其中显示了四个步骤。请注意,要修改多个文件,一个人将需要使用先前文章中建议的脚本。 -Kf

First: Bucket listing in AWS-S3


Second:steps to change access permission

答案 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)

enter image description here

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

答案 9 :(得分:0)

亚马逊现在已经解决了这个问题:

选中以下复选框,将存储桶及其内容再次设为私有:

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

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

enter image description here

答案 10 :(得分:0)

如果您想要一个简单易用的单线纸,可以使用AWS Powershell Tools。 AWS Powershell工具的参考可以为found here。我们将使用Get-S3ObjectSet-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)

有两种方法可以解决此问题:

  1. 阻止所有存储桶(更简单,但不适用于所有用例,例如带有静态网站的s3存储桶和CDN的子文件夹)-https://aws.amazon.com/blogs/aws/amazon-s3-block-public-access-another-layer-of-protection-for-your-accounts-and-buckets/
  2. 从被授予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']
                    )

欢呼