Policy e Permessi
Introduzione
Cubbit utilizza un sistema di controllo degli accessi basato su criteri per gestire le autorizzazioni degli utenti e delle risorse all'interno di un progetto. Le policy sono documenti JSON che definiscono le autorizzazioni per le azioni sulle risorse. Le policy possono essere associate alle identità IAM (utenti o gruppi di utenti) o direttamente alle risorse (bucket) per controllare l'accesso.
Cubbit supporta anche lo standard ACL s3 per gestire l'accesso ai bucket e agli oggetti.
Tipi di policy
Cubbit supporta 2 diversi tipi di policy e ACL:
- Policy basate sull'identità: Collegano le policy alle identità IAM (utenti o gruppi a cui gli utenti appartengono). Le policy basate sull'identità concedono autorizzazioni a un'identità.
- Policy basate sulle risorse: allega le policy direttamente alle risorse, come i bucket. Le politiche basate sulle risorse concedono autorizzazioni alla risorsa a cui è associata la policy.
- ACL: Utilizza gli ACL per controllare quali utenti di altri progetti possono accedere alla risorsa a cui è associato l'ACL.
Flusso di autorizzazione
Quando viene effettuata una richiesta di accesso a un bucket o a un oggetto DS3, il flusso di autorizzazione è composto da alcuni passaggi che forniscono decisioni esplicite/implicite di autorizzazione/rifiuto in base alle politiche associate alla risorsa e all'identità che effettua la richiesta. I seguenti passaggi descrivono il flusso di autorizzazione:
- Verifica dell'autorizzazione tramite chiave API / chiave segreta (ad eccezione delle richieste anonime): se la richiesta include credenziali API Key e Secret Key valide, il flusso di autorizzazione prosegue con il passaggio successivo. Se le credenziali non sono valide, la richiesta viene rifiutata.
- Valutazione delle policy IAM: il sistema valuta le policy IAM associate all'utente collegato alle credenziali fornite. Se una policy IAM nega esplicitamente l'azione richiesta sulla risorsa specificata, la richiesta viene negata. Se una qualsiasi policy IAM consente esplicitamente l'azione richiesta sulla risorsa specificata, il flusso di autorizzazione prosegue con il passaggio successivo.
- Valutazione delle policy dei bucket: il sistema valuta la policy del bucket associata al bucket di destinazione. Se la policy del bucket nega esplicitamente l'azione richiesta sulla risorsa specificata, la richiesta viene negata. Se la policy del bucket nega esplicitamente l'azione richiesta sulla risorsa specificata, la richiesta viene negata. Se la policy del bucket non consente o nega esplicitamente l'azione richiesta, la richiesta viene verificata rispetto alle credenziali fornite e passa alla fase successiva.
- Valutazione degli ACL: il sistema valuta gli elenchi di controllo degli accessi (ACL) associati al bucket e all'oggetto di destinazione. Se un ACL consente esplicitamente l'azione richiesta dall'utente, la richiesta viene autorizzata. Se nessun ACL consente esplicitamente l'azione richiesta, la richiesta viene negata.
Policy basate sull'identità
Le policy basate sull'identità sono documenti JSON che descrivono dei permessi che controllano quali azioni un'identità può eseguire, su quali risorse.
Una policy IAM è un modo per permettere o negare agli utenti di eseguire determinate azioni in un progetto Cubbit.
In Cubbit si gestisce l'accesso creando delle policy e associandole alle identità IAM (utenti o gruppi di utenti).
Ogni volta che un utente IAM effettua una richiesta, Cubbit valuta le policy associate per permettere o negare l'accesso alla risorsa.
Le policy IAM definiscono le autorizzazioni per le azioni, indipendentemente dal metodo utilizzato per operare. Ad esempio, se una policy consente l'azione GetUser, un utente con quella policy può ottenere informazioni sull'utente dalla Cubbit Console o dall'API Cubbit.

Policy predefinite del progetto
L'utente root ha per default tutti i permessi su tutte le risorse del progetto. Questa policy non può essere modificata o cancellata. Inoltre, è impossibile assegnare altre policy all'utente root.
Policy preimpostate
Quando si crea un progetto, vengono generate alcune policy predefinite:
- Owner: solo l'utente root può essere l'assegnatario di questa policy. Questo gli consente di eseguire qualsiasi azione su qualsiasi risorsa del progetto.
- Admin: è una policy per super utenti. Assegnando questa policy a un utente si dà a tale utente gli stessi poteri dell'owner.
- Member: questa policy consente all'utente di eseguire la maggior parte delle azioni su S3 e IAM. L'utente non può aggiornare o eliminare le impostazioni del progetto e assegnare le policy.
- ReadOnly: questa policy consente all'utente di leggere solo l'entità di un progetto.
Se si dispone dell'autorizzazione giusta, è possibile creare tutte le combinazioni di policy desiderate.
Definizione delle policy
Le policy sono memorizzate in Cubbit come documenti JSON. Quando si crea una policy JSON, IAM esegue una convalida della policy per aiutarti a creare una policy efficace. IAM identifica gli errori di sintassi JSON e l'applicabilità formale della policy, cioè se la risorsa può essere oggetto dell'azione.
Struttura JSON della policy
Ecco come viene definita una policy in Cubbit
{
"id": "a912ec9a-4623-11ed-b878-0242ac120002",
"syntax_version": "2023-10-16", // Version of the document syntax
"name": "Unique Policy Name",
"description": "This is a generic description for the policy",
"statement": [
{
"effect": "allow", // or "deny"
"action": [
"iam:ListUsers"
],
"resource": [
"crn:region1:iam:project:tenant_b562b6be-cac4-4d2c-840c-fa266228a30f/170bcefb-68f5-479f-9d1e-e8553eaaccb9"
]
}
]
}
Effect
allow (letteralmente: permettere) o deny (letteralmente: negare) come valore di stringa
Action
Il campo action (letteralmente: azione) è un elenco di stringhe contenenti l'azione da consentire. Ogni azione inizia con il servizio di dominio, seguito dal separatore : e poi dal nome dell'azione.
Per un elenco dettagliato di tutte le azioni possibili, consulta la sezione dedicata di seguito.
Resource - CRN
Il campo resource contiene un elenco di possibili CRN (Cubbit Resource Name) di risorse definiti in Cubbit. Specifica a quali risorse verrà applicato la policy.
Per ulteriori dettagli su CRN, consultare la sezione dedicata riportata di seguito.
Gruppi
Gli utenti possono essere organizzati in gruppi. Un utente può far parte di più gruppi contemporaneamente. Ad ogni gruppo possono essere associate una o più policy.
Un utente può avere assegnate policy tramite gruppi oppure singolarmente. Le policy assegnate ad un utente singolo sono più importanti di quelle assegnate tramite gruppo.
Come per le policy assegnate ad un singolo utente, il caso Deny è il default.
Di seguito vediamo una tabella che spiega come le policy si combinano in caso di assegnamento tra gruppi e singolo utente.
| Effect1 \ Effect2 | Allow user | Allow group | Deny user | Deny group |
|---|---|---|---|---|
| ** Allow user ** | allow | allow | deny | allow |
| ** Allow group ** | allow | allow | deny | deny |
| ** Deny user ** | deny | deny | deny | deny |
| ** Deny group ** | allow | deny | deny | deny |
Actions
Una o più azioni sono coinvolte nella policy.
Le azioni devono corrispondere al tipo di risorsa nel target CRN. Ad esempio, non è possibile definire una policy con iam:CreateGroup su una risorsa di tipo bucket.
IAM Actions
| Azione | Risorsa bersaglio | Descrizione |
|---|---|---|
| iam:GetProject | project | Permette di recuperare le informazioni del progetto |
| iam:ManageProject | project | Permette di aggiornare o cancellare il progetto |
| iam:CreateUser | project | Permette di creare e invitare un nuovo utente IAM |
| iam:ListUsers | project | Permette di ottenere la lista di utenti IAM del progetto |
| iam:ManageUsers | user | Permette di aggiornare e cancellare un utente IAM |
| iam:GetUser | user | Permette di recuperare un utente IAM |
| iam:AttachUserPolicy | user | Permette di applicare una policy gestita a uno specifico utente IAM |
| iam:CreatePolicyVersion | policy | Permette di creare una nuova versione di una specifica policy gestita |
| iam:DeletePolicy | policy | Permette di cancellare una specifica policy gestita e di rimuoverla da qualsiasi entità IAM (utenti o gruppi) alla quale è collegata la policy |
| iam:DetachUserPolicy | user | Permette di separare una policy gestita da uno specifico utente IAM |
| iam:GetPolicy | policy | Permette di recuperare informazioni riguardo una specifica policy gestita, inclusa la versione di default della policy e il numero totale di identità alla quale la policy è collegata |
| iam:ListAttachedUserPolicies | user | Permette di elencare tutte le policy gestite che sono collegate a uno specifico utente IAM |
| iam:ListEntitiesForPolicy | policy | Permette di elencare tutte le identità IAM alla quale è collegata una specifica policy gestita |
| iam:ListPolicies | policy | Permette di elencare tutte le policy gestite |
| iam:CreatePolicy | policy | Permette di creare una nuova policy gestita |
| iam:CreateKey | user | Permette di creare una nuova chiave |
| iam:ListKeys | user | Permette di ottenere una lista di tutte le chiavi che sono controllate da un utente specifico |
| iam:ManageKey | user | Permette di aggiornare o cancellare il nome di una chiave di un utente IAM |
| iam:CreateGroup | group | Permette di create un gruppo |
| iam:ManageGroup | group | Permette di aggiornare un gruppo |
| iam:ListGroup | group | Permette di ottenere la lista dei gruppi di un progetto |
| iam:GetGroup | group | Permette di ottenenere i dettagli del gruppo |
| iam:DeleteGroup | group | Permette di cancellare un gruppo |
| iam:AddGroupUser | group | Permette di aggiungere un utente al gruppo |
| iam:RemoveGroupUser | group | Permette di rimuovere un utente dal gruppo |
| iam:AttachGroupPolicy | group | Permette di applicare una policy ad un gruppo |
| iam:DetachGroupPolicy | group | Permette di rimuovere una policy da un gruppo |
| iam:ListEntitiesForGroup | group | Permette di listare le policy e gli utenti del gruppo |
| :::info |
Per operare sulle risorse S3, come ad esempio creare un bucket o caricare un oggetto, è necessario fornire almeno iam:CreateKey, iam:ManageKey e iam:ListKeys ai vostri utenti
:::
S3 Actions
Le Actions con Target Resource di tipo * possono essere utilizzate solo con *. Non sono ammessi altri valori
| Azione | Risorsa bersaglio | Descrizione |
|---|---|---|
| s3:ListBucket | bucket | Permette di elencare alcuni o tutti gli oggetti di un bucket Cubbit S3 (fino a 1000) |
| s3:ListBucketVersions | bucket | Permette di elencare i metadati di tutte le versioni degli oggetti in un bucket Cubbit S3 |
| s3:PutObject | object | Garantisce il permesso di aggiungere oggetti a un bucket o una cartella |
| s3:GetObject | object | Permette di scaricare un oggetto |
| s3:GetObjectVersion | object | Permette di recuperare una versione specifica di un oggetto |
| s3:DeleteObject | object | Permette di rimuovere la versione nulla di un oggetto e di inserire un marcatore di cancellazione, il quale diventa la versione corrente dell'oggetto |
| s3:DeleteObjectVersion | object | Permette di rimuovere una versione specifica di un oggetto |
| s3:AbortMultipartUpload | object | Permette di interrompere un multipart upload |
| s3:ListMultipartUploadParts | object | Permette di elencare le parti che sono state caricate per uno specifico caricamento multipart |
| s3:GetObjectTagging | object | Permette di restituire l’insieme dei tag di un oggetto |
| s3:GetObjectAcl | object | Permette di restituire l'elenco di controllo degli accessi (ACL) di un oggetto |
| s3:GetObjectVersionAcl | object | Permette di restituire l'elenco di controllo degli accessi (ACL) di una versione specifica di un oggetto |
| s3:PutObjectAcl | object | Permette di impostare le autorizzazioni dell'elenco di controllo degli accessi (ACL) per gli oggetti nuovi o già esistenti in un bucket S3 |
| s3:PutObjectVersionAcl | object | Permette di impostare le autorizzazioni dell'elenco di controllo degli accessi (ACL) per gli oggetti nuovi o già esistenti in un bucket S3 |
| s3:PutObjectRetention | object | Permette di inserire una configurazione di object retention su un oggetto |
| s3:GetObjectRetention | object | Permette di ottenere l'object retention (letteralmente: conservazione dell'oggetto) |
| s3:PutObjectLegalHold | object | Permette di applicare una configurazione di legal hold (letteralmente: ritenzione legale) all'oggetto specificato |
| s3:GetObjectLegalHold | object | Permette di ottenere la configurazione di legal hold (ritenzione legale) dell'oggetto |
| s3:BypassGovernanceRetention | object | Permette di eliminare un oggetto protetto da retention |
| s3:ListAllMyBuckets | * | Permette di elencare tutti i bucket di proprietà del mittente autenticato della richiesta |
| s3:GetBucketVersioning | bucket | Permette di restituire lo stato di versioning di un bucket Cubbit S3 |
| s3:GetEncryptionConfiguration | bucket | Permette di restituire la configurazione di crittografia predefinita di un bucket Cubbit S3 |
| s3:CreateBucket | - | Permette di creare un nuovo bucket |
| s3:DeleteBucket | bucket | Permette di cancellare il bucket indicato nell'URI |
| s3:PutBucketVersioning | bucket | Permette di impostare lo stato di versioning di un bucket Cubbit S3 esistente |
| s3:GetBucketOwnershipControls | bucket | Permette di recuperare i controlli di proprietà di un bucket |
| s3:GetLifecycleConfiguration | bucket | Permette di restituire le informazioni di configurazione del ciclo di vita impostate su un bucket Cubbit S3 |
| s3:PutBucketOwnershipControls | bucket | Permette di aggiungere, sostituire o cancellare i controlli di proprietà su un bucket |
| s3:PutLifecycleConfiguration | bucket | Permette di creare una nuova configurazione del ciclo di vita per il bucket o di sostituire una configurazione del ciclo di vita esistente. |
| s3:ListBucketMultipartUploads | bucket | Permette di elencare i multipart upload in corso |
| s3:GetBucketObjectLockConfiguration | bucket | Permette di ottenere la configurazione object lock di un bucket Cubbit S3 |
| s3:PutBucketObjectLockConfiguration | bucket | Permette di impostare la configurazione object lock su un bucket Cubbit S3 |
| s3:GetBucketAcl | bucket | Permette di usare la sottorisorsa acl per restituire l'elenco di controllo degli accessi (ACL) di un bucket Cubbit S3 |
| s3:PutBucketAcl | bucket | Permette di impostare i permessi su un bucket esistente utilizzando gli elenchi di controllo degli accessi (ACL) |
| s3:GetBucketLocation | bucket | Permette di ottenere la posizione del bucket |
:::
DS3 Actions
| Azione | Risorsa bersaglio | Descrizione |
|---|---|---|
| ds3:MapBucketNamesAndIDs | bucket | Fornisce i permessi per listare le associazioni nome del bucket - id |
Esempi
In questa sezione vedremo alcuni esempi di policy per eseguire casi d'uso comuni.
È sempre possibile recuperare il CRN delle risorse dalla Cubbit Console. Ogni risorsa ha il suo menù contestuale con la voce "Copy CRN".
Permessi minimi per accedere alla Console Web
Questa policy fornisce i permessi minimi per l'accesso di un utente alla Console Web. Più in dettaglio, la prima sezione è composta da azioni IAM che consentono a un utente di creare e gestire le proprie chiavi di accesso, oltre alla possibilità di vedersi listato/inserito nell'elenco degli utenti. La seconda sezione è costituita da una singola azione S3, necessaria per listare tutti i bucket del progetto, ma senza la possibilità di visualizzare la lista degli oggetti all'interno di tali bucket.
{
"syntax_version":"2023-10-16",
"statement":[
{
"effect":"allow",
"action":[
"iam:CreateKey",
"iam:ManageKey",
"iam:ListKeys",
"iam:GetUser"
],
"resource":[
"crn:eu-west-1:iam:user:self"
]
},
{
"effect":"allow",
"action":[
"s3:ListAllMyBuckets"
],
"resource":[
"*"
]
}
]
}
Permessi S3 di base per la lettura/scrittura degli oggetti in una cartella
La prima sezione di questa policy consente all'utente di elencare tutti gli oggetti e le versioni degli oggetti all'interno di un bucket specificato. È possibile estendere questa policy a più bucket aggiungendo un nuovo CRN nel campo resource. Nella seconda sezione della policy vengono assegnati i permessi di lettura, scrittura e cancellazione. In questo caso, il carattere jolly * alla fine del CRN indica che i permessi sono validi per l'intero bucket, ma è possibile specificare una singola cartella o un singolo oggetto. Come nella sezione precedente, è possibile aggiungere più CRN nel campo resource. Infine, è possibile rimuovere o aggiungere azioni per avere un maggiore controllo sui permessi, ad esempio se si lascia solo s3:PutObject, un utente potrà caricare nuovi file senza avere la possibilità di scaricarli o rimuoverli.
{
"syntax_version":"2023-10-16",
"statement":[
{
"effect":"allow",
"action":[
"s3:ListBucket",
"s3:ListBucketVersions"
],
"resource":[
"crn:eu-west-1:s3:bucket:bucket-name"
]
},
{
"effect":"allow",
"action":[
"s3:PutObject",
"s3:GetObject",
"s3:GetObjectVersion",
"s3:DeleteObject",
"s3:DeleteObjectVersion"
],
"resource":[
"crn:eu-west-1:s3:object:bucket-name/*"
]
}
]
}
Come migrare dalle versioni precedenti della sintassi
La versione della sintassi della policy 2023-10-16 ha introdotto alcune modifiche al modo in cui le risorse sono definite nel documento della policy.
Se disponi di policy create con una versione sintattica precedente, devi aggiornarle al nuovo formato poiché quello precedente non accetta il formato CRN v2 attualmente utilizzato e restituito nella console DS3.
Per migrare dalla versione sintattica 2022-10-07 alla versione 2023-10-16, è necessario aggiornare il campo resource di ciascuna dichiarazione nel documento della policy in modo che corrisponda al formato CRN v2.
Per convertire un CRN v1 in un CRN v2, seguire questo schema:
- crn, region, service rimangono invariati
- resource-type rimane uguale
- tenant-id, swarm-id e project-id faranno parte del percorso delle risorse come
tenant_<tenant_id>/project_<project_id>/ - resource-id verrà aggiunto alla fine di resource-path
Se non disponi dell'ID, non aggiungere quel segmento al percorso della risorsa per quella risorsa.
Ecco un esempio di migrazione:
Vecchio formato (versione sintattica 2022-10-07):
{
"syntax_version": "2022-10-07",
"name": "Unique Policy Name",
"description": "This is a generic description for the policy",
"statement": [
{
"effect": "allow",
"action": [
"iam:ListUsers"
],
"resource":[
"crn:region1:iam:b562b6be-cac4-4d2c-840c-fa266228a30f::170bcefb-68f5-479f-9d1e-e8553eaaccb9:project:170bcefb-68f5-479f-9d1e-e8553eaaccb9"
]
}
]
}
Nuovo formato (versione sintattica 2023-10-16):
{
"syntax_version":"2023-10-16",
"name": "Unique Policy Name",
"description": "This is a generic description for the policy",
"statement": [
{
"effect": "allow",
"action": [
"iam:ListUsers"
],
"resource":[
"crn:region1:iam:project:tenant_b562b6be-cac4-4d2c-840c-fa266228a30f/170bcefb-68f5-479f-9d1e-e8553eaaccb9"
]
}
]
}
Per ulteriori dettagli sul formato CRN v2, consultare la documentazione CRN.
Policy basate sulle risorse
Una policy bucket è una policy basata sulle risorse che è possibile utilizzare per gestire le autorizzazioni per i bucket DS3 e gli oggetti al loro interno.
Si differenziano dalle policy IAM in quanto sono associate direttamente al bucket, anziché a un utente. Ciò consente di definire regole di controllo degli accessi che si applicano specificatamente al bucket e al suo contenuto, indipendentemente da chi effettua la richiesta.
Le policy dei bucket sono scritte in JSON e specificano quali azioni sono consentite o negate per quali soggetti (utenti) sul bucket specificato e sui suoi oggetti. Una policy bucket viene associata direttamente a un bucket e si applica a tutti gli oggetti definiti dall'ambito specificato nella policy stessa.
È possibile utilizzare le policy dei bucket per controllare l'accesso ai bucket DS3 e agli oggetti in base a varie condizioni, quali la presenza di intestazioni specifiche nella richiesta, l'esecuzione della richiesta da parte di un determinato User Agent o la provenienza della richiesta da un sito web specifico (tramite l'intestazione Referer).
Esempio di policy dei bucket, formato json
{
"name": "Test Policy",
"description": "my beautiful test policy",
"syntax_version": "2025-03-01",
"statement": [
{
"sid": "SkipAuthenticationForProtectedObjectRetrievalWithProperHeader",
"effect": "allow",
"principal": [
"*"
],
"action": [
"s3:GetObject"
],
"resource": [
"crn:eu-west-1:s3:object:tenant_11111111-1111-1111-1111-111111111111/project_6d8a86bf-dfd1-47da-bdec-c36c8e02b7c5/my-bucket/protected/*"
],
"condition": {
"StringLike": {
"header/X-Custom-Header": [
"Custom-Value-*-???"
]
}
}
},
{
"sid": "SkipAuthenticationForPublicObjectRetrieval",
"effect": "allow",
"principal": [
"*"
],
"action": [
"s3:GetObject"
],
"resource": [
"crn:eu-west-1:s3:object:tenant_11111111-1111-1111-1111-111111111111/project_6d8a86bf-dfd1-47da-bdec-c36c8e02b7c5/my-bucket/public/*"
]
},
{
"sid": "GetObjectBlockedOnSpecificFile",
"effect": "deny",
"principal": [
"*"
],
"action": [
"s3:GetObject"
],
"resource": [
"crn:eu-west-1:s3:object:tenant_11111111-1111-1111-1111-111111111111/project_6d8a86bf-dfd1-47da-bdec-c36c8e02b7c5/my-bucket/*/secret-object"
]
}
]
}
The above example policy has 3 statements:
- Consente a chiunque di eseguire l'azione
s3:GetObjectsu qualsiasi oggetto nel bucket con una chiave che inizia conprotected/, purché la richiesta includa un'intestazione denominataX-Custom-Headercon un valore che corrisponda al modelloCustom-Value-*-???. - Consente a chiunque di eseguire l'azione
s3:GetObjectsu qualsiasi oggetto nel bucket con una chiave che inizia conpublic/, senza ulteriori condizioni. - Nega l'accesso a un oggetto specifico denominato “secret-object” nello stesso bucket a tutti i soggetti, sovrascrivendo eventuali precedenti dichiarazioni di autorizzazione.
La seconda regola è un caso d'uso comune, infatti consente di ospitare risorse pubbliche, come immagini o video, in un bucket proteggendo al contempo gli altri oggetti.
Componenti di una policy del bucket
Una policy bucket è costituita da diversi componenti chiave:
- Name: un nome descrittivo per la policy.
- Description: breve descrizione dello scopo della policy.
- Version: specifica la versione del linguaggio della policy. La versione attuale è “2025-03-01”.
- Statement: una serie di singole dichiarazioni che definiscono le autorizzazioni. Ogni dichiarazione include:
- Sid (ID Statement): (Facoltativo) Identificatore dello statement.
- Effect: specifica se l'istruzione consente o nega l'accesso. I valori validi sono "allow" e "deny".
- Principal: specifica l'utente a cui si applica la policy. È possibile utilizzare “*” per indicare tutti gli utenti.
- Action: specifica le azioni consentite o negate. Ad esempio, “s3:GetObject” consente di leggere gli oggetti dal bucket. Di seguito è riportato un elenco di tutte le azioni disponibili qui sotto.
- Resource: specifica il bucket e gli oggetti a cui si applica la policy, utilizzando i loro nomi di risorsa Cubbit (CRN). Il carattere jolly “*” corrisponde a uno o più caratteri. Il carattere jolly “?” corrisponde esattamente a un carattere.
- Condition: (Facoltativo) Specifica le condizioni alle quali la policy è in vigore, ad esempio intestazioni specifiche nella richiesta.
Principal
Il principale è l'utente a cui si applica la policy. È possibile utilizzare “*” per indicare tutti gli utenti. Un soggetto specifico deve essere specificato con il suo CRN.
Action
Ecco un elenco di tutte le azioni disponibili che possono essere specificate in una policy del bucket:
s3:GetObject- Necessario per leggere gli oggetti da un bucket.s3:GetObjectVersion- Richiesto per leggere versioni specifiche di oggetti da un bucket con controllo delle versioni.s3:DeleteObject- Necessario per eliminare oggetti da un bucket.s3:DeleteObjectVersion- Richiesto per eliminare versioni specifiche di oggetti da un bucket con controllo delle versioni.s3:PutObject- Necessario per aggiungere oggetti a un bucket.s3:AbortMultipartUpload- Necessario per interrompere un caricamento multiparte.s3:GetObjectLegalHold- Richiesto per leggere lo stato di conservazione a fini legali di un oggetto.s3:PutObjectLegalHold- Necessario per impostare lo stato di conservazione a fini legali di un oggetto.s3:ListBucket- Richiesto per elencare gli oggetti in un bucket.s3:ListBucketVersions- Richiesto per elencare le versioni degli oggetti in un bucket con controllo delle versioni.s3:ListBucketMultipartUploads- Richiesto per elencare i caricamenti multiparte in corso in un bucket.s3:ListMultipartUploadParts- Richiesto per elencare le parti di un caricamento multiparte specifico.s3:GetLifecycleConfiguration- Richiesto per leggere la configurazione del ciclo di vita di un bucket.s3:PutLifecycleConfiguration- Richiesto per impostare la configurazione del ciclo di vita di un bucket.s3:GetBucketOwnershipControls- Richiesto per leggere i controlli di proprietà di un bucket.s3:PutBucketOwnershipControls- Necessario per impostare i controlli di proprietà di un bucket.s3:DeleteBucket- Necessario per eliminare un bucket.s3:GetBucketAcl- Richiesto per leggere l'elenco di controllo degli accessi (ACL) di un bucket.s3:PutBucketAcl- Richiesto per impostare l'elenco di controllo degli accessi (ACL) di un bucket.s3:GetBucketLocation- Richiesto per leggere il vincolo di posizione di un bucket.s3:GetBucketVersioning- Richiesto per leggere lo stato di versioning di un bucket.s3:PutBucketVersioning- Richiesto per impostare lo stato di versioning di un bucket.s3:GetBucketObjectLockConfiguration- Richiesto per leggere la configurazione del blocco degli oggetti di un bucket.s3:PutBucketObjectLockConfiguration- Richiesto per impostare la configurazione del blocco degli oggetti di un bucket.s3:GetObjectRetention- Richiesto per leggere le impostazioni di conservazione di un oggetto.s3:PutObjectRetention- Necessario per impostare le impostazioni di conservazione di un oggetto.s3:GetObjectAcl- Richiesto per leggere l'elenco di controllo degli accessi (ACL) di un oggetto.s3:PutObjectAcl- Richiesto per impostare l'elenco di controllo degli accessi (ACL) di un oggetto.
Alcune azioni si riferiscono a un bucket, mentre altre si riferiscono a un oggetto. Assicurati di specificare il tipo di risorsa corretto nella dichiarazione della policy. Per ulteriori dettagli, consultare la sezione Resources.
Operazioni S3 comuni e azioni richieste
GetObjectrichiedes3:GetObjectdurante la lettura di un oggettos3:GetObjectVersionquando si legge una versione specifica di un oggetto in un bucket con controllo delle versioni
PutObjectrichiedes3:PutObjectquando si aggiunge un oggetto a un bucket
CreateMultipartUpload,UploadParteCompleteMultipartUploadrichiedonos3:PutObject
ListObjectsV2richiedes3:ListBucketquando si elencano gli oggetti in un bucket
HeadObjectrichiedes3:GetObjectdurante il recupero dei metadati di un oggettos3:GetObjectVersionquando si recuperano i metadati di una versione specifica di un oggetto in un bucket con controllo delle versioni
DeleteObjecteDeleteObjectsrichiedonos3:DeleteObjectquando si elimina un oggettos3:DeleteObjectVersionquando si elimina una versione specifica di un oggetto in un bucket con controllo delle versioni
PutObjectRetentionrichiedes3:PutObjectRetentionquando si impostano le impostazioni di conservazione per un oggetto
Resources
Una risorsa specifica il bucket e/o gli oggetti a cui si applica la policy, utilizzando i loro nomi di risorsa Cubbit (CRN). È possibile utilizzare caratteri jolly nella specifica delle risorse:
*(asterisco): corrisponde a zero o più caratteri. Ad esempio,crn:eu-west-1:s3:object:tenant_11111111-1111-1111-1111 -111111111111/project_6d8a86bf-dfd1-47da-bdec-c36c8e02b7c5/my-bucket/images/*corrisponde a tutti gli oggetti all'interno della cartellaimages/del bucket specificato.?(punto interrogativo): corrisponde esattamente a un carattere. Ad esempio,crn:eu-west-1:s3:object:tenant_11111111-1111-1111-1111-111111111111/project_6d8a86bf-dfd1-47da-bdec-c36c8e02b7c5/my-bucket/image?. jpgcorrisponde a oggetti comeimage1.jpg,imageA.jpg, ma non aimage10.jpg.
A seconda dell'azione specificata nella policy, la risorsa può fare riferimento al bucket stesso o agli oggetti all'interno del bucket. Ad esempio:
- Per azioni come
s3:ListBucket, la risorsa deve fare riferimento al CRN del bucket (ad esempio,crn:eu-west-1:s3:bucket:tenant_11111111-1111-1111-1111 -111111111111/project_6d8a86bf-dfd1-47da-bdec-c36c8e02b7c5/my-bucket). - Per azioni come
s3:GetObject, la risorsa deve fare riferimento al CRN dell'oggetto (ad esempio,crn:eu-west-1:s3:object:tenant_11111111-1111-1111-1111 -111111111111/project_6d8a86bf-dfd1-47da-bdec-c36c8e02b7c5/my-bucket/my-object.txt).
Esempio
"statement": [
{
"sid": "SkipAuthenticationForPublicObjectRetrieval",
"effect": "allow",
"principal": ["*"],
"action": ["s3:GetObject"],
"resource": [ // using a bucket CRN
"crn:eu-west-1:s3:object:tenant_11111111-1111-1111-1111-111111111111/project_6d8a86bf-dfd1-47da-bdec-c36c8e02b7c5/my-bucket"
]
}
]
"statement": [
{
"sid": "SkipAuthenticationForPublicObjectRetrieval",
"effect": "allow",
"principal": ["*"],
"action": ["s3:GetObject"],
"resource": [ // using an object CRN
"crn:eu-west-1:s3:object:tenant_11111111-1111-1111-1111-111111111111/project_6d8a86bf-dfd1-47da-bdec-c36c8e02b7c5/my-bucket/public/*"
]
}
]
Tipo di risorsa per azione
Ecco un elenco delle azioni della policy dei bucket e dei tipi di risorse corrispondenti:
| Azione | Tipo di risorsa |
|---|---|
| s3:ListBucket | Bucket CRN |
| s3:ListBucketVersions | Bucket CRN |
| s3:GetLifecycleConfiguration | Bucket CRN |
| s3:PutLifecycleConfiguration | Bucket CRN |
| s3:GetBucketOwnershipControls | Bucket CRN |
| s3:PutBucketOwnershipControls | Bucket CRN |
| s3:DeleteBucket | Bucket CRN |
| s3:GetBucketAcl | Bucket CRN |
| s3:PutBucketAcl | Bucket CRN |
| s3:GetBucketLocation | Bucket CRN |
| s3:GetBucketVersioning | Bucket CRN |
| s3:PutBucketVersioning | Bucket CRN |
| s3:GetBucketObjectLockConfiguration | Bucket CRN |
| s3:PutBucketObjectLockConfiguration | Bucket CRN |
| s3:ListBucketMultipartUploads | Bucket CRN |
| s3:GetObject | Object CRN |
| s3:GetObjectVersion | Object CRN |
| s3:DeleteObject | Object CRN |
| s3:DeleteObjectVersion | Object CRN |
| s3:PutObject | Object CRN |
| s3:AbortMultipartUpload | Object CRN |
| s3:GetObjectLegalHold | Object CRN |
| s3:PutObjectLegalHold | Object CRN |
| s3:GetObjectRetention | Object CRN |
| s3:PutObjectRetention | Object CRN |
| s3:GetObjectAcl | Object CRN |
| s3:PutObjectAcl | Object CRN |
| s3:ListMultipartUploadParts | Object CRN |
Conditions
Una condizione è un oggetto complesso che utilizza “operatori” per confrontare una “chiave di condizione” (come un'intestazione di richiesta) con uno o più valori. Le condizioni consentono di specificare ulteriori vincoli relativi al momento in cui una policy è in vigore.
Condition keys
Le condition keys disponibili sono:
header/<header-name>- Corrisponde al valore di un'intestazione HTTP specifica nella richiesta.referer- Corrisponde al valore dell'intestazione Referer nella richiesta.user-agent- Corrisponde al valore dell'intestazione User-Agent nella richiesta.
Operators
Gli operatori disponibili sono:
StringEquals- La condizione è vera se il valore della chiave della condizione è esattamente uguale a uno dei valori specificati.StringEqualsIfExists- La condizione è vera se il valore della chiave della condizione è esattamente uguale a uno dei valori specificati o se la chiave della condizione non esiste nella richiesta.StringEqualsIgnoreCase- La condizione è vera se il valore della chiave della condizione è uguale a uno dei valori specificati, ignorando le differenze di maiuscole e minuscole.StringEqualsIgnoreCaseIfExists- La condizione è vera se il valore della chiave della condizione è uguale a uno dei valori specificati, ignorando le differenze di maiuscole/minuscole, oppure se la chiave della condizione non esiste nella richiesta.StringLike- La condizione è vera se il valore della chiave della condizione corrisponde a uno dei valori specificati, che possono includere caratteri jolly (*e?).StringLikeIfExists- La condizione è vera se il valore della chiave della condizione corrisponde a uno dei valori specificati, che possono includere caratteri jolly (*e?), oppure se la chiave della condizione non è presente nella richiesta.StringNotEquals- La condizione è vera se una qualsiasi delle chiavi specificate è presente nel contesto della richiesta e i relativi valori non corrispondono a nessuno dei valori specificati. Se la chiave non è nel contesto, restituisce false.StringNotEqualsIfExists- La condizione è vera se una qualsiasi delle chiavi specificate è presente nel contesto della richiesta e i relativi valori non corrispondono a nessuno dei valori specificati. Se la chiave non è nel contesto, restituisce true.StringNotEqualsIgnoreCase- La condizione è vera se una qualsiasi delle chiavi specificate è presente nel contesto della richiesta e i relativi valori non corrispondono a nessuno dei valori specificati, ignorando le differenze di maiuscole/minuscole. Se la chiave non è nel contesto, restituisce false.StringNotEqualsIgnoreCaseIfExists- La condizione è vera se una qualsiasi delle chiavi specificate è presente nel contesto della richiesta e i relativi valori non corrispondono a nessuno dei valori specificati, ignorando le differenze di maiuscole/minuscole. Se la chiave non è nel contesto, restituisce true.StringNotLike- La condizione è vera se una qualsiasi delle chiavi specificate è presente nel contesto della richiesta e i relativi valori non corrispondono a nessuno dei valori specificati, che possono includere caratteri jolly (*e?). Se la chiave non è nel contesto, restituisce false.StringNotLikeIfExists- La condizione è vera se una qualsiasi delle chiavi specificate è presente nel contesto della richiesta e i relativi valori non corrispondono a nessuno dei valori specificati, che possono includere caratteri jolly (*e?). Se la chiave non è nel contesto, restituisce true.Null- La condizione è vera se la chiave specificata non è presente nel contesto della richiesta.
Combining conditions
Quando un operatore contiene più chiavi, la condizione restituisce vero se tutte le chiavi corrispondono (AND logico). Lo stesso vale quando una condizione contiene più operatori (anche AND logico).
Ad esempio:
"condition": {
"StringEquals": {
"header/X-Custom-Header": [
"Custom-Value"
],
"referer": [
"https://example.com/*"
]
},
"StringLike": {
"user-agent": [
"*Mozilla*"
]
}
}
Nell'esempio sopra riportato, la condizione risulta vera solo se sia l'intestazione X-Custom-Header che corrisponde a Custom-Value, sia l'intestazione Referer che corrisponde a https://example.com/*, sia l'intestazione User-Agent che corrisponde a *Mozilla*.
Per fornire una logica OR tra più condizioni, è possibile utilizzare diverse istruzioni all'interno della stessa policy, ciascuna con la propria condizione.
ACL
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.
Gli ACL sono considerati un meccanismo di controllo degli accessi obsoleto in S3 e il loro utilizzo è generalmente sconsigliato a favore di meccanismi più moderni e flessibili come le policy dei 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
AuthenticatedUsersoAllUsers). - 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"
}
]
}
Come si combinano le policy basate su ACL e identità
Quando viene effettuata una richiesta di accesso a un bucket o a un oggetto, vengono valutate sia la policy basata sull'identità (policy IAM) che l'ACL per determinare se la richiesta debba essere autorizzata o negata.
Nella seguente tabella mostriamo come le ACL e le Policy possono essere combinate
| Root/IAM | IAM policy | ACL | Entity owner | Result | |||
|---|---|---|---|---|---|---|---|
| Allow | Deny | Missing | Allow | Missing | |||
| Root | ✅ | ❌ | ❌ | ❌ | ✅ | ❌ | ❌ |
| Root | ✅ | ❌ | ❌ | ✅ | ❌ | ❌ | ✅ |
| IAM | ❌ | ❌ | ✅ | ❌ | ✅ | ❌ | ❌ |
| IAM | ❌ | ❌ | ✅ | ✅ | ❌ | ❌ | ❌ |
| IAM | ❌ | ✅ | ❌ | ❌ | ✅ | ❌ | ❌ |
| IAM | ❌ | ✅ | ❌ | ✅ | ❌ | ❌ | ❌ |
| IAM | ✅ | ❌ | ❌ | ❌ | ✅ | ❌ | ❌ |
| IAM | ✅ | ❌ | ❌ | ✅ | ❌ | ❌ | ✅ |
| Root | ✅ | ❌ | ❌ | ❌ | ✅ | ✅ | ❌ |
| Root | ✅ | ❌ | ❌ | ✅ | ❌ | ✅ | ✅ |
| IAM | ❌ | ❌ | ✅ | ❌ | ✅ | ✅ | ❌ |
| IAM | ❌ | ❌ | ✅ | ✅ | ❌ | ✅ | ❌ |
| IAM | ❌ | ✅ | ❌ | ❌ | ✅ | ✅ | ❌ |
| IAM | ❌ | ✅ | ❌ | ✅ | ❌ | ✅ | ❌ |
| IAM | ✅ | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ |
| IAM | ✅ | ❌ | ❌ | ✅ | ❌ | ✅ | ✅ |
CRN
Il Cubbit Resource Name (CRN) è un metodo standardizzato per identificare le risorse in Cubbit. Viene utilizzato nelle policy per specificare le risorse a cui si applica la policy.
CRN v2
crn:region:service:resource-type:resource-path
-
crn: la stringa statica richiesta dal validatore
-
regione: la regione del coordinatore deploy
-
servizio: il servizio coinvolto (s3, iam, ds3)
-
resource-type: tipo di entità fornito dal servizio (utente, gruppo, policy, progetto, bucket, oggetto)
-
resource-path: identifica la risorsa specifica. Il formato di questo segmento dipende dal tipo di risorsa. Può essere un singolo ID o una struttura simile a un percorso per risorse di natura gerarchica (come gli oggetti in un bucket). es.
tenant_<tenant_id>/project_<project_id>/<user_id>
In alcuni casi si vuole specificare tutte le risorse di un certo tipo.
In tal caso, è possibile specificare il carattere jolly * come resource-path o ultimo segmento del percorso.
es.
✅ crn:region:service:resource-type:*
✅ crn:region:service:resource-type:tenant_<tenant_id>/project_<project_id>/*
❌ crn:region:service:resource-type:tenant_*/project_<project_id>/<resource_id>
❌ crn:region:service:resource-type:tenant_*/project_<project_id>/*
Un altro target speciale è self nel segmento resource-path. Questo permette di rendere generica la policy e, quando si assegna il criterio a un utente specifico, la parola chiave self verrà sostituita con l'id dell'utente. Questo caso speciale può essere usato solo in combinazione con resource-type di tipo user.
es. crn:region:iam:user:self
Migrazione da CRN v1 a CRN v2
Per convertire un CRN v1 in un CRN v2, seguire questo schema:
- crn, region, service rimangono invariati
- resource-type rimane uguale
- tenant-id, swarm-id e project-id faranno parte del percorso delle risorse come
tenant_<tenant_id>/project_<project_id>/ - resource-id verrà aggiunto alla fine di resource-path
Se non disponi dell'ID, non aggiungere quel segmento al percorso della risorsa per quella risorsa.
CRN v1 (Deprecato)
CRN v1 è deprecato e verrà rimosso nelle versioni future. Si prega di migrare le policy al formato CRN v2.
crn:region:service:tenant-id:swarm-id:project-id:resource-type:resource-id
-
crn: la stringa statica richiesta dal validatore
-
regione: la regione del coordinatore, deploy
-
servizio: il servizio coinvolto (s3, iam, ds3)
-
tenant-id: l'id di riferimento del tenant del tuo account (può essere omesso)
-
swarm-id: l'id di riferimento del cluster geo-distribuito di nodi Cubbit (deve essere omesso)
-
project-id: l'id del progetto al quale appartiene la risorsa specificata (può essere omesso) (può essere omesso)
-
resource-type: l'entità fornita dal servizio (user, group, policy, project, bucket, object)
-
resource-id: l'id specifico o il nome della risorsa di destinazione
In alcuni casi si vuole specificare tutte le risorse di un certo tipo. In questi casi, puoi specificare la wildcard * come resource-id.
crn:region:service:tenant:swarm:project-id:resource-type:*
Al momento la wildcard è possibile solamente per il campo resource-id
Un altro target speciale è self nel segmento resource_id. Questo permette di rendere generica la policy e, quando si assegna il criterio a un utente specifico, la parola chiave self verrà sostituita con l'id dell'utente. Questo caso speciale può essere usato solo in combinazione con resource-type di tipo user.