2012-03-07 23 views
12

Ho un bucket in cui ho accidentalmente caricato migliaia di file con ACL in: public_read Vorrei che tutti i file non fossero disponibili tranne con un URL di accesso generato.Come impostare la politica del bucket di Amazon S3 come privata per tutti tranne l'amministratore?

Ho provato a creare una politica del bucket con negare tutto a tutti e consentire tutto a me.

E non funziona e tutti i file sono proibiti anche con un URL di accesso generato:

http://s3.amazonaws.com/myBucket/myFile.pdf?AWSAccessKeyId=AKIAIZB2XTOJ6KYB5SCA&Expires=1331137308&Signature=zRfPOj4XFBrXhyqDZ5DpwJqsWs0%3D

{ 
    "Version": "2008-10-17", 
    "Id": "Policy1331136935471", 
    "Statement": [ 
     { 
      "Sid": "Stmt1331136294179", 
      "Effect": "Deny", 
      "Principal": { 
       "AWS": "*" 
      }, 
      "Action": "s3:GetObject", 
      "Resource": "arn:aws:s3:::myBucket/*" 
     }, 
     { 
      "Sid": "Stmt1331136364169", 
      "Effect": "Allow", 
      "Principal": { 
       "AWS": "arn:aws:iam::6527...3775:root" 
      }, 
      "Action": "s3:*", 
      "Resource": "arn:aws:s3:::myBucket/*" 
     } 
    ] 
} 

UPDATE:
ho trovato riferimento al default deny nel doc ma il Generatore di politiche AWS ha solo 2 valori "Consenti" e "Rifiuta" qualcun altro ha la sintassi per il rifiuto predefinito?

Grazie per il vostro aiuto

+0

Ho pensato che dovresti essere in grado di modificare l'istruzione "Nega" per utilizzare "NotPrincipal" anziché "Principale", ad es. '" NotPrincipal ": {" AWS ":" YOUR-ACCOUNT-NUMBER "}' ma avendo provato la stessa cosa io stesso non sembra funzionare. – Rory

risposta

2

Ok, quindi, per quanto ho capito se ho impostato solo il permesso per me, dovrebbe essere negato a tutti gli altri per impostazione predefinita.

ho cercato di impostare la politica secchio, ma i miei file sono ancora scaricabili: è sufficiente rimuovere la chiave di accesso id dalla URL, come: http://s3.amazonaws.com/myBucket/myFile.pdf

miei file ACL sono ancora impostato come: pubblico-Read così sembra che in effetti ho un conflitto tra la politica del bucket e i singoli file ACL.

Ho rinunciato a fare tutti i file privati ​​attraverso la politica della benna, se qualcuno mai ha bisogno di fare un gran numero di file privato all'interno di un secchio S3, ecco il compito rake finalmente ho scritto:

desc "Make all objects in S3 private" 
    task :make_private => :environment do 
    require 'aws/s3' 

    bucket_name = 'yourBucket' 
    marker = "" 

    AWS::S3::Base.establish_connection!(
     :access_key_id => "yourKey", 
     :secret_access_key => "yourSecret" 
    ) 

    #create the read-only by me policy 
    owner_grant = ACL::Grant.new 
    grantee = ACL::Grantee.new 
    owner_grant.grantee = grantee 
    owner_grant.permission = 'READ' 
    grantee.type = "CanonicalUser" 
    grantee.id = 'yourID' 
    grantee.display_name = "yourName" 


    # Iterate over all files inside bucket and apply the policy to each files 
    loop do 
     objects = Bucket.objects(bucket_name, :marker=>marker, :max_keys=>1000) 

     marker = objects.last.key 
     puts "new marker is \"#{marker}\"" 

     objects.each do |obj| 
      policy = S3Object.acl(obj.key, bucket_name) 
      policy.grants = [owner_grant] 
      S3Object.acl(obj.key, bucket_name, policy) 
     end 
    end 
    end 

PS: Per informazioni ho provato a cambiare tutti i file ACL utilizzando Firefox S3 Organizer o bucket explorer, nessuno di loro funziona se si dispone di diverse centinaia di migliaia di file, semplicemente si bloccano.

+0

sono un approccio legacy al controllo degli accessi con S3 e rispettivamente limitato, pertanto si consiglia di eliminare l'utilizzo ACL tutti insieme una volta che si utilizzano i criteri bucket e/o IAM avanzati per il controllo dell'accesso per evitare conflitti rispettivamente confusi. In seguito dovrebbe essere possibile raggiungere in linea di principio qualsiasi configurazione desiderata (anche se, ammesso, i dettagli a volte non sono esattamente facili da comprendere). –

+5

La mia necessità è piuttosto semplice: tutti i file all'interno dei miei bucket devono essere privati ​​e accessibili solo tramite un URL di accesso generato. Non sono riuscito a ottenere questo comportamento attraverso le politiche, non ho trovato risposta su SO o sul forum di assistenza di Amazon, questo è l'unico modo in cui ho trovato questo obiettivo. Capisco che questa soluzione non è ottimale, ma penso davvero che ci sia un problema se qualcosa di così semplice è così complesso da raggiungere .... – vdaubry

+1

La cosa triste è che sono passati due anni e per quanto posso dire il problema rimane. Sto cercando di rendere un bucket accessibile solo alla mia app (tramite chiave d'accesso) ma non ho trovato il modo di farlo. –

12

questo è causato dal rispettivo Evaluation Logic del The Access Policy Language utilizzato con Bucket Policies:

L'obiettivo al momento di valutazione è quello di decidere se una data richiesta dovrebbe essere consentito o negato. La logica di valutazione segue diversi regole di base:

  • Per impostazione predefinita, tutte le richieste di utilizzare la risorsa proveniente da chiunque, ma si è negato

  • Un consentire la priorità su qualsiasi impostazione predefinita nega

  • Un rifiuto esplicito ignora qualsiasi permesso

  • L'ordine in cui vengono valutate le politiche non è importante

[sottolineatura mia]

La pagina fornisce anche un grafico flusso istruttivo e la discussione [che] descrivono in modo più dettagliato come viene presa la decisione.

Così il vostro Deny "*" sovrascrive il vostro Allow "arn:aws:iam::6527...3775:root". Come illustrato nel diagramma di flusso sopra riportato, puoi ovviare a ciò rimuovendo il rifiuto esplicito a favore del rifiuto predefinito (tieni presente le potenziali sottigliezze quando Using ACLs and Bucket Policies Together, che però non sembra applicarsi al tuo caso d'uso).

+0

Grazie per la tua risposta, ho trovato il riferimento alla negazione predefinita nel documento, ma il Generatore di politica AWS ha solo 2 valori "Consenti" e "Nega" conosci la sintassi per default denina – vdaubry

+1

@vdaubry: _Default Deny_ è un valore implicito predefinito valore automaticamente in atto una volta iniziato a utilizzare un criterio bucket; pertanto non è necessario fare altro che rimuovere la negazione esplicita attualmente in atto e otterrà automaticamente il rifiuto implicito predefinito. –

+2

Nonostante questo abbia molti upvotes, non funziona perché i singoli oggetti hanno un oggetto ACL di lettura pubblica, quindi il Default Deny viene sovrascritto dall'ACL dell'oggetto. Sembra che abbiamo bisogno di un modo per negare esplicitamente l'accesso tramite il criterio del bucket a chiunque, eccetto il/i principale che dovrebbe avere accesso. Avendo riscontrato lo stesso problema, non ho trovato un modo per impostare le politiche del bucket per raggiungere questo obiettivo. Gli ACL – Rory

5

Il criterio utilizzato non funziona perché the deny takes precedence over the allow, pertanto a tutti gli utenti viene negato l'accesso. Il modo corretto per farlo è utilizzare l'elemento della politica NotPrincipal. Ti consente di applicare una politica a tutti i principi tranne un elenco specifico. La vostra politica dovrebbe quindi essere:

{ 
    "Version": "2008-10-17", 
    "Id": "Policy1331136935471", 
    "Statement": [ 
     { 
      "Sid": "Stmt1331136294179", 
      "Effect": "Deny", 
      "NotPrincipal": { 
       "AWS": "arn:aws:iam::6527...3775:root" 
      }, 
      "Action": "s3:GetObject", 
      "Resource": "arn:aws:s3:::myBucket/*" 
     }, 
     { 
      "Sid": "Stmt1331136364169", 
      "Effect": "Allow", 
      "Principal": { 
       "AWS": "arn:aws:iam::6527...3775:root" 
      }, 
      "Action": "s3:*", 
      "Resource": "arn:aws:s3:::myBucket/*" 
     } 
    ] 
} 

Si noti che non credo che la permettono in realtà è necessaria perché il tuo account dovrebbe avere accesso ai file, perché è il proprietario della benna/oggetto che viene concesso l'accesso per impostazione predefinita. Sebbene ciò dipenda dagli ACL dei tuoi oggetti.

Problemi correlati