S3: ponownie uczynić publiczny folder prywatnym?

Jak sprawić, by folder publiczny AWS S3 stał się prywatny?

Testowałem trochę danych, więc upubliczniłem cały folder w wiadrze. Chciałbym ponownie ograniczyć dostęp do niego. Jak więc przywrócić prywatność folderu?

Author: nonbeing, 2012-02-11

12 answers

Z tego, co rozumiem, opcja "upublicznij" w konsoli zarządzania dodaje rekurencyjnie grant publiczny dla każdego obiektu "w" katalogu. Możesz to zobaczyć, klikając prawym przyciskiem myszy jeden plik, a następnie klikając "właściwości". Następnie należy kliknąć na "uprawnienia" i powinna być linia:

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

Jeśli prześlesz nowy plik w tym katalogu, nie będzie on miał ustawionego dostępu publicznego i dlatego będzie prywatny.

Musisz usunąć uprawnienia do publicznego odczytu jeden po drugim, albo ręcznie, jeśli masz tylko kilka kluczy lub za pomocą skryptu.

Napisałem mały skrypt w Pythonie z modułem 'boto', aby rekurencyjnie usunąć atrybut 'public read' wszystkich kluczy w folderze S3:

#!/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']
                    )

Przetestowałem go w folderze z (tylko) 2 obiektami i zadziałało. Jeśli masz wiele kluczy, Ukończenie może zająć trochę czasu i konieczne może być równoległe podejście.

 39
Author: ascobol,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-02-04 04:26:15

Przyjęta odpowiedź działa dobrze-wydaje się, że ACLs ustawia rekurencyjnie również na danej ścieżce s3. Jednak można to również łatwiej zrobić za pomocą narzędzia innej firmy o nazwie s3cmd - używamy go mocno w mojej firmie i wydaje się być dość popularny w społeczności AWS.

Na przykład, załóżmy, że masz taki rodzaj wiadra s3 i strukturę dir: s3://mybucket.com/topleveldir/scripts/bootstrap/tmp/. Załóżmy, że zaznaczyłeś cały scripts "Katalog" jako publiczny za pomocą konsoli Amazon S3.

Teraz, aby cały scripts "drzewo katalogów" rekurencyjnie (tzn. włączając podkatalogi i ich Pliki) ponownie prywatne:

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

Łatwo jest również ponownie upublicznić scripts "drzewo katalogów", jeśli chcesz:

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

Możesz również ustawić uprawnienia / ACL tylko dla danego "katalogu" s3 (tj. non-rekurencyjnie), po prostu pomijając --recursive w powyższych poleceniach.

Aby s3cmd zadziałało, musisz najpierw podać swój dostęp AWS i tajne klucze do s3cmd przez s3cmd --configure (Zobacz http://s3tools.org/s3cmd Po Więcej Szczegółów).

 62
Author: nonbeing,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-12 05:24:25

Dla AWS CLI jest to dość proste.

Jeśli obiekt jest: s3://<bucket-name>/file.txt

Dla pojedynczego obiektu:

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

Dla wszystkich obiektów w wiadrze (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
 18
Author: Varun Chandak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-02 12:21:51

Z listy AWS S3 bucket listing (interfejs AWS S3), możesz zmodyfikować uprawnienia poszczególnych plików po uczynieniu albo jednym plikiem publicznym ręcznie lub poprzez upublicznienie całej zawartości folderu (dla wyjaśnienia mam na myśli folder wewnątrz wiadra). Aby przywrócić atrybut publiczny do prywatnego, kliknij plik, a następnie przejdź do uprawnienia i kliknij w radialny przycisk pod nagłówkiem "wszyscy". Otrzymasz drugie pływające okno, w którym możesz odznaczyć * read object" atrybut. Nie zapomnij zapisać reszty. Jeśli spróbujesz uzyskać dostęp do linku, powinieneś otrzymać typowy komunikat "Odmowa dostępu". Załączam dwa screeny. Pierwszy pokazuje listę folderów. Kliknięcie pliku i wykonanie powyższej procedury powinno pokazać drugi zrzut ekranu, który pokazuje 4 kroki. Zauważ, że aby zmodyfikować wiele plików, trzeba by użyć skryptów, jak zaproponowano w poprzednich postach. - Kf

Po pierwsze: notowanie wiadra w AWS-S3


Po drugie: kroki, aby zmienić uprawnienia dostępu

 14
Author: K F,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-08 04:56:53

Użyłem interfejsu użytkownika Amazona zgodnie z tym przewodnikiem http://aws.amazon.com/articles/5050/

chociaż wygląda nieco inaczej niż ten poradnik

 8
Author: comandante N,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-16 21:55:44

Podczas gdy odpowiedź @ Varun Chandak działa świetnie, warto wspomnieć, że ze względu na Część awk, skrypt odpowiada tylko za ostatnią część wyników ls. Jeśli nazwa pliku zawiera spacje, awk otrzyma tylko ostatni segment nazwy pliku podzielony spacjami, a nie całą nazwę pliku.

Przykład: plik ze ścieżką podobną do folder1/subfolder1/this is my file.txt spowodowałby wpis o nazwie just file.txt.

Aby temu zapobiec, podczas korzystania z jego skryptu, trzeba by zastąpić $NF w awk {print $NF} przez sekwencję zmiennych zastępczych, która odpowiada liczbie segmentów, w wyniku których operacja "split by space". Ponieważ nazwy plików mogą mieć dość dużą liczbę spacji w nazwach, zaszedłem z przesadą, ale szczerze mówiąc, myślę, że całkiem nowe podejście byłoby prawdopodobnie lepsze do radzenia sobie z tymi przypadkami. Oto zaktualizowany kod:

#!/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

Powinienem również wspomnieć, że użycie cut nie przyniosło mi żadnych rezultatów, więc je usunąłem. / Align = "left" / @ Varun Chandak, skoro zbudował skrypt.

 4
Author: Luca Bezerra,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2021-01-18 19:33:58

Od teraz, zgodnie z Boto docs możesz to zrobić w ten sposób

#!/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') 

Możesz również rozważyć usunięcie wszelkich zasad bucket w zakładce uprawnienia bucket s3.

 3
Author: Levon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-12 08:33:34

Zrobiłem to dzisiaj. Moja sytuacja była taka, że miałem pewne katalogi najwyższego poziomu, których pliki musiały być prywatne. Miałem kilka folderów, które musiały zostać upublicznione.

Postanowiłem użyć s3cmd jak wiele innych osób już pokazało. Ale biorąc pod uwagę ogromną liczbę plików, chciałem uruchomić równoległe zadania s3cmd dla każdego katalogu. A ponieważ miało to zająć mniej więcej dzień, chciałem uruchomić je jako procesy w tle na maszynie EC2.

Założyłem Ubuntu maszyna używająca typu t2.xlarge. Wybrałem xlarge po tym, jak s3cmd nie powiodło się z wiadomościami o braku pamięci na wystąpieniu mikro. xlarge to chyba przesada ale ten serwer będzie działał tylko na jeden dzień.

Po zalogowaniu na serwer zainstalowałem i skonfigurowałem 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

Początkowo próbowałem użyć screen, ale miałem pewne problemy, głównie procesy spadały z screen -r pomimo uruchomienia odpowiedniej komendy screen, takiej jak screen -S directory_1 -d -m s3cmd setacl --acl-private --recursive --verbose s3://my_bucket/directory_1. Więc trochę poszperałem i znalazłem nohup dowództwo. Oto z czym skończyłem:

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 &

Z błędem wielu kursorów staje się to dość łatwe (użyłem aws s3 ls s3//my_bucket, aby wyświetlić listę katalogów).

Możesz to zrobić, jak chcesz, i zalogować się z powrotem i śledzić wszystkie swoje dzienniki. Możesz śledzić wiele plików, takich jak: tail -f directory_1.out -f directory_2.out -f directory_3.out

Więc skonfiguruj s3cmd następnie użyj nohup jak pokazałem i możesz iść. Baw się dobrze!

 1
Author: Steve Potter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-11-01 20:27:22

Wygląda na to, że to jest teraz adresowane przez Amazon:

Zaznaczenie poniższego pola powoduje, że wiadro i jego zawartość są ponownie prywatne:

Zablokuj dostęp publiczny i między kontami, jeśli bucket ma zasady publiczne

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

Tutaj wpisz opis obrazka

 1
Author: Spiff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-04-05 12:50:14

Tutaj wpisz opis obrazka

Jeśli masz przeglądarkę S3, będziesz miał opcję, aby uczynić ją publiczną lub prywatną.

 0
Author: Avinash Clinton,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-11 06:29:23

Jeśli chcesz uroczo prosty jednowarstwowy, możesz użyć AWS PowerShell Tools . Odniesienie do AWS PowerShell Tools można znaleźć tutaj . Będziemy używać poleceń Get-S3object i Set-s3acl.

$TargetS3Bucket = "myPrivateBucket"
$TargetDirectory = "accidentallyPublicDir"
$TargetRegion = "us-west-2"

Set-DefaultAWSRegion $TargetRegion

Get-S3Object -BucketName $TargetS3Bucket -KeyPrefix $TargetDirectory | Set-S3ACL -CannedACLName private
 0
Author: TorpedoBench,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-11-29 19:51:21

Są dwa sposoby na to:

  1. Block all the bucket (prostsze, ale nie dotyczy wszystkich przypadków użycia, takich jak wiadro s3 ze statyczną stroną internetową i podkatalog CDN) -https://aws.amazon.com/blogs/aws/amazon-s3-block-public-access-another-layer-of-protection-for-your-accounts-and-buckets/
  2. blokuje dostęp do katalogu z zasobnika S3, który otrzymał opcję Make Public gdzie można wykonać skrypt z ascobol (po prostu przepisuję go z 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']
                    )

Cheers

 0
Author: Fernando González,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-02-04 00:45:50