Passa al contenuto principale

ACL (Access Control List)

ACL è l'acronimo di Access Control List, utilizzato per impostare le autorizzazioni su bucket e oggetti ed è pienamente supportato da Cubbit.

Le ACL sono utilizzate per concedere le autorizzazioni a specifici account o gruppi AWS per eseguire azioni specifiche su un bucket o un oggetto. Si possono usare due tipi di ACL:

  • ACL per bucket: queste ACL sono utilizzate per concedere le autorizzazioni per le azioni su un bucket.
  • ACL per oggetti: queste ACL sono utilizzate per concedere autorizzazioni per azioni su un singolo oggetto all'interno di un bucket.

Concetti principali

Passiamo rapidamente in rassegna alcuni concetti e terminologia principali delle ACL. Parleremo di cosa sono i grantee e di come possono essere identificati, di quali permessi possono essere concessi e di cosa è una canned ACL.

Grantee

Un grantee è l'account o il gruppo AWS a cui viene concessa l'autorizzazione da una ACL. Esistono due modi per identificare un grantee quando si imposta una ACL:

  1. ID di un Progetto Cubbit: è possibile specificare il grantee come ID del Progetto Cubbit, utilizzando il parametro id. Ad esempio: id=111122223333.

  2. Gruppo predefinito: è possibile specificare il destinatario come gruppo predefinito, utilizzando il parametro uri. Il protocollo S3 fornisce i seguenti gruppi predefiniti:

    • AuthenticatedUsers: qualsiasi Progetto Cubbit autenticato.
    • AllUsers: qualsiasi utente su Internet.

    Per specificare un gruppo predefinito, si può usare il parametro uri e l'URL del gruppo. Ad esempio: uri=http://acs.amazonaws.com/groups/global/AllUsers.

Permessi che possono essere concessi

Le ACL possono essere utilizzate per concedere i seguenti permessi:

  • READ: consente al beneficiario di elencare il contenuto del bucket e di leggere il contenuto degli oggetti.
  • WRITE: permette di creare, sovrascrivere e cancellare gli oggetti nel bucket.
  • READ_ACP: permette di leggere l'ACL del bucket.
  • WRITE_ACP: consente di scrivere l'ACL del bucket.
  • FULL_CONTROL: consente all'assegnatario di avere tutti i permessi di cui sopra.
Perché il permesso WRITE non può essere applicato agli oggetti

Il permesso WRITE non ha conseguenze sugli oggetti: una volta caricati, nessuna operazione di scrittura può essere effettuata su di loro.

Esempio: una richiesta PutObject rimpiazzerebbe l'oggetto, o creerebbe una nuova versione in caso di Bucket versionati.

Canned ACL

Il protocollo S3 fornisce anche una serie di ACL predefinite, note come "canned ACL", che possono essere utilizzate per impostare rapidamente autorizzazioni comuni su un bucket o un oggetto. Le ACL predefinite disponibili sono:

  • private: concede i permessi solo al proprietario.
  • public-read: concede i permessi di lettura al gruppo AllUsers, che consiste in qualsiasi utente su Internet.
  • public-read-write: concede i permessi di lettura e scrittura al gruppo AllUsers, che consiste in qualsiasi utente su Internet.
  • authenticated-read: concede le autorizzazioni di lettura al gruppo AuthenticatedUsers, che consiste in qualsiasi Progetto Cubbit autenticato.
  • bucket-owner-read: concede le autorizzazioni di lettura al proprietario del bucket.
  • bucket-owner-full-control: concede il controllo completo al proprietario del bucket.

API coinvolte

Diverse API S3 sono collegate alle ACL:

  • GetBucketAcl: utilizzata per recuperare l'ACL di un bucket.
  • PutBucketAcl: usato per impostare l'ACL di un bucket.
  • GetObjectAcl: usato per recuperare l'ACL di un oggetto.
  • PutObjectAcl: usato per impostare l'ACL di un oggetto.

Limitazioni delle ACL

L'uso delle ACL presenta alcune limitazioni:

  • Solo il proprietario di un bucket o di un oggetto può impostare l'ACL. Ciò significa che gli altri utenti non possono concedere autorizzazioni a se stessi o ad altri utilizzando le ACL.
  • Le ACL possono concedere autorizzazioni solo a specifici Progetti Cubbit o gruppi predefiniti (come AuthenticatedUsers o AllUsers).
  • Le ACL si applicano al bucket o all'oggetto nel suo complesso e non possono essere utilizzate per concedere autorizzazioni su base individuale all'interno di un bucket.

Per superare queste limitazioni, è possibile utilizzare l'Ownership Controls per abilitare i controlli di proprietà degli oggetti su un bucket.

Utilizzo

Ecco alcuni esempi di utilizzo delle ACL con la CLI s3api.

Aggiornando l'ACL si sovrascrive la configurazione esistente

Notare bene che utilizzando l'operazione PutBucketAcl (o PutObjectAcl), si sta sovrascrivendo la configurazione esistente.

Se si desidera preservare la configurazione esistente, leggere prima il suo contenuto con l'operazione di GetBucketAcl (o GetObjectAcl), annotare i valori desiderati e fornirli in fase di creazione della nuova configurazione.

Leggere l'attuale configurazione collegata ad un Bucket, o un Oggetto

Bucket

aws s3api get-bucket-acl --endpoint https://s3.cubbit.eu --bucket my-cubbit-bucket | cat

L'ultima parte del comando (| cat) è opzionale: permette di stampare il risultato come standard output del terminale

Object

aws s3api get-object-acl --endpoint https://s3.cubbit.eu --bucket my-cubbit-bucket --key my-object | cat

L'ultima parte del comando (| cat) è opzionale: permette di stampare il risultato come standard output del terminale

Concessione dei permessi di lettura e scrittura a uno specifico Progetto Cubbit per un bucket

aws s3api put-bucket-acl --endpoint https://s3.cubbit.eu --bucket my-cubbit-bucket --grant-read id=1111222233 --grant-write id=1111222233

In questo esempio, il comando put-bucket-acl viene usato per impostare l'ACL per il bucket my-cubbit-bucket. Il parametro --acl è impostato su private, il che significa che solo il proprietario del bucket ha il permesso di accedervi. I parametri --grant-read e --grant-write sono usati per concedere i permessi di lettura e scrittura al Progetto Cubbit con ID 111122223333.

Concessione dei permessi di lettura e scrittura al gruppo di utenti autenticati per un bucket

aws s3api put-bucket-acl --endpoint https://s3.cubbit.eu --bucket my-cubbit-bucket --grant-read uri=<http://acs.amazonaws.com/groups/global/AuthenticatedUsers> --grant-write uri=<http://acs.amazonaws.com/groups/global/AuthenticatedUsers>

In questo esempio, il comando put-bucket-acl è usato per impostare l'ACL per il bucket my-bucket. Il parametro --acl è impostato su private, il che significa che solo il proprietario del bucket ha il permesso di accedervi. I parametri --grant-read e --grant-write sono usati per concedere i permessi di lettura e scrittura al gruppo AuthenticatedUsers, che consiste in tutti i Progetti Cubbit autenticati.

Concessione dei permessi di lettura e scrittura al gruppo tutti gli utenti per un oggetto

aws s3api put-object-acl --endpoint https://s3.cubbit.eu --bucket my-cubbit-bucket --key my-object --acl public-read-write

In questo esempio, il comando put-object-acl è usato per impostare l'ACL per l'oggetto my-object nel bucket my-bucket. Il parametro --acl corrispondente alla canned ACL è impostato su public-read-write, il che significa che qualsiasi utente può leggere e scrivere l'oggetto.

Un comando equivalente è il seguente:

aws s3api put-object-acl --endpoint https://s3.cubbit.eu --bucket my-cubbit-bucket --key my-object --grant-read uri=http://acs.amazonaws.com/groups/global/AllUsers --grant-write uri=http://acs.amazonaws.com/groups/global/AllUsers

I parametri --grant-read e --grant-write sono usati per concedere i permessi di lettura e scrittura al gruppo AllUsers, che consiste in qualsiasi utente su Internet.

FAQ

Come posso cambiare nuovamente le ACL di un bucket/oggetto?

Per cambiare le ACL di un bucket o di un oggetto basterà sovrascriverle.

Posso dare lo stesso permesso allo stesso Grantee più volte?

Sì, è possibile dare lo stesso permesso allo stesso Grantee più volte.

Vedi l'utente Luigi dell'esempio sotto.

aws s3api get-bucket-acl --endpoint https://s3.cubbit.eu --profile cubbit --bucket my-cubbit-bucket | cat
{
"Owner": {
"DisplayName": "Mario",
"ID": "eb91a08c-988f-48bb-ab17-f66d90ff4971"
},
"Grants": [
{
"Grantee": {
"DisplayName": "Mario",
"ID": "eb91a08c-988f-48bb-ab17-f66d90ff4971",
"Type": "CanonicalUser"
},
"Permission": "FULL_CONTROL"
},
{
"Grantee": {
"DisplayName": "Luigi",
"ID": "23e5661e-71a1-4f75-b8df-4e0a504df356",
"Type": "CanonicalUser"
},
"Permission": "FULL_CONTROL"
},
{
"Grantee": {
"DisplayName": "Luigi",
"ID": "23e5661e-71a1-4f75-b8df-4e0a504df356",
"Type": "CanonicalUser"
},
"Permission": "FULL_CONTROL"
}
]
}

Posso dare i permessi READ, WRITE e FULL_CONTROL allo stesso Grantee?

Sì, è possibile dare i permessi READ, WRITE e FULL_CONTROL allo stesso Grantee.

Vedi l'utente Luigi dell'esempio sotto.

{
"Owner": {
"DisplayName": "Mario",
"ID": "eb91a08c-988f-48bb-ab17-f66d90ff4971"
},
"Grants": [
{
"Grantee": {
"DisplayName": "Mario",
"ID": "eb91a08c-988f-48bb-ab17-f66d90ff4971",
"Type": "CanonicalUser"
},
"Permission": "FULL_CONTROL"
},
{
"Grantee": {
"DisplayName": "Luigi",
"ID": "23e5661e-71a1-4f75-b8df-4e0a504df356",
"Type": "CanonicalUser"
},
"Permission": "READ"
},
{
"Grantee": {
"DisplayName": "Luigi",
"ID": "23e5661e-71a1-4f75-b8df-4e0a504df356",
"Type": "CanonicalUser"
},
"Permission": "WRITE"
},
{
"Grantee": {
"DisplayName": "Luigi",
"ID": "23e5661e-71a1-4f75-b8df-4e0a504df356",
"Type": "CanonicalUser"
},
"Permission": "FULL_CONTROL"
}
]
}