S3: сделать публичную папку приватной снова? - PullRequest
55 голосов
/ 11 февраля 2012

Как снова сделать общедоступную папку AWS S3 закрытой?

Я тестировал некоторые промежуточные данные, поэтому я сделал всю папку общедоступной в корзине.Я хотел бы снова ограничить его доступ.Так как мне сделать папку снова закрытой?

Ответы [ 10 ]

54 голосов
/ 01 января 2014

Принятый ответ работает хорошо - кажется, рекурсивно устанавливать ACL на заданном пути s3.Однако это также можно сделать проще с помощью стороннего инструмента под названием s3cmd - мы активно используем его в моей компании, и он, кажется, довольно популярен в сообществе AWS.

ДляНапример, предположим, что у вас была такая структура s3 bucket и dir: s3://mybucket.com/topleveldir/scripts/bootstrap/tmp/.Теперь предположим, что вы пометили весь scripts «каталог» как открытый с помощью консоли Amazon S3.

Теперь рекурсивно сделать все scripts "дерево каталогов" (т.е. включая подкаталоги и их файлы) приватным:

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

Также просто сделать scripts "дерево каталогов "рекурсивно публично снова, если вы хотите:

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

Вы также можете установить разрешение / ACL только для данного s3" каталога "(т.е. не рекурсивно), просто пропустив --recursiveв приведенных выше командах.

Для работы s3cmd сначала необходимо предоставить доступ к AWS и секретные ключи для s3cmd через s3cmd --configure (подробнее см. http://s3tools.org/s3cmd).

37 голосов
/ 12 февраля 2012

Из того, что я понимаю, опция «Публичный» в консоли управления рекурсивно добавляет публичный грант для каждого объекта «в» каталоге.Вы можете увидеть это, щелкнув правой кнопкой мыши по одному файлу, а затем нажмите «Свойства».Затем вам нужно нажать «Разрешения», и должна появиться строка:

 Grantee:  Everyone  [x] open/download  [] view permissions   [] edit permission.

Если вы загрузите новый файл в этот каталог, у него не будет этого общего доступа, и поэтому он будет закрытым.

Вам необходимо поочередно удалить общедоступное разрешение на чтение, либо вручную, если у вас есть только несколько ключей, либо с помощью сценария.

Я написал небольшой скрипт на Python с модулем 'boto' для рекурсивного удаления атрибута 'public read' всех ключей в папке S3:

#!/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 предметами и все заработало.Если у вас есть много ключей, это может занять некоторое время, и может потребоваться параллельный подход.

11 голосов
/ 02 января 2018

Для интерфейса командной строки AWS это довольно просто.

Если объект: s3://<bucket-name>/file.txt

Для одного объекта:

aws s3api put-object-acl --acl private --bucket <bucket-name> --key file.txt

Для всех объектов введро (однострочник bash):

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 голосов
/ 08 июля 2018

Из списка сегментов AWS S3 (пользовательский интерфейс AWS S3) вы можете изменить отдельные права доступа к файлу после того, как или один файл станет общедоступным вручную или , сделаввсе содержимое папки общедоступно (чтобы уточнить, я имею в виду папку внутри корзины).Чтобы вернуть атрибут public обратно в private, вы нажимаете на файл, затем переходите к разрешениям и нажимаете радиальную кнопку под заголовком «ВСЕ».Вы получаете второе всплывающее окно, в котором вы можете снять флажок с атрибута * read object ". Не забудьте сохранить изменения. Если вы попытаетесь получить доступ к ссылке, вы должны получить типичное сообщение" Access Denied ". Я приложил два снимка экранаПервый показывает список папок. Нажав на файл и выполнив вышеупомянутую процедуру, вы увидите второй снимок экрана, на котором показаны 4 шага. Обратите внимание, что для изменения нескольких файлов необходимо будет использовать сценарии, предложенные в предыдущих публикациях.-Kf

First: Bucket listing in AWS-S3


Second:steps to change access permission

8 голосов
/ 17 ноября 2013

Я действительно использовал пользовательский интерфейс Amazon, следуя этому руководству http://aws.amazon.com/articles/5050/

although it looks somewhat different than that guide

3 голосов
/ 12 июля 2016

На данный момент, согласно 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 голосов
/ 30 августа 2018

Хотя ответ @ 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 голос
/ 05 апреля 2019

Похоже, что теперь это решается Amazon:

Установка следующего флажка снова делает контейнер и его содержимое приватными:

Блокировать публичный и кросс-аккаунт доступ, если в корзине есть публичные политики

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

enter image description here

1 голос
/ 01 ноября 2018

Я сделал это сегодня.У меня была ситуация с каталогами верхнего уровня, файлы которых нужно было сделать приватными.У меня действительно было несколько папок, которые нужно было оставить открытыми.

Я решил использовать s3cmd, как уже показывали многие другие люди.Но, учитывая огромное количество файлов, я хотел запускать параллельные s3cmd задания для каждого каталога.И так как это заняло бы день или около того, я хотел запустить их в качестве фоновых процессов на машине EC2.

Я настроил машину Ubuntu, используя тип t2.xlarge.Я выбрал xlarge после сбоя s3cmd с сообщениями о нехватке памяти на микроэкземпляре.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, как я продемонстрировал, и вы готовы к работе.Веселись!

0 голосов
/ 11 октября 2018

enter image description here

Если у вас есть браузер S3, у вас будет возможность сделать его общедоступным или личным.

...