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
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.
Un permesso ACL applicato ad un bucket non è ereditato dagli oggetti contenuti in esso.
Permessi richiesti per API
API | Bucket grant | Object grant |
---|---|---|
HeadBucket, ListObjects, ListObjectsV2, ListObjectVersions | READ | - |
HeadObject, GetObject, GetObjectVersion | - | READ |
PutObject, CreateMultipartUpload, UploadPart, CompleteMultipartUpload, DeleteObjects | WRITE | not applicable |
GetBucketAcl | READ_ACP | - |
GetObjectAcl | - | READ_ACP |
PutBucketAcl | WRITE_ACP | - |
PutObjectAcl | - | WRITE_ACP |
CopyObject | WRITE (sul bucket destinazione) | READ (sull'oggetto sorgente) |
ListParts | WRITE | - |
ListMultipartUploads | FULL_CONTROL | - |
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
oAllUsers
). - 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.
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"
}
]
}