2012-02-11 23 views
38

Come si rende di nuovo privata una cartella pubblica AWS S3?S3: rendere nuovamente privata una cartella pubblica?

Stavo testando alcuni dati di staging, quindi ho reso pubblica l'intera cartella all'interno di un bucket. Mi piacerebbe restringere il suo accesso di nuovo. Quindi, come faccio a rendere nuovamente privata la cartella?

+1

si può fare questo witin il console di gestione o API programmatica – ascobol

+4

Quale è quello che ho pensato, ma non riesco a trovare l'opzione all'interno della console. Sembra ridicolo dover usare una API per fare qualcosa di così apparentemente importante. – GoodGets

+1

In effetti, la console consente di rimuovere il file grant grant da un solo file. Vedi la mia risposta dettagliata su come farlo in Python. – ascobol

risposta

28

Da quello che ho capito, l'opzione 'Rendi pubblico' nella console di gestione aggiunge in modo ricorsivo una concessione pubblica per ogni oggetto 'nella' directory. Puoi vederlo facendo clic con il pulsante destro su un file, quindi fare clic su "Proprietà". È quindi necessario fare clic su 'Autorizzazioni' e ci dovrebbe essere una linea:

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

Se si carica un nuovo file all'interno di questa directory non avrà questo set l'accesso del pubblico e quindi essere privato.

È necessario rimuovere i permessi di lettura pubblici uno per uno, manualmente se si dispone di poche chiavi o di uno script.

ho scritto un piccolo script in Python con il modulo 'boto' per rimuovere in modo ricorsivo l'attributo di 'lettura pubblica' di tutte le chiavi in ​​una cartella 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) 

ho provato in una cartella con (solo) 2 oggetti e ha funzionato. Se hai lotti di chiavi, potrebbe essere necessario un po 'di tempo per completare e potrebbe essere necessario un approccio parallelo.

+14

Hai risposto alla mia domanda, quindi ho accettato la tua risposta. Tuttavia, questo fa schifo a parte di Amazon. Dobbiamo scrivere script per rendere le cose di nuovo private? Semplicemente terribile. ascobol, grazie per il tuo aiuto – GoodGets

9

in realtà ho usato interfaccia utente di Amazon seguendo questa guida http://aws.amazon.com/articles/5050/

although it looks somewhat different than that guide

+0

Le istruzioni @ https://aws.amazon.com/articles/5050/ sembrano non aggiornate ... dal 2011. Non ho un'opzione per entrare in "Proprietà" "sul mio secchio. Gli script Python sono l'unico modo ora :( –

43

La risposta accettata funziona bene - sembra per impostare ACL ricorsivamente su un determinato percorso s3 troppo. Tuttavia, questo può anche essere fatto più facilmente con uno strumento di terze parti chiamato s3cmd - lo usiamo pesantemente nella mia azienda e sembra essere abbastanza popolare all'interno della comunità AWS.

Ad esempio, si supponga di avere questo tipo di bucket s3 e struttura dir: s3://mybucket.com/topleveldir/scripts/bootstrap/tmp/. Supponiamo ora di aver contrassegnato l'intera "directory" scripts come pubblica utilizzando la console di Amazon S3.

Ora per rendere l'intero scripts "directory-tree" in modo ricorsivo (ossia includendo sottodirectory e file) privata di nuovo:

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

E 'anche facile fare di nuovo se il "directory-tree" scripts ricorsivamente pubblico si vuole:

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

si può anche scegliere di impostare l'autorizzazione/ACL solo su un determinato s3 "directory" (cioè non ricorsivo) semplicemente omettendo --recursive nei comandi di cui sopra.

Per il lavoro s3cmd, è necessario fornire l'accesso AWS e le chiavi segrete a s3cmd tramite s3cmd --configure (vedere http://s3tools.org/s3cmd per ulteriori dettagli).

+1

Sto usando s3cmd 1.6.1 e questo suggerimento non funzionerà se hai già 'privato' su una cartella.Nel nostro caso abbiamo avuto pubblico e privato e impostato su privato via s3cmd, non rimuove "pubblico" lasciando qui una nota per gli altri utenti. Ecco l'output con --verbose - "già privato, saltando" – sumit

+0

come sarebbe questo aspetto con roba regexy come 's3cmd --access_key $ AWS_ACCESS_KEY_ID --secret_key $ AWS_SECRET_ACCESS_KEY setacl --acl-private -r s3: // $ S3_BUCKET_NAME/*. Map'? – metanerd

1

A partire da ora, secondo il boto docs si può fare in questo modo

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

Inoltre, si può considerare di togliere qualunque politiche secchio sotto scheda permessi di secchio S3.

4

Per AWS CLI, è abbastanza semplice.

Se l'oggetto è: s3://<bucket-name>/file.txt

per unico oggetto:

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

Per tutti gli oggetti nel secchio (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 
+1

funziona bene, grazie – DanH

Problemi correlati