2013-04-12 11 views
11

Sto costruendo un'app che utilizza il servizio token di sicurezza di Amazon per creare utenti temporanei per accedere a una sottodirectory su un bucket S3. Gli utenti vengono creati da un utente IAM che ha accesso completo in lettura/scrittura al bucket (oltre alle autorizzazioni necessarie per creare utenti).Politica S3 basata su Amazon Prefisso non funziona (AWS, IAM, STS, Ruby)

Ho la creazione di utenti che lavorano perfettamente insieme alla scadenza della sessione e altro ancora, ma sto riscontrando problemi nell'ottenere la giusta politica per consentire l'elenco di chiavi basato su prefissi. Le autorizzazioni che voglio l'utente finale di avere sono: oggetti

  1. Leggi che sono in qualche prefisso definito
  2. oggetti di scrittura per lo stesso prefisso definito
  3. lista tutti gli oggetti che risiedono nel prefisso definito

Sono riuscito a leggere e scrivere, ma in qualche modo, indipendentemente da ciò che ho provato, l'accesso alla lista non funziona correttamente. Ecco il codice Ruby che stavo usando quando ero più vicino:

AWS::STS::Policy.new do |policy| 
    policy.allow(
    actions: ["s3:GetObject*", "s3:PutObject*", "s3:DeleteObject*"], 
    resources: "arn:aws:s3:::#{ENV['PROJECT_BUCKET']}/#{folder_path}/*" 
) 

    policy.allow(
    actions: ["s3:*"], 
    resources: ["arn:aws:s3:::#{ENV['PROJECT_BUCKET']}/*", "arn:aws:s3:::#{ENV['PROJECT_BUCKET']}"] 
).where(:s3_prefix).like("#{folder_path}/*") 
end 

Se non ricordo male, questo mi ha permesso di fare lettura e la scrittura, ma non messa in vendita. Dal momento che sono ancora in fase di sviluppo che ho cambiato il codice a questo:

AWS::STS::Policy.new do |policy| 
    # FIXME: This is way too permissive, but it's not working to be more specific. 
    policy.allow(
    actions: ["s3:*"], 
    resources: ["arn:aws:s3:::#{ENV['PROJECT_BUCKET']}/*", "arn:aws:s3:::#{ENV['PROJECT_BUCKET']}"] 
) 
end 

Questo funziona al 100% bene con il problema evidente che nulla è vincolato ad un prefisso che consentirebbe agli utenti di clobber il lavoro degli altri.

Cosa sto sbagliando nella mia politica?

risposta

7

È possibile trovare questo articolo di interesse, in quanto descrive in modo specifico la creazione di un criterio per limitare gli utenti a un prefisso in un bucket S3.

Credential Management for Mobile Applications

che molto probabilmente solo bisogno di fare riferimento alla seconda politica.

{ 
     "Statement": 
     [ 
      { 
       "Effect":"Allow", 
       "Action":["s3:PutObject","s3:GetObject","s3:DeleteObject"], 
       "Resource":"arn:aws:s3:::__MY_APPS_BUCKET_NAME__/__USERNAME__/*" 
      }, 
      { 
       "Effect":"Allow", 
       "Action":"s3:ListBucket", 
       "Resource":"arn:aws:s3:::__MY_APPS_BUCKET_NAME__", 
       "Condition":{"StringLike":{"s3:prefix":"__USERNAME__/"}} 
      }, 
      { 
       "Effect":"Deny", 
       "Action":["sts:*", "iam:*", "sdb:*"], 
       "Resource":"*" 
      } 
     ] 
} 

Con le prime 2 affermazioni essere quello che sarebbe più interessato a.

Spero che questo aiuti.

7

Per espandere su Bob Kinney referenced article and fragments (+1), mi piacerebbe spiegare quello che io considero la probabile causa del problema, che non è in realtà legato all'utilizzo del AWS Security Token Service (STS), ma coinvolge alcune sottigliezze frequentemente riscontrate con Amazon S3 IAM policies in generale:

I Example Policies for Amazon S3 coprono vari casi di utilizzo simili o collegati con il vostro - in particolare i vostri casi d'uso include apparentemente Esempio 2: permettere ad un gruppo di avere una cartella condivisa in Amazon S3 - si è effettivamente applicata che nel primo politica del primo frammento già (modulo GetObjectVersion, DeleteObjectVersion, che sono rilevanti solo quando si utilizza Object Versioning).

Ciò che manca ora è ListBucket - si prega di notare le seguenti sottigliezze:

molti casi d'uso come la tua richiedono quindi due frammenti dei dati distinti per affrontare separatamente l'oggetto e le operazioni correlate secchio, di conseguenza è probabile che tu bisogno di qualcosa di simile al seguente:

AWS::STS::Policy.new do |policy| 
    policy.allow(
    actions: ["s3:GetObject*", "s3:PutObject*", "s3:DeleteObject*"], 
    resources: "arn:aws:s3:::#{ENV['PROJECT_BUCKET']}/#{folder_path}/*" 
) 

    policy.allow(
    actions: ["s3:ListBucket"], 
    resources: ["arn:aws:s3:::#{ENV['PROJECT_BUCKET']}"] 
).where(:s3_prefix).like("#{folder_path}/") 
end 
Problemi correlati