Assegnazione dell'accesso agli oggetti all'interno di un bucket utilizzando le condizioni di accesso IAM
Le politiche di accesso IAM consentono di concedere autorizzazioni in un bucket di Cloud Object Storage a gruppi specifici di oggetti. Questo approccio consente un controllo dell'accesso dettagliato sull'accesso ai dati, rendendolo utile in scenari in cui le diverse parti di un bucket devono essere accessibili da utenti o applicazioni differenti.
Se è richiesto l'accesso all'intero bucket (ovvero, quando non è richiesto il controllo dell'accesso dettagliato), segui le informazioni su Assegnazione dell'accesso a un singolo bucket.
Ogni oggetto archiviato in un bucket Cloud Object Storage ha una chiave univoca e queste chiavi spesso seguono una struttura gerarchica simile a un file system.
Link correlati ai criteri di accesso IAM
- Condizioni basate sugli attributi delle risorse
- Confronti tra stringhe
- Controllo della versione di un criterio nella console
Esempio
- Un singolo oggetto con la chiave "folder1/subfolder1/file.txt" può simulare una gerarchia di cartelle o directory, dove la directory “folder1” contiene una directory secondaria denominata “sub-folder1” che contiene un file "file.txt". L'accesso può essere assegnato a qualsiasi livello di cartella.
- È possibile creare una politica di accesso per tutti gli oggetti e - nella cartella denominata *“folder1”*oppure è possibile assegnare l'accesso solo per gli oggetti nella sottodirectory denominata “subfolder1”.
Un amministratore della politica può assegnare l'accesso a singoli oggetti e cartelle configurando condizioni durante la creazione di politiche di accesso IAM. La sezione successiva descrive come costruire questi tipi di politiche.
Creazione di un criterio di controllo accessi dettagliato
Il primo passo per concedere l'accesso a singoli oggetti all'interno di un bucket è costruire una politica IAM. Puoi trovare ulteriori informazioni sulla creazione di una politica di accesso IAM per Object Storage nell'esercitazione Cloud Object Storage Limitazione dell'accesso a un singolo bucket Object Storage. Per ulteriori informazioni generali sulla creazione delle politiche IAM, vai a Come funziona IBM Cloud IAM. I seguenti elementi sono componenti fondamentali per la creazione di una politica di accesso IAM per le risorse dell' Object Storage.
Oggetto
L'oggetto di una politica di accesso può essere un singolo utente, un gruppo di accesso, un ID servizio o un profilo attendibile. Vedi Cosa sono le politiche IAM e chi può assegnarle? per ulteriori informazioni sui tipi di argomenti che puoi applicare a una politica.
service
Il servizio è il servizio IBM Cloud che contiene la risorsa a cui stai tentando di assegnare l'accesso. Per assegnare l'accesso ai singoli oggetti, utilizza il servizio Cloud Object Storage.
Risorsa
IBM Cloud® Object Storage supporta le seguenti destinazioni di risorse:
- ID gruppo di risorse
- Istanza del servizio
- Tipo di risorsa con valore "bucket"
- ID risorsa (nome bucket)
Ruolo
I ruoli di accesso IBM Cloud sono gruppi di azioni. I ruoli di accesso consentono all'oggetto di completare attività specifiche nel contesto delle risorse di destinazione definite nella politica. Cloud Object Storage supporta diversi ruoli del servizio predefiniti che semplificano l'assegnazione delle autorizzazioni. Cloud Object Storage consente anche la creazione di ruoli personalizzati. Per ulteriori informazioni sui ruoli supportati per Cloud Object Storage, vedi Ruoli diIdentity and Access Management.
Per l'elenco dei ruoli di Cloud Object Storage e la loro interazione con le condizioni, vai a questa tabella.
Condizione
Quando viene identificata una risorsa, è possibile utilizzare una condizione per un ulteriore ambito di accesso per un soggetto a singoli oggetti in un bucket, a cui si fa riferimento come controllo dell'accesso dettagliato.
Una singola politica IAM può avere più di una condizione utilizzando un'istruzione OR o AND per combinare le condizioni. L'istruzione di condizione (contenente una o più condizioni) deve essere valutata come TRUE per consentire alla richiesta utente di eseguire l'azione. La politica IAM negherà qualsiasi azione che non può essere valutata TRUE. L'istruzione della politica deve contenere tutti gli attributi di condizione richiesti dal
ruolo. Se l'istruzione della politica non contiene tutti gli attributi di condizione richiesti dal ruolo, le azioni soggette agli attributi di condizione omessi verranno negati.
Utilizzare una politica senza attributi di condizione per fornire l'accesso completo, come definito dal ruolo, alla risorsa di destinazione.
Utilizza la policy IAM " v2 " per creare una policy IAM con condizioni basate sugli attributi.
Utilizzo delle condizioni in una politica IAM
Cloud Object Storage supporta i seguenti attributi per specificare condizioni per l'assegnazione di accesso dettagliato sulle risorse Cloud Object Storage:
Prefisso e delimitatore
Il prefisso e il delimitatore vengono utilizzati insieme per limitare tutte le autorizzazioni di elenco a oggetti specifici in un bucket.
-
L'attributo di condizione Prefisso definisce il prefisso per la serie di chiavi oggetto che questa condizione deve consentire per l'elenco di oggetti o cartelle. Ad esempio, nell'oggetto denominato "folder1/subfolder1/file.txt", sia "folder1/" che “folder1/subfolder1/” sono possibili prefissi.
-
Un Delimitatore aiuta l'utente a navigare nel bucket come se fosse una gerarchia di file. L'assegnazione di un'istruzione di condizione delimitatore limita il tipo di struttura di cartelle che l'utente può creare nell'elenco. In un oggetto denominato "folder1/subfolder1/file.txt", il delimitatore "/" può essere utilizzato per simulare una gerarchia di cartelle in cui ogni cartella è separata da una "/". Se un'istruzione di condizione consente solo un delimitatore di "/", non è consentita una richiesta di elenco con qualsiasi altro valore delimitatore.
In genere il prefisso e il delimitatore vengono utilizzati insieme in un'istruzione condizionale con un AND operatore. È possibile utilizzare un prefisso senza un delimitatore in un'istruzione di condizione. Se la politica è configurata
con un'istruzione di condizione solo con un prefisso e senza delimitatore, l'utente può utilizzare uno o nessun delimitatore per elencare gli oggetti.
Esempi di utilizzo delle istruzioni di condizione Prefisso e Delimitatore
Considerare l'oggetto denominato "folder1/subfolder1/file.txt":
Prefisso "folder1/" AND senza delimitatore
- È possibile restituire un elenco di tutti gli oggetti che iniziano con folder1/ eseguendo una richiesta di elenco su folder1/ e non fornendo un delimitatore.
- Se si utilizza un delimitatore "/" nella richiesta di elenco, sarà limitato alla visualizzazione solo del primo livello di oggetti e sottocartelle in folder1/.
- Se l'utente tenta di elencare la sottocartella (richieste di elencare il prefisso = “folder1/subfolder1/”), l'accesso viene negato.
Prefisso di "folder1/" AND Delimitatore di "/"
- È possibile elencare solo gli oggetti e le sottocartelle nel primo livello di folder1.
- È possibile solo eseguire richieste di elenco che specifichino un delimitatore "/".
- Se si tenta di elencare il contenuto di subfolder1, l'accesso viene negato (l'utente deve avere una condizione di consentire il prefisso = “folder1/subfolder1/" per consentire l'elenco del contenuto di subfolder1).
Le seguenti API sono soggette a condizioni Prefisso / Delimitatore:
- GET Bucket(Elenca oggetti)
- GET Versioni oggetto bucket (Elenchi versioni oggetto)
- Elenca caricamenti in più parti
Per visualizzare l'elenco completo delle azioni e degli attributi di condizione supportati, vedere Azioni di Identity and Access Management.
Per fornire a un utente dettagliato l'accesso per passare alla sua cartella nell'interfaccia utente, l'utente deve accedere per elencare la cartella root del bucket. Consultare lo Scenario 4 per informazioni su come creare la politica per abilitarla.
Percorso
Il percorso viene utilizzato per definire l'ambito di tutti gli accessi di lettura, scrittura o gestione su oggetti specifici.
Per un oggetto denominato "folder1/subfolder1/file.txt", la chiave oggetto completa è il percorso. Per limitare le azioni di lettura, scrittura o gestione a questo oggetto, definire una condizione con Percorso di "folder1/subfolder1/file.txt".
Tutte le API di Cloud Object Storage che agiscono direttamente su un oggetto sono soggette a condizioni Path. Vedi Azioni diIdentity and Access Management per l'elenco di azioni API di Cloud Object Storage che supportano Path.
Si consiglia di definire sia una condizione Prefisso / Delimitatore che una condizione Percorso quando si concedono azioni di lettura, scrittura o elenco a un utente nella stessa politica. Manager, Writer, Reader e Content Reader sono esempi di ruoli in cui si consiglia di definire una condizione Prefisso / Delimitatore e Percorso. Consultare lo Scenario 4 per informazioni su come creare la politica per abilitarla. Una condizione che specifica Prefisso / Delimitatore e una condizione che specifica Percorso devono essere logicamente ORed nell'istruzione della politica IAM per consentire
entrambi i tipi di operazioni (lettura, scrittura o gestione di oggetti o oggetti elenco).
Operatori utilizzati con attributi di condizione
Ci sono diversi operatori che possono essere utilizzati quando si definiscono gli attributi della condizione. L'elenco completo degli operatori che possono essere utilizzati per gli attributi di condizione di prefisso, delimitatore e percorso può essere trovato in Condizioni basate sull'attributo della risorsa.
Utilizzo dei caratteri jolly
I valori di un attributo di condizione possono includere un carattere jolly quando l'operatore è stringMatch o stringMatchAnyOf.
Esempi di utilizzo di caratteri jolly nelle istruzioni di condizione:
Considerare l'oggetto denominato "folder1/subfolder1/file.txt":
Percorso di “folder1/*”
- Si otterrà l'accesso in lettura, scrittura o gestione, come definito dal ruolo, a tutti gli oggetti che iniziano con “folder1/”.
Prefisso "folder1/*" AND nessun delimitatore
- Per una richiesta di elenco oggetti con prefisso impostato su “folder1/” e nessun delimitatore, la richiesta utente restituisce tutti gli oggetti che iniziano con “folder1/”.
- Per una richiesta di elenco di oggetti con prefisso impostato su “folder1/” e delimitatore di "/", la richiesta restituisce una vista di oggetti e cartelle solo nel primo livello di folder1.
- Per una richiesta di elenco oggetti con prefisso impostato su “folder1/subfolder1/” e delimitatore di " / ", la richiesta restituisce una vista degli oggetti e delle cartelle solo nel primo livello di folder1/subfolder1.
Prefisso di "folder1/*" AND Delimitatore di "/"
- Per una richiesta di elenco di oggetti con prefisso impostato su “folder1/” e delimitatore di "/", la richiesta restituisce una vista di oggetti e cartelle solo nel primo livello di folder1.
- Per una richiesta di elenco di oggetti con prefisso impostato su “folder1/subfolder1/” e delimitatore di "/", la richiesta restituisce gli oggetti (e le eventuali sottocartelle) in folder1/subfolder1.
- Per una richiesta dell'elenco di oggetti con prefisso impostato su “folder1/” e nessun delimitatore, la richiesta non sarà consentita poiché è necessario utilizzare un delimitatore di "/" nella richiesta dell'elenco affinché questa politica venga valutata true.
Azioni che non utilizzano un prefisso / delimitatore o un percorso
Esistono alcune API Cloud Object Storage che non specificano un percorso o un prefisso e un delimitatore. I ruoli del servizio Cloud Object Storage: Manager, Writer, Reader e Content Reader sono esempi di ruoli che contengono queste azioni. Ciò si applica anche ai ruoli personalizzati. Per consentire queste azioni quando utilizzi una condizione Prefisso / Delimitatore o Percorso, è necessaria
la seguente istruzione di condizione nella politica IAM:
((path stringExists = false) AND (prefix stringExists = false) AND (delimiter stringExists= false))
Vedi la tabella Azioni diIdentity and Access Management per l'elenco completo di azioni API che non supportano le condizioni Prefisso / Delimitatore o Percorso e richiedono l'istruzione precedente quando si utilizza l'accesso dettagliato.
Fare riferimento alla sezione su come Creare una nuova politica per un utente con condizioni per utilizzare questa clausola in una politica IAM.
Utilizzo delle condizioni con i ruoli del servizio Cloud Object Storage
| Ruolo di accesso | Descrizione delle azioni | Attributi condizione supportati |
|---|---|---|
| Gestore | Rendere pubblici gli oggetti, creare e distruggere bucket e oggetti. | Vedi nota |
| Scrittore | Creare e distruggere bucket e oggetti. | Vedi nota |
| Lettore | Elencare i bucket, elencare gli oggetti e scaricare gli oggetti. | Vedi nota |
| Content Reader (Lettore di contenuto) | Elencare e scaricare oggetti. | Vedi nota |
| Lettore oggetti | Scaricare gli oggetti. | Percorso |
| Scrittore oggetti | Carica oggetti. | Percorso |
Nota: questi ruoli supportano gli attributi Prefisso / Delimitatore e Condizione percorso. I ruoli includono anche azioni che non specificano un percorso o un prefisso e un delimitatore. Utilizzare la clausola stringExists nell'istruzione di condizione per consentire queste azioni.
Vedi il link per l'elenco completo delle azioni per ogni ruolo del servizio Cloud Object Storage e l'elenco degli attributi di condizione supportati da ogni azione.
Creare una nuova normativa per un utente con condizioni
Il seguente esempio fornisce a un utente il ruolo del servizio “Writer” Cloud Object Storage con la possibilità di:
- Elencare l'accesso alla gerarchia di oggetti completa all'interno di una cartella denominata "folder1/subfolder1".
- Accesso in lettura, scrittura o eliminazione a tutti gli oggetti in una cartella denominata "subfolder1".
- Eseguire una gestione della configurazione del bucket come
HEAD BucketeGET/PUT Bucket Versioning.
CLI di una politica IAM con una condizione
Per informazioni generali sull'utilizzo della CLI, consultare la sezione relativa all'utilizzo dell'interfaccia della riga di comando di IBM Cloud®.
Esempio
policy.json:
{
"type": "access",
"subject": {
"attributes": [
{
"value": "IBMid-664001QJNU",
"operator": "stringEquals",
"key": "iam_id"
}
]
},
"resource": {
"attributes": [
{
"value": "cloud-object-storage",
"operator": "stringEquals",
"key": "serviceName"
},
{
"value": "e6156134-5ed7-4f73-80d3-d6d1ef56f1f9",
"operator": "stringEquals",
"key": "serviceInstance"
},
{
"value": "bucket",
"operator": "stringEquals",
"key": "resourceType"
},
{
"value": "fgac-tf-test",
"operator": "stringEquals",
"key": "resource"
}
]
},
"control": {
"grant": {
"roles": [
{
"role_id": "crn:v1:bluemix:public:iam::::serviceRole:Writer"
} ]
}
},
"rule": {
"operator": "or",
"conditions": [
{
"operator": "and",
"conditions": [
{
"key": "{{resource.attributes.prefix}}",
"operator": "stringMatch",
"value": "folder1/subfolder1/*"
},
{
"key": "{{resource.attributes.delimiter}}",
"operator": "stringEqualsAnyOf",
"value": [
"/",
""
]
}
]
},
{
"key": "{{resource.attributes.path}}",
"operator": "stringMatch",
"value": "folder1/subfolder1/*"
},
{
"operator": "and",
"conditions": [
{
"key": "{{resource.attributes.delimiter}}",
"operator": "stringExists",
"value": false
},
{
"key": "{{resource.attributes.prefix}}",
"operator": "stringExists",
"value": false
},
{
"key": "{{resource.attributes.path}}",
"operator": "stringExists",
"value": false
}
]
}
]
},
"pattern": "attribute-based-condition:resource:literal-and-wildcard"
}
ibmcloud iam user-policy-create hello@ibm.com --file policy.json --api-version v2
Utilizza --api-version v2 con condizioni di attributi basate sulle risorse.
API di una politica IAM con una condizione
Esempio
Richiesta
curl -X POST 'https://iam.cloud.ibm.com/v2/policies' \
-H 'Authorization: Bearer $TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"type": "access",
"description": "access control for RESOURCE_NAME",
"resource": {
"attributes": [
{
"key": "serviceName",
"operator": "stringEquals",
"value": "cloud-object-storage"
},
{
"key": "serviceInstance",
"operator": "stringEquals",
"value": "$SERVICE_INSTANCE"
},
{
"key": "accountId",
"operator": "stringEquals",
"value": "$ACCOUNT_ID"
},
{
"key": "resourceType",
"operator": "stringEquals",
"value": "bucket"
},
{
"key": "resource",
"operator": "stringEquals",
"value": "$RESOURCE_NAME"
}
]
},
"subject": {
"attributes": [
{
"key": "iam_id",
"operator": "stringEquals",
"value": "IBMid-123453user"
}
]
},
"control": {
"grant": {
"roles": [
{
"role_id": "crn:v1:bluemix:public:iam::::serviceRole:Writer"
}
]
}
},
"rule": {
"operator": "or",
"conditions": [
{
"operator": "and",
"conditions": [
{
"key": "{{resource.attributes.prefix}}",
"operator": "stringMatch",
"value": "folder1/subfolder1/*"
},
{
"key": "{{resource.attributes.delimiter}}",
"operator": "stringEqualsAnyOf",
"value": [
"/",
""
]
}
]
},
{
"key": "{{resource.attributes.path}}",
"operator": "stringMatch",
"value": "folder1/subfolder1/*"
},
{
"operator": "and",
"conditions": [
{
"key": "{{resource.attributes.delimiter}}",
"operator": "stringExists",
"value": false
},
{
"key": "{{resource.attributes.prefix}}",
"operator": "stringExists",
"value": false
},
{
"key": "{{resource.attributes.path}}",
"operator": "stringExists",
"value": false
}
]
}
]
},
"pattern": "attribute-based-condition:resource:literal-and-wildcard"
}'
Risposta
{
"id": "d4078e99-d78a-4a50-95d6-b528e3c87dff",
"description": "access control for RESOURCE_NAME",
"type": "access",
"subject": {
"attributes": [
{
"key": "iam_id",
"operator": "stringEquals",
"value": "IBMid-123453user"
}
]
},
"resource": {
"attributes": [
{
"key": "serviceName",
"operator": "stringEquals",
"value": "cloud-object-storage"
},
{
"key": "serviceInstance",
"operator": "stringEquals",
"value": "$SERVICE_INSTANCE"
},
{
"key": "accountId",
"operator": "stringEquals",
"value": "$ACCOUNT_ID"
},
{
"key": "resourceType",
"operator": "stringEquals",
"value": "bucket"
},
{
"key": "resource",
"operator": "stringEquals",
"value": "$RESOURCE_NAME"
}
]
},
"pattern": "attribute-based-condition:resource:literal-and-wildcard",
"rule": {
"operator": "or",
"conditions": [
{
"operator": "and",
"conditions": [
{
"key": "{{resource.attributes.prefix}}",
"operator": "stringMatch",
"value": "folder1/subfolder1/*"
},
{
"key": "{{resource.attributes.delimiter}}",
"operator": "stringEqualsAnyOf",
"value": [
"/",
""
]
}
]
},
{
"key": "{{resource.attributes.path}}",
"operator": "stringMatch",
"value": "folder1/subfolder1/*"
},
{
"operator": "and",
"conditions": [
{
"key": "{{resource.attributes.delimiter}}",
"operator": "stringExists",
"value": false
},
{
"key": "{{resource.attributes.prefix}}",
"operator": "stringExists",
"value": false
},
{
"key": "{{resource.attributes.path}}",
"operator": "stringExists",
"value": false
}
]
}
]
},
"control": {
"grant": {
"roles": [
{
"role_id": "crn:v1:bluemix:public:iam::::serviceRole:Writer"
}
]
}
},
"href": "https://iam.cloud.ibm.com/v2/policies/d4078e99-d78a-4a50-95d6-b528e3c87dff",
"created_at": "2023-10-09T16:24:52.391Z",
"created_by_id": " IBMid-12345user",
"last_modified_at": "2023-10-09T16:24:52.391Z",
"last_modified_by_id": " IBMid-12345user",
"counts": {
"account": {
"current": 785,
"limit": 4020
},
"subject": {
"current": 1,
"limit": 1000
}
},
"state": "active",
"version": "v1.0"
}
Terraform di una politica IAM con una condizione
Esempio
data "ibm_resource_group" "cos_group" {
name = "Default"
}
resource "ibm_iam_user_policy" "example" {
ibm_id = “user_email_id”
roles = ["Writer"]
resources {
service = "cloud-object-storage"
resource_type = "bucket"
resource_instance_id = "cos instance guid"
resource = "bucket-name"
}
rule_conditions {
operator = "and"
conditions {
key = "{{resource.attributes.prefix}}"
operator = "stringMatch"
value = ["folder1/subfolder1/*"]
}
conditions {
key = "{{resource.attributes.delimiter}}"
operator = "stringEqualsAnyOf"
value = ["/",""]
}
}
rule_conditions {
key = "{{resource.attributes.path}}"
operator = "stringMatch"
value = ["folder1/subfolder1/*"]
}
rule_conditions {
operator = "and"
conditions {
key = "{{resource.attributes.delimiter}}"
operator = "stringExists"
value = ["false"]
}
conditions {
key = "{{resource.attributes.prefix}}"
operator = "stringExists"
value = ["false"]
}
conditions {
key = "{{resource.attributes.path}}"
operator = "stringExists"
value = ["false"]
}
}
rule_operator = "or"
pattern = "attribute-based-condition:resource:literal-and-wildcard"
}
Ulteriori informazioni
Per esempi su come utilizzare gli attributi della condizione Prefisso / Delimitatore o Percorso, consulta l'esercitazione sul controllo dell'accesso ai singoli oggetti in un bucket.