Skip to main content

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).

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 applied

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)

  • 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:*

Attenzione

Al momento la wildcard è possibile solamente per il campo resource-id

La stessa wildcard permette anche di specificare id parziali per specificare ad esempio tutti gli oggetti di una certa cartella my-bucket/folder1/*.

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

ActionTarget ResourceDescription
iam:GetProjectprojectPermette di recuperare le informazioni del progetto
iam:ManageProjectprojectPermette di aggiornare o cancellare il progetto
iam:CreateUserprojectPermette di creare e invitare un nuovo utente IAM
iam:ListUsersprojectPermette di ottenere la lista di utenti IAM del progetto
iam:ManageUsersuserPermette di aggiornare e cancellare un utente IAM
iam:GetUseruserPermette di recuperare un utente IAM
iam:AttachUserPolicyuserPermette di attaccare una policy gestita a uno specifico utente IAM
iam:CreatePolicyVersionpolicyPermette di creare una nuova versione di una specifica policy gestita
iam:DeletePolicypolicyPermette di cancellare una specifica policy gestita e di rimuoverla da qualsiasi entità IAM (utenti o gruppi) alla quale è collegata la policy
iam:DetachUserPolicyuserPermette di separare una policy gestita da uno specifico utente IAM
iam:GetPolicypolicyPermette 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:ListAttachedUserPoliciesuserPermette di elencare tutte le policy gestite che sono collegate a uno specifico utente IAM
iam:ListEntitiesForPolicypolicyPermette di elencare tutte le identità IAM alla quale è collegata una specifica policy gestita
iam:ListPoliciespolicyPermette di elencare tutte le policy gestite
iam:CreatePolicypolicyPermette di creare una nuova policy gestita
iam:CreateKeyuserPermette di creare una nuova chiave
iam:ListKeysuserPermette di ottenere una lista di tutte le chiavi che sono controllate da un utente specifico
iam:ManageKeyuserPermette di aggiornare o cancellare il nome di una chiave di un utente IAM
Informazione

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

Cautela

Le Actions con Target Resource di tipo * possono essere utilizzate solo con *. Non sono ammessi altri valori

ActionTarget ResourceDescription
s3:ListBucketbucketPermette di elencare alcuni o tutti gli oggetti di un bucket Cubbit S3 (fino a 1000)
s3:ListBucketVersionsbucketPermette di elencare i metadati di tutte le versioni degli oggetti in un bucket Cubbit S3
s3:PutObjectobjectPermette di aggiungere un oggetto a un bucket
s3:GetObjectobjectPermette di recuperare un oggetto specifico
s3:GetObjectVersionobjectPermette di recuperare una versione specifica di un oggetto
s3:DeleteObjectobjectPermette di rimuovere la versione nulla di un oggetto e di inserire un marcatore di cancellazione, il quale diventa la versione corrente dell'oggetto
s3:DeleteObjectVersionobjectPermette di rimuovere una versione specifica di un oggetto
s3:AbortMultipartUploadobjectPermette di interrompere un multipart upload
s3:ListMultipartUploadPartsobjectPermette di elencare le parti che sono state caricate per uno specifico caricamento multipart
s3:GetObjectTaggingobjectPermette di restituire l’insieme dei tag di un oggetto
s3:GetObjectAclobjectPermette di restituire l'elenco di controllo degli accessi (ACL) di un oggetto
s3:GetObjectVersionAclobjectPermette di restituire l'elenco di controllo degli accessi (ACL) di una versione specifica di un oggetto
s3:PutObjectAclobjectPermette di impostare le autorizzazioni dell'elenco di controllo degli accessi (ACL) per gli oggetti nuovi o già esistenti in un bucket S3
s3:PutObjectVersionAclobjectPermette di impostare le autorizzazioni dell'elenco di controllo degli accessi (ACL) per gli oggetti nuovi o già esistenti in un bucket S3
s3:PutObjectRetentionobjectPermette di inserire una configurazione di object retention su un oggetto
s3:GetObjectRetentionobjectPermette di ottenere l'object retention (letteralmente: conservazione dell'oggetto)
s3:PutObjectLegalHoldobjectPermette di applicare una configurazione di legal hold (letteralmente: ritenzione legale) all'oggetto specificato
s3:GetObjectLegalHoldobjectPermette di ottenere la configurazione di legal hold (ritenzione legale) dell'oggetto
s3:BypassGovernanceRetentionobjectPermette di eliminare un oggetto protetto da retention
s3:ListAllMyBuckets*Permette di elencare tutti i bucket di proprietà del mittente autenticato della richiesta
s3:GetBucketVersioningbucketPermette di restituire lo stato di versioning di un bucket Cubbit S3
s3:GetEncryptionConfigurationbucketPermette di restituire la configurazione di crittografia predefinita di un bucket Cubbit S3
s3:CreateBucket*Permette di creare un nuovo bucket
s3:DeleteBucketbucketPermette di cancellare il bucket indicato nell'URI
s3:PutBucketVersioningbucketPermette di impostare lo stato di versioning di un bucket Cubbit S3 esistente
s3:GetBucketOwnershipControlsbucketPermette di recuperare i controlli di proprietà di un bucket
s3:GetLifecycleConfigurationbucketPermette di restituire le informazioni di configurazione del ciclo di vita impostate su un bucket Cubbit S3
s3:PutBucketOwnershipControlsbucketPermette di aggiungere, sostituire o cancellare i controlli di proprietà su un bucket
s3:PutLifecycleConfigurationbucketPermette di creare una nuova configurazione del ciclo di vita per il bucket o di sostituire una configurazione del ciclo di vita esistente.
s3:ListBucketMultipartUploadsbucketPermette di elencare i multipart upload in corso
s3:GetBucketObjectLockConfigurationbucketPermette di ottenere la configurazione object lock di un bucket Cubbit S3
s3:PutBucketObjectLockConfigurationbucketPermette di impostare la configurazione object lock su un bucket Cubbit S3
s3:GetBucketAclbucketPermette di usare la sottorisorsa acl per restituire l'elenco di controllo degli accessi (ACL) di un bucket Cubbit S3
s3:PutBucketAclbucketPermette di impostare i permessi su un bucket esistente utilizzando gli elenchi di controllo degli accessi (ACL)
s3:GetBucketLocationbucketPermette di ottenere la posizione del bucket
Endpoints e Permessi
Un elenco dei nostri endpoint API e della relativa azione di policy necessaria per eseguire l'operazione.
RoutePolicies
GET /v1/projects/{{project_id}}iam:GetProject
PUT /v1/projects/{{project_id}}iam:ManageProject
DELETE /v1/projects/{{project_id}}iam:ManageProject (l'utente deve essere root)
POST /v1/usersiam:CreateUser
POST /v1/users/inviteiam:CreateUser
GET /v1/user/{{user_id}}iam:GetUser
PATCH /v1/users/{{user_id}}iam:ManageUser
DELETE /v1/users/{{user_id}}iam:ManageUser
GET /v1/usersiam:ListUsers
GET /v1/policiesiam:ListPolicies
POST /v1/policiesiam:CreatePolicy
DELETE /v1/policies/{{policy_id}}iam:DeletePolicy
GET /v1/policies/{{policy_id}}iam:GetPolicy
PUT /v1/policies/{{policy_id}}iam:CreatePolicyVersion
GET /v1/policies/{{policy_id}}/usersiam:ListEntitiesForPolicy
POST /v1/policies/{{policy_id}}/usersiam:AttachUserPolicy, iam:DetachUserPolicy, iam:GetPolicy
GET /v1/users/{{user_id}}/policiesiam:ListAttachedUserPolicies
POST /v1/users/{{user_id}}/policiesiam:AttachUserPolicy, iam:DetachUserPolicy, iam:GetPolicy

Alcuni endpoint non richiedono alcuna policy

RoutePolicies
POST /v1/projectschiunque può creare un progetto
GET /v1/projectschiunque può elencare i progetti ai quali è stato invitato
POST /v1/projects/{{id}}/joinchiunque può unirsi a un progetto al quale è stato invitato

Queste route sono disponibili su microservizio KeyVault

RoutePolicies
POST /api/v2/keys/{{name}} [post]iam:CreateKey
GET /api/v2/keys [get]iam:ListKeys
DELETE /api/v2/keys/{{key_id}} [delete]iam:ManageKey
PATCH /api/v2/keys/{{key_id}} [patch]iam:ManageKey
POST /api/v3/keys/{{name}}?user_id={{user_id}}iam:CreateKey
GET /api/v3/keys?user_id={{user_id}}iam:ListKeys
DELETE /api/v3/keys/{{key_id}}?user_id={{user_id}}iam:ManageKey
PATCH /api/v3/keys/{{key_id}}?user_id={{user_id}}iam:ManageKey

user_id è opzionale e se omesso il comportamento è lo stesso dell'endpoint v2.

Di seguito sono elencate le API S3 e le relative policy necessarie.

APIsPolicyResource Type
HeadBucket, ListObjects, ListObjectsV2s3:ListBucketbucket
ListObjectVersionss3:ListBucketVersionsbucket
HeadObject, GetObjects3:GetObject or s3:GetObjectVersionobject
PutObject, UploadPart, CreateMultipartUpload, CompleteMultipartUploads3:PutObjectbucket
DeleteObject, DeleteObjectss3:DeleteObject or s3:DeleteObjectVersionobject
CopyObjects3GetObject/s3GetObjectVersion sulla sorgente and s3:PutObject sulla destinazioneobject sulla sorgente e bucket sulla destinazione
ListPartss3:ListMultipartUploadPartsobject
AbortMultipartUploads3:AbortMultipartUploadbucket
GetObjectTaggings3:GetObjectTaggingobject
GetObjectAcls3:GetObjectAcl or s3:GetObjectVersionAclobject
PutObjectAcls3:PutObjectAcl or s3:PutObjectVersionAclobject
GetObjectRetentions3:GetObjectRetentionobject
PutObjectRetentions3:PutObjectRetentionobject
GetObjectLegalHolds3:GetObjectLegalHoldobject
PutObjectLegalHolds3:PutObjectLegalHoldobject
ListBucketss3:ListAllMyBucketsbucket
CreateBuckets3:CreateBucketbucket
DeleteBuckets3:DeleteBucketbucket
GetBucketVersionings3:GetBucketVersioningbucket
PutBucketVersionings3:PutBucketVersioningbucket
GetBucketOwnershipControlss3:GetBucketOwnershipControlsbucket
PutBucketOwnershipControls, DeleteBucketOwnershipControlss3:PutBucketOwnershipControlsbucket
GetBucketLifecycleConfigurations3:GetLifecycleConfigurationbucket
PutBucketLifecycleConfiguration, DeleteBucketLifecycles3:PutLifecycleConfigurationbucket
ListMultipartUploadss3:ListBucketMultipartUploadsbucket
GetObjectLockConfigurations3:GetBucketObjectLockConfigurationbucket
PutObjectLockConfigurations3:PutBucketObjectLockConfigurationbucket
GetBucketAcls3:GetBucketAclbucket
PutBucketAcls3:PutBucketAclbucket
GetBucketLocations3:GetBucketLocationbucket

Combinazioni con le ACL

Nella seguente tabella mostriamo come le ACL e le Policy possono essere combinate

Root/IAMIAM policyACLEntity owner Result
AllowDenyMissingAllowMissing
Root ✅  ❌  ❌  ❌  ✅  ❌  ❌
Root ✅  ❌  ❌  ✅  ❌  ❌  ✅
IAM ❌  ❌  ✅  ❌  ✅  ❌  ❌
IAM ❌  ❌  ✅  ✅  ❌  ❌  ❌
IAM ❌  ✅  ❌  ❌  ✅  ❌  ❌
IAM ❌  ✅  ❌  ✅  ❌  ❌  ❌
IAM ✅  ❌  ❌  ❌  ✅  ❌  ❌
IAM ✅  ❌  ❌  ✅  ❌  ❌  ✅
Root ✅  ❌  ❌  ❌  ✅  ✅  ❌
Root ✅  ❌  ❌  ✅  ❌  ✅  ✅
IAM ❌  ❌  ✅  ❌  ✅  ✅  ❌
IAM ❌  ❌  ✅  ✅  ❌  ✅  ❌
IAM ❌  ✅  ❌  ❌  ✅  ✅  ❌
IAM ❌  ✅  ❌  ✅  ❌  ✅  ❌
IAM ✅  ❌  ❌  ❌  ✅  ✅  ✅
IAM ✅  ❌  ❌  ✅  ❌  ✅  ✅

Esempi

In questa sezione vedremo alcuni esempi di policy per eseguire casi d'uso comuni.

Informazione

È 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/*"
]
}
]
}