IAM Policy
Introduzione
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.
Tipi di policy
Cubbit supporta 2 diversi tipi di policy:
- Policy basate sull'identità: Collegano le policy alle identità IAM (utenti o gruppi a cui gli utenti appartengono). Le policy basate sull'identità concedono permessi a un'identità.
- ACL: Utilizzare le ACL per controllare quali utenti di altri progetti possono accedere alla risorsa a cui è collegata l'ACL (per maggiori informazioni, vedi la sezione dedicata). (consultate la sezione dedicata)
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.
Policy e utente root
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": "2022-10-07", // 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:b562b6be-cac4-4d2c-840c-fa266228a30f:35b9c04e-d787-4223-8e5a-7847cfbade66:170bcefb-68f5-479f-9d1e-e8553eaaccb9:project: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 resoure contiene un elenco di possibili CRN (Cubbit Resource Name) di risorse definiti in Cubbit. Specifica a quali risorse verrà applicato la policy.
I formati generali dei CRN sono elencati qua sotto. I formati specifici dipendono dalla risorsa.
crn:region:service:tenant-id:swarm-id:project-id:resource-type:resource-id
-
crn: la stringa statica necessaria al validatore
-
region: la regione di distribuzione del coordinatore
-
service: il servizio coinvolto (S3, IAM, hive, etc.)
-
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
.
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
Action | Target Resource | Description |
---|---|---|
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 |
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
Action | Target Resource | Description |
---|---|---|
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 |
Combinazioni con le ACL
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 | ✅ | ❌ | ❌ | ✅ | ❌ | ✅ | ✅ |
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.
Effetto1 \ Effetto 2 | 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 |
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":"2022-10-07",
"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":"2022-10-07",
"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/*"
]
}
]
}