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?
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.
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).
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
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
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/
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.
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.
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).
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!
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
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
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
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:
- 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/
- 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
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