Passa al contenuto principale

Access Control List (ACL)

Intro

ACL è l'acronimo di Access Control List (lista di controllo degli accessi), utilizzata per impostare i permessi su bucket e oggetti e pienamente supportata da Cubbit.

Le ACL sono utilizzate per concedere permessi a specifici progetti o gruppi al fine di eseguire azioni specifiche su un bucket o un oggetto. Si possono utilizzare due tipi di ACL:

  • Bucket ACL: queste ACL sono utilizzate per concedere permessi per 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 principali e la terminologia 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 è il progetto o il gruppo Cubbit a cui viene concessa l'autorizzazione da una ACL. Esistono due modi per identificare un grantee quando si imposta un'ACL:

  • Cubbit project ID: è possibile specificare il grantee come Cubbit Project ID utilizzando il parametro id. Ad esempio: id=111122223333.
  • Gruppo predefinito: è possibile specificare il destinatario come gruppo predefinito, utilizzando il parametro URI. Il protocollo S3 prevede i seguenti gruppi predefiniti:
    • AuthenticatedUsers: qualsiasi progetto Cubbit autenticato.
    • AllUsers: tutti gli utenti di Internet.
  • Per specificare un gruppo predefinito, è possibile utilizzare 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 S3 possono essere utilizzate per concedere i seguenti permessi:

  • READ:
    • quando applicato ad un bucket consente di elencare gli oggetti del bucket
    • quando applicato ad un oggetto consente di leggerne il suo contenuto
  • WRITE:
    • quando applicato ad un bucket consente di creare, sovrascrivere ed eliminare gli oggetti nel bucket
    • non applicabile agli oggetti
  • READ_ACP:
    • quando applicato ad un bucket consente di leggere l'ACL del bucket stesso
    • quando applicato ad un oggetto consente di leggere l'ACL dell'oggetto stesso
  • WRITE_ACP:
    • quando applicato ad un bucket consente di scrivere l'ACL del bucket stesso
    • quando applicato ad un oggetto consente di scrivere l'ACL dell'oggetto stesso
  • FULL_CONTROL: consente al grantee di avere tutte le autorizzazioni sopra elencate al bucket o all'oggetto a cui è stato applicato
note

Le operazioni WRITE non hanno alcun effetto sugli oggetti: una volta caricati, non è possibile eseguire altre azioni WRITE su di essi. Esempio: un'operazione di PutObject sostituirebbe semplicemente l’oggetto, o creerebbe una nuova versione nel caso di Bucket versionati.

note

Un permesso ACL applicato ad un bucket non è ereditato dagli oggetti contenuti in esso.

Permessi richiesti per API

APIBucket grantObject grant
HeadBucket, ListObjects, ListObjectsV2, ListObjectVersionsREAD-
HeadObject, GetObject, GetObjectVersion-READ
PutObject, CreateMultipartUpload, UploadPart, CompleteMultipartUpload, DeleteObjectsWRITEnot applicable
GetBucketAclREAD_ACP-
GetObjectAcl-READ_ACP
PutBucketAclWRITE_ACP-
PutObjectAcl-WRITE_ACP
CopyObjectWRITE (sul bucket destinazione)READ (sull'oggetto sorgente)
ListPartsWRITE-
ListMultipartUploadsFULL_CONTROL-
note

Altre API, come PutBucketLifecycleConfiguration, richiedono di essere il proprietario del bucket.

Canned ACL

Il protocollo S3 fornisce 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 canned ACL disponibili sono:

  • private: concede le autorizzazioni solo al proprietario.
  • public-read: concede i permessi di lettura al gruppo AllUsers, che consiste in qualsiasi utente di Internet.
  • public-read-write: concede le autorizzazioni di lettura e scrittura al gruppo AllUsers, che consiste in qualsiasi utente di Internet.
  • authenticated-read: concede i permessi di lettura al gruppo AuthenticatedUsers, composto da tutti i Progetti Cubbit autenticati.
  • bucket-owner-read: concede i permessi di lettura al proprietario del bucket.
  • bucket-owner-full-control: concede il pieno controllo al proprietario del bucket.

API coinvolte

Diverse API S3 sono correlate alle ACL:

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

Limiti delle ACL

L'uso delle ACL presenta alcuni limiti:

  • Solo il proprietario di un bucket o di un oggetto può impostare l'ACL. Ciò significa che gli altri utenti non possono concedere permessi a se stessi o ad altri utilizzando le ACL.
  • Le ACL possono concedere permessi solo a specifici Progetti Cubbit o a 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 gli Ownership Controls per abilitare i controlli di proprietà degli oggetti su un bucket.

How to

A seguire alcuni esempi di utilizzo delle ACL con la CLI s3api.

Aggiornare l'ACL sovrascrive le configurazioni esistenti

Si noti che eseguendo le operazioni PutBucketAcl (o PutObjectAcl), si sovrascrive quella esistente.

Se si desidera conservare la configurazione esistente, si deve prima eseguire GetBucketAcl (o GetObjectAcl), annotare la configurazione esistente e fornirla insieme a quella nuova.

Leggere le autorizzazioni correnti collegate a un determinato bucket o 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

Oggetto

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=111122223333 --grant-write id=111122223333

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 Progetto Cubbit con l'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 viene 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 AllUsers 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 viene usato per impostare l'ACL per l'oggetto my-object nel bucket my-cubbit-bucket. Il parametro --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 di 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"
}
]
}