2014-09-29 18 views
5

Non riesco a capire come impostare la politica del bucket per ottenere ciò che voglio. Qualsiasi aiuto sarebbe molto apprezzato! Le mie regole desiderati sono:Come impostare il criterio bucket S3 su (principalmente) privato quando object acl è pubblico?

  • utenti nel mio account hanno accesso tramite criteri utente, quindi non dovrebbe essere necessario l'accesso specificamente concessa loro
  • utenti anonimi (o nessuno al di fuori il mio account AWS) non dovrebbe avere accesso, ad eccezione :
  • una cartella/temp_public deve avere un oggetto pubblico GetObject (ovvero se si conosce l'URL è possibile ottenere il file)
  • queste politiche devono eseguire l'override dell'oggetto ACL sui file nel bucket, a volte gli ACL dell'oggetto vengono impostati leggere in pubblico

La ragione per la creazione della politica di secchio è che molti degli oggetti nel secchio hanno un pubblico di leggere ACL (involontariamente impostato quando sono stati caricati i file, ma potrebbe anche accadere in futuro, quindi voglio ignorare l'ACL dell'oggetto con il secchio ACL).

Ignorando la cartella temp_public, speravo ho potuto solo fare questo:

{ 
    "Version": "2008-10-17", 
    "Id": "Policy123456789", 
    "Statement": [ 
     { 
      "Sid": "Stmt1", 
      "Effect": "Deny", 
      "NotPrincipal": { 
       "AWS": "arn:aws:iam::123456789012:root" 
      }, 
      "Action": "s3:GetObject", 
      "Resource": "arn:aws:s3:::my-bucket-name/*" 
     } 
    ] 
} 

(dove 123456789012 è il mio numero di conto AWS), ma ottengo l'accesso negato per tutti gli utenti con tale politica secchio. Immagino che NotPrincipal non stia funzionando in questo caso?

grazie per eventuali suggerimenti!

Rory

UPDATE: cross-postato sui forum here AWS, e ha risposto!

risposta

9

Molte grazie a IP da AWS Forum per this answer, che ho confermato sta lavorando per me:

{ 
    "Version": "2012-10-17", 
    "Statement": [ 
     { 
      "Effect": "Allow", 
      "Principal": "*", 
      "Action": "s3:GetObject", 
      "Resource": "arn:aws:s3:::BucketName/temp_public/*" 
     } 
    ] 
} 

Questa dichiarazione sarà dare a chiunque l'accesso in lettura oggetti all'interno della cartella temp_public, indipendentemente ACL su tali file. Per sovrascrivere l'accesso pubblico su tutti gli altri file, è necessario fornire un'istruzione + Deny + -type. Il rifiuto esplicito sostituisce qualsiasi accesso Consenti, quindi è necessario escludere le autorizzazioni già fornite. in modo da utilizzare NotResource come una maschera di esclusione (non ancora definitivo, leggere qui di seguito):

{ 
    "Effect": "Deny", 
    "Principal": "*", 
    "Action": "s3:GetObject", 
    "NotResource": "arn:aws:s3:::BucketName/temp_public/*" 
} 

Tuttavia, questo negare l'accesso a tutti gli utenti, tra cui il tuo account troppo, in quanto il capitale è impostata su "*". Pertanto, è necessario escludere il tuo account da questo Deny (ancora non definitivo):

{ 
    "Effect": "Deny", 
    "NotPrincipal": { "AWS": "arn:aws:iam::XXXXYYYYZZZZ:root" }, 
    "Action": "s3:GetObject", 
    "NotResource": "arn:aws:s3:::BucketName/temp_public/*" 
} 

(dove XXXXYYYYZZZZ è il tuo 12 cifre account AWS Id)

C'è ancora problema: la dichiarazione di cui sopra nega l'accesso a tutti Utenti IAM (tranne l'account di root). Desiderate escludere anche tutti gli utenti IAM, ma questo è complicato. Per alcuni motivi, Amazon S3 non supporta i caratteri jolly per specificare gli utenti IAM in un criterio bucket. Non è possibile scrivere "arn:aws:iam::XXXXYYYYZZZZ:user/*" come Principale (fornisce un errore: "Principio non valido nella politica").È necessario specificare i nomi utente esatte:

{ 
    "Effect": "Deny", 
    "NotPrincipal": { 
     "AWS": [ 
          "arn:aws:iam::XXXXYYYYZZZZ:root", 
          "arn:aws:iam::XXXXYYYYZZZZ:user/user1", 
          "arn:aws:iam::XXXXYYYYZZZZ:user/user2", 
          "arn:aws:iam::XXXXYYYYZZZZ:user/user3", 
          "arn:aws:iam::XXXXYYYYZZZZ:user/user4" ] 
    } 
    "Action": "s3:GetObject", 
    "NotResource": "arn:aws:s3:::BucketName/temp_public/*" 
} 

NB da Rory: La documentazione S3 suggeriscono è possibile utilizzare arn:aws:iam::XXXXYYYYZZZZ:root per coprire tutti gli utenti del conto, ma che proprio non sembra lavorare

Quindi la politica finale sarà simile a questa:

{ 
    "Version": "2012-10-17", 
    "Statement": [ 
     { 
      "Effect": "Allow", 
      "Principal": "*", 
      "Action": "s3:GetObject", 
      "Resource": "arn:aws:s3:::BucketName/temp_public/*" 
     }, 
     { 
      "Effect": "Deny", 
      "NotPrincipal": { 
       "AWS": [ 
            "arn:aws:iam::XXXXYYYYZZZZ:root", 
            "arn:aws:iam::XXXXYYYYZZZZ:user/user1", 
            "arn:aws:iam::XXXXYYYYZZZZ:user/user2", 
            "arn:aws:iam::XXXXYYYYZZZZ:user/user3", 
            "arn:aws:iam::XXXXYYYYZZZZ:user/user4" ] 
      } 
      "Action": "s3:GetObject", 
      "NotResource": "arn:aws:s3:::BucketName/temp_public/*" 
     } 
    ] 
} 
Problemi correlati