Questo argomento descrive come gestire l'accesso a risorse specifiche utilizzando le associazioni di ruoli condizionali nei criteri di autorizzazione. Utilizzando gli attributi delle risorse in un'espressione di condizione, puoi concedere un sottoambito dell'associazione dei ruoli in base al nome della risorsa, al tipo di risorsa e/o al servizio Google Cloud.
Prima di iniziare
- Leggi la panoramica delle condizioni di Identity and Access Management (IAM) per comprendere le nozioni di base delle associazioni di ruoli condizionali IAM.
- Esamina gli attributi delle risorse che possono essere utilizzati in un'espressione della condizione.
- L'attributo del nome risorsa può controllare l'accesso ai seguenti servizi Google Cloud:
- Apigee
- Application Integration
- BigQuery
- Autorizzazione binaria
- Bigtable
- Cloud Key Management Service
- Cloud Logging
- Spanner
- Cloud SQL
- Cloud Storage
- Compute Engine
- Dataform
- Google Kubernetes Engine
- Connettori di integrazione
- Pub/Sub Lite
- Secret Manager
Ruoli obbligatori
Per ottenere le autorizzazioni necessarie per gestire le associazioni di ruoli condizionali, chiedi all'amministratore di concederti i seguenti ruoli IAM:
-
Per gestire l'accesso ai progetti:
Amministratore IAM progetto (
roles/resourcemanager.projectIamAdmin
) sul progetto -
Per gestire l'accesso alle cartelle:
Amministratore cartelle (
roles/resourcemanager.folderAdmin
) sulla cartella -
Per gestire l'accesso a progetti, cartelle e organizzazioni:
Amministratore organizzazione (
roles/resourcemanager.organizationAdmin
) nell'organizzazione -
Per gestire l'accesso a quasi tutte le risorse Google Cloud:
Amministratore sicurezza (
roles/iam.securityAdmin
) sul progetto, sulla cartella o sull'organizzazione di cui vuoi gestire l'accesso alle risorse
Per saperne di più sulla concessione dei ruoli, consulta Gestire l'accesso.
Questi ruoli predefiniti contengono le autorizzazioni necessarie per gestire le associazioni di ruoli condizionali. Per visualizzare le autorizzazioni esatte necessarie, espandi la sezione Autorizzazioni richieste:
Autorizzazioni obbligatorie
Per gestire le associazioni di ruoli condizionali sono necessarie le autorizzazioni seguenti:
-
Per gestire l'accesso ai progetti:
-
resourcemanager.projects.getIamPolicy
sul progetto -
resourcemanager.projects.setIamPolicy
sul progetto
-
-
Per gestire l'accesso alle cartelle:
-
resourcemanager.folders.getIamPolicy
nella cartella -
resourcemanager.folders.setIamPolicy
nella cartella
-
-
Per gestire l'accesso alle organizzazioni:
-
resourcemanager.organizations.getIamPolicy
sull'organizzazione -
resourcemanager.organizations.setIamPolicy
sull'organizzazione
-
Potresti anche essere in grado di ottenere queste autorizzazioni con i ruoli personalizzati o altri ruoli predefiniti.
Concedi l'accesso a un gruppo di risorse in base ai prefissi dei nomi delle risorse
È possibile utilizzare un'associazione di ruoli condizionale per concedere l'accesso alle entità per le risorse i cui nomi delle risorse corrispondono a un prefisso, ad esempio istanze di macchine virtuali (VM) Compute Engine i cui nomi iniziano con una determinata stringa. Il prefisso del nome della risorsa viene in genere utilizzato per raggruppare le risorse destinate a determinate funzionalità o che hanno determinate proprietà.
Considera il seguente esempio: la società di software ExampleCo esegue carichi di lavoro su determinate istanze VM che potrebbero operare su dati sanitari sensibili. Altri carichi di lavoro non sensibili devono essere eseguiti nello stesso progetto e ExampleCo vuole garantire che i suoi sviluppatori abbiano un accesso limitato alle istanze VM che operano su dati sensibili. Per raggiungere questo obiettivo, le istanze VM sensibili ai dati vengono denominate con un prefisso sensitiveAccess
, mentre le altre istanze VM vengono denominate con un prefisso devAccess
. Quindi, vengono utilizzate le associazioni di ruoli condizionali per garantire che gli sviluppatori possano rimanere produttivi con le normali istanze VM devAccess
, ma senza concedere loro l'accesso a sensitiveAccess
istanze VM.
Puoi utilizzare solo l'attributo della condizione resource.name
per gestire l'accesso, ma è pratica comune utilizzare anche gli attributi resource.type
e resource.service
. Quando utilizzi questi attributi aggiuntivi, riduci le probabilità che una condizione influisca sull'accesso a diversi tipi di risorse con nomi simili.
L'esempio in questa sezione controlla l'accesso utilizzando entrambi gli attributi resource.name
e resource.type
.
Per concedere l'accesso in base a un prefisso nome ai dischi e alle istanze di Compute Engine in un progetto:
Console
Nella console Google Cloud, vai alla pagina IAM.
Nell'elenco delle entità, individua quella che ti interessa e fai clic sul pulsante
.Nel riquadro Modifica autorizzazioni, individua il ruolo desiderato per cui configurare una condizione. In Condizione IAM (facoltativa), fai clic su Aggiungi condizione IAM.
Nel riquadro Modifica condizione, inserisci un titolo e una descrizione facoltativa per la condizione.
Puoi aggiungere un'espressione di condizione utilizzando lo Strumento per la creazione di condizioni o l'Editor condizioni. Il generatore di condizioni fornisce un'interfaccia interattiva per selezionare il tipo di condizione, l'operatore e altri dettagli applicabili all'espressione. L'editor di condizioni fornisce un'interfaccia basata su testo per inserire manualmente un'espressione utilizzando la sintassi CEL.
Strumento per la creazione delle condizioni:
- Fai clic sul menu a discesa Aggiungi e poi su Condizioni raggruppate.
- Nel menu a discesa Tipo di condizione, seleziona Risorsa > Tipo.
- Dal menu a discesa Operatore, seleziona è.
- Dall'elenco a discesa Tipo di risorsa, seleziona compute.googleapis.com/Disk.
- Fai clic sul primo pulsante Aggiungi immediatamente sotto la condizione appena inserita per aggiungere un'altra clausola all'espressione.
- Nell'elenco a discesa Tipo di condizione, seleziona Risorsa > Nome.
- Dal menu a discesa Operatore, seleziona Inizia con.
- Nel campo Valore, inserisci il nome della risorsa nel formato appropriato, ad esempio
projects/project-123/zones/us-central1-a/disks/devAccess
per un disco il cui nome inizia condevAccess
. - A sinistra di ogni tipo di condizione, fai clic su E per assicurarti che entrambe le clausole siano vere.
- Fai clic sul pulsante Aggiungi direttamente sopra il pulsante Salva per aggiungere un altro insieme di condizioni raggruppate.
- Nel menu a discesa Tipo di condizione, seleziona Risorsa > Tipo.
- Dal menu a discesa Operatore, seleziona è.
- Dall'elenco a discesa Tipo di risorsa, seleziona compute.googleapis.com/Instance.
- Fai clic sul primo pulsante Add immediatamente sotto la condizione appena inserita e aggiungi un'altra clausola all'espressione.
- Nell'elenco a discesa Tipo di condizione, seleziona Risorsa > Nome.
- Dal menu a discesa Operatore, seleziona Inizia con.
- Nel campo Valore, inserisci il nome della risorsa nel formato appropriato, ad esempio
projects/project-123/zones/us-central1-a/instances/devAccess
per un'istanza il cui nome inizia condevAccess
. - A sinistra di ogni tipo di condizione, fai clic su E per assicurarti che entrambe le clausole siano vere.
- Fai clic sul pulsante Aggiungi direttamente sopra il pulsante Salva per aggiungere il terzo insieme di condizioni raggruppate.
- Per assicurarti che questa condizione non influisca su altre risorse, aggiungi anche le clausole seguenti: Dal menu a discesa Tipo di condizione, seleziona Risorsa > Tipo.
- Dal menu a discesa Operatore, seleziona non è.
- Dall'elenco a discesa Tipo di risorsa, seleziona compute.googleapis.com/Disk.
- Fai clic sul primo pulsante Add immediatamente sotto la condizione appena inserita e aggiungi un'altra clausola all'espressione.
- Nel menu a discesa Tipo di condizione, seleziona Risorsa > Tipo.
- Dal menu a discesa Operatore, seleziona non è.
- Dall'elenco a discesa Tipo di risorsa, seleziona compute.googleapis.com/Instance.
- A sinistra di ogni tipo di condizione, fai clic su E per assicurarti che entrambe le clausole siano vere.
Al termine, il generatore di condizioni dovrebbe essere simile al seguente:
Fai clic su Salva per applicare la condizione.
Dopo aver chiuso il riquadro Modifica condizione, fai di nuovo clic su Salva nel riquadro Modifica autorizzazioni per aggiornare il criterio di autorizzazione.
Editor condizioni:
Fai clic sulla scheda Editor condizioni e inserisci la seguente espressione:
(resource.type == "compute.googleapis.com/Disk" && resource.name.startsWith("projects/project-123/regions/us-central1/disks/devAccess")) || (resource.type == "compute.googleapis.com/Instance" && resource.name.startsWith("projects/project-123/zones/us-central1-a/instances/devAccess")) || (resource.type != "compute.googleapis.com/Disk" && resource.type != "compute.googleapis.com/Instance")
Dopo aver inserito l'espressione, puoi facoltativamente scegliere di eseguire il lint della sintassi CEL facendo clic su Esegui Linter sopra la casella di testo in alto a destra.
Fai clic su Salva per applicare la condizione.
Dopo aver chiuso il riquadro Modifica condizione, fai di nuovo clic su Salva nel riquadro Modifica autorizzazioni per aggiornare il criterio di autorizzazione.
gcloud
I criteri di autorizzazione vengono impostati utilizzando il pattern lettura-modifica-scrittura.
Esegui il comando gcloud projects get-iam-policy
per ottenere l'attuale criterio di autorizzazione per il progetto. Nell'esempio seguente, la versione JSON del criterio di autorizzazione viene scaricata in un percorso su disco.
Comando:
gcloud projects get-iam-policy project-id --format=json > filepath
Viene scaricato il formato JSON del criterio di autorizzazione:
{
"bindings": [
{
"members": [
"user:project-owner@example.com"
],
"role": "roles/owner"
},
{
"members": [
"group:devs@example.com"
],
"role": "roles/compute.instanceAdmin"
}
],
"etag": "BwWKmjvelug=",
"version": 1
}
Per configurare il criterio di autorizzazione con una condizione di prefisso del nome della risorsa, aggiungi la seguente espressione della condizione evidenziata. Gcloud CLI aggiorna automaticamente la versione:
{ "bindings": [ { "members": [ "user:project-owner@example.com" ], "role": "roles/owner" }, { "members": [ "group:devs@example.com" ], "role": "roles/compute.instanceAdmin", "condition": { "title": "Dev_access_only", "description": "Only access to devAccess* VMs", "expression": "(resource.type == 'compute.googleapis.com/Disk' && resource.name.startsWith('projects/project-123/regions/us-central1/disks/devAccess')) || (resource.type == 'compute.googleapis.com/Instance' && resource.name.startsWith('projects/project-123/zones/us-central1-a/instances/devAccess')) || (resource.type != 'compute.googleapis.com/Instance' && resource.type != 'compute.googleapis.com/Disk')" } } ], "etag": "BwWKmjvelug=", "version": 3 }
Quindi, imposta il nuovo criterio di autorizzazione eseguendo il comando gcloud projects set-iam-policy
:
gcloud projects set-iam-policy project-id filepath
La nuova associazione di ruoli condizionale concederà le autorizzazioni devs@example.com
nel seguente modo:
Tutte le autorizzazioni per il disco e l'istanza vengono concesse solo se il nome della risorsa inizia con
devAccess
Tutte le altre autorizzazioni nel ruolo Amministratore istanza vengono concesse per tutti gli altri tipi di risorse
REST
Utilizza il pattern lettura, modifica e scrittura per consentire l'accesso a risorse specifiche.
Prima di tutto, leggi il criterio di autorizzazione per il progetto:
Il metodo projects.getIamPolicy
dell'API Resource Manager ottiene il criterio di autorizzazione di un progetto.
Prima di utilizzare i dati della richiesta, effettua le seguenti sostituzioni:
PROJECT_ID
: l'ID del tuo progetto Google Cloud. Gli ID progetto sono stringhe alfanumeriche comemy-project
.POLICY_VERSION
: la versione del criterio da restituire. Le richieste devono specificare la versione del criterio più recente, ovvero la versione 3. Per maggiori dettagli, consulta Specifica della versione di un criterio durante il recupero di un criterio.
Metodo HTTP e URL:
POST https://cloudresourcemanager.googleapis.com/v1/projects/PROJECT_ID:getIamPolicy
Corpo JSON della richiesta:
{ "options": { "requestedPolicyVersion": POLICY_VERSION } }
Per inviare la richiesta, espandi una di queste opzioni:
Dovresti ricevere una risposta JSON simile alla seguente:
{ "version": 1, "etag": "BwWKmjvelug=", "bindings": [ { "role": "roles/owner", "members": [ "user:project-owner@example.com" ] }, { "members": [ "group:devs@example.com" ], "role": "roles/compute.instanceAdmin" } ] }
Successivamente, modifica il criterio di autorizzazione in modo che consenta l'accesso a risorse specifiche. Assicurati di modificare il campo version
con il valore
3
:
{ "version": 3, "etag": "BwWKmjvelug=", "bindings": [ { "role": "roles/owner", "members": [ "user:project-owner@example.com" ] }, { "role": "roles/compute.instanceAdmin", "members": [ "group:devs@example.com" ], "condition": { "title": "Dev_access_only", "description": "Only access to devAccess* VMs", "expression": "(resource.type == 'compute.googleapis.com/Disk' && resource.name.startsWith('projects/project-123/regions/us-central1/disks/devAccess')) || (resource.type == 'compute.googleapis.com/Instance' && resource.name.startsWith('projects/project-123/zones/us-central1-a/instances/devAccess')) || (resource.type != 'compute.googleapis.com/Instance' && resource.type != 'compute.googleapis.com/Disk')" } } ] }
Infine, scrivi il criterio di autorizzazione aggiornato:
Il metodo projects.setIamPolicy
dell'API Resource Manager imposta il criterio di autorizzazione nella richiesta come nuovo criterio di autorizzazione del progetto.
Prima di utilizzare i dati della richiesta, effettua le seguenti sostituzioni:
PROJECT_ID
: l'ID del tuo progetto Google Cloud. Gli ID progetto sono stringhe alfanumeriche comemy-project
.
Metodo HTTP e URL:
POST https://cloudresourcemanager.googleapis.com/v1/projects/PROJECT_ID:setIamPolicy
Corpo JSON della richiesta:
{ "policy": { "version": 3, "etag": "BwWKmjvelug=", "bindings": [ { "role": "roles/owner", "members": [ "user:project-owner@example.com" ] }, { "role": "roles/compute.instanceAdmin", "members": [ "group:devs@example.com" ], "condition": { "title": "Dev_access_only", "description": "Only access to devAccess* VMs", "expression": "(resource.type == 'compute.googleapis.com/Disk' && resource.name.startsWith('projects/project-123/regions/us-central1/disks/devAccess')) || (resource.type == 'compute.googleapis.com/Instance' && resource.name.startsWith('projects/project-123/zones/us-central1-a/instances/devAccess')) || (resource.type != 'compute.googleapis.com/Instance' && resource.type != 'compute.googleapis.com/Disk')" } } ] } }
Per inviare la richiesta, espandi una di queste opzioni:
La risposta contiene il criterio di autorizzazione aggiornato.
Estrai i valori dai nomi delle risorse
Gli esempi precedenti mostrano i confronti booleani tra il nome della risorsa o l'inizio del nome della risorsa e un altro valore. In alcuni casi, tuttavia, potrebbe essere necessario confrontare un valore con una parte specifica del nome della risorsa che non si trova all'inizio.
Puoi utilizzare la funzione extract()
e specificare un modello di estrazione per estrarre la parte pertinente del nome della risorsa come stringa. Se necessario, puoi convertire la stringa estratta in un altro tipo, ad esempio un timestamp. Dopo aver estratto un valore dal nome della risorsa, puoi confrontarlo con altri valori.
I seguenti esempi mostrano le espressioni di condizione che utilizzano la funzione extract()
. Per maggiori dettagli sulla funzione extract()
, consulta
Riferimento agli attributi per le condizioni IAM.
Esempio: Abbina gli ordini degli ultimi 30 giorni
Supponi di archiviare le informazioni sugli ordini in più bucket Cloud Storage e che gli oggetti in ciascun bucket sono organizzati per data. Un tipico nome di oggetto potrebbe essere simile a questo esempio:
projects/_/buckets/acme-orders-aaa/objects/data_lake/orders/order_date=2019-11-03/aef87g87ae0876
Vuoi consentire a un'entità di accedere a qualsiasi ordine degli ultimi 30 giorni. La seguente condizione corrisponde agli oggetti Cloud Storage per questi ordini. Utilizza le funzioni duration()
e date()
per sottrarre 30 giorni (2.592.000 secondi) dal momento della richiesta, quindi confronta il timestamp con la data dell'ordine:
resource.type == 'storage.googleapis.com/Object' &&
request.time - duration('2592000s') < date(resource.name.extract('/order_date={date_str}/'))
Per maggiori dettagli sulle funzioni date()
e duration()
, consulta
l'articolo di riferimento per gli attributi data/ora.
Esempio: abbina le VM di Compute Engine in qualsiasi località
Supponi di voler concedere un ruolo a livello di progetto a un'entità per qualsiasi VM di Compute Engine il cui nome inizia con dev-
, indipendentemente dalla posizione della VM. Vuoi inoltre che l'entità possa utilizzare quel ruolo per tutti gli altri tipi di risorse.
Il nome della risorsa per una VM utilizza un formato simile a projects/project-id/zones/zone-id/instances/instance-name
.
La condizione seguente restituisce true
per le VM il cui nome di istanza inizia con la stringa dev-
e per tutti i tipi di risorse diversi dalle VM:
resource.type != 'compute.googleapis.com/Instance' ||
resource.name.extract('/instances/{name}').startsWith('dev-')
Il testo tra parentesi graffe identifica la parte del nome della risorsa estratta per il confronto. In questo esempio, il modello di estrazione estrae tutti i caratteri dopo la prima occorrenza della stringa /instances/
.
Considerazioni importanti sull'utilizzo delle condizioni basate sulle risorse
Quando aggiungi una condizione basata sulle risorse, è importante considerare in che modo la condizione influirà sulle autorizzazioni dell'entità.
Ruoli personalizzati
Considera l'esempio seguente, che riguarda i ruoli personalizzati. Un amministratore vuole creare un
ruolo personalizzato che concede l'accesso per creare istanze VM, ma consente all'utente
solo di creare istanze VM in un progetto con un nome risorsa che inizia con il
prefisso nome staging
, utilizzando i dischi con lo stesso prefisso del nome.
Per raggiungere questo obiettivo, assicurati che il ruolo concesso contenga le autorizzazioni richieste per creare un'istanza VM, ovvero le autorizzazioni per i tipi di risorse di disco e istanza. Quindi, assicurati che l'espressione della condizione verifichi nel nome della risorsa sia i dischi sia le istanze. Oltre a questi due tipi, non vengono concesse altre autorizzazioni nel ruolo.
La seguente espressione della condizione comporterà un comportamento imprevisto. Le autorizzazioni per operare sulle VM di Compute Engine sono bloccate:
resource.type == 'compute.googleapis.com/Disk' &&
resource.name.startsWith('projects/project-123/regions/us-central1/disks/staging')
La seguente espressione della condizione include dischi e istanze e gestirà l'accesso in base al nome della risorsa per questi due tipi:
(resource.type == 'compute.googleapis.com/Disk' &&
resource.name.startsWith('projects/project-123/regions/us-central1/disks/staging')) ||
(resource.type == 'compute.googleapis.com/Instance' &&
resource.name.startsWith('projects/project-123/zones/us-central1-a/instances/staging'))
La seguente espressione della condizione include sia dischi sia istanze e gestirà l'accesso in base al nome della risorsa per questi due tipi. Per qualsiasi altro tipo di risorsa, l'espressione della condizione concede il ruolo indipendentemente dal nome della risorsa:
(resource.type == 'compute.googleapis.com/Disk' &&
resource.name.startsWith('projects/project-123/regions/us-central1/disks/staging')) ||
(resource.type == 'compute.googleapis.com/Instance' &&
resource.name.startsWith('projects/project-123/zones/us-central1-a/instances/staging')) ||
(resource.type != 'compute.googleapis.com/Disk' &&
resource.type != 'compute.googleapis.com/Instance')
Autorizzazioni solo per i genitori
Nella gerarchia delle risorse di Google Cloud, alcune delle autorizzazioni in un ruolo che interessano una risorsa figlio devono essere applicate solo a livello padre. Ad esempio, per elencare le chiavi di crittografia per Cloud KMS, all'utente deve essere concessa l'autorizzazione cloudkms.cryptokeys.list
sul keyring che contiene le chiavi di crittografia, non le chiavi stesse. Questi tipi di autorizzazioni sono denominate autorizzazioni solo per i genitori e si applicano solo alle operazioni di list
.
Per concedere correttamente l'accesso alle autorizzazioni *.*.list
quando utilizzi le condizioni, l'espressione della condizione deve impostare gli attributi resource.service
e resource.type
in base al tipo di risorsa padre delle risorse di destinazione da elencare.
Considera gli esempi che seguono. Utilizzando l'esempio di Compute Engine riportato sopra, la seguente espressione impedisce l'accesso alle autorizzazioni compute.disks.list
e compute.instances.list
, poiché la risorsa su cui vengono controllate le autorizzazioni ha un valore dell'attributo resource.type
pari a cloudresourcemanager.googleapis.com/Project
.
(resource.type == 'compute.googleapis.com/Disk' &&
resource.name.startsWith('projects/project-123/regions/us-central1/disks/devAccess')) ||
(resource.type == 'compute.googleapis.com/Instance' &&
resource.name.startsWith('projects/project-123/zones/us-central1-a/instances/devAccess'))
È comune che queste autorizzazioni list
vengano concesse insieme ad altre
autorizzazioni per le operazioni regolari sulla risorsa. Per aumentare l'ambito della concessione in questo caso, puoi estendere l'ambito solo per il tipo cloudresourcemanager.googleapis.com/Project
oppure estenderlo a tutte le altre autorizzazioni non di tipo istanza o disco.
(resource.type == 'compute.googleapis.com/Disk' &&
resource.name.startsWith('projects/project-123/regions/us-central1/disks/devAccess')) ||
(resource.type == 'compute.googleapis.com/Instance' &&
resource.name.startsWith('projects/project-123/zones/us-central1-a/instances/devAccess')) ||
resource.type == 'cloudresourcemanager.googleapis.com/Project'
o
(resource.type == 'compute.googleapis.com/Disk' &&
resource.name.startsWith('projects/project-123/regions/us-central1/disks/devAccess')) ||
(resource.type == 'compute.googleapis.com/Instance' &&
resource.name.startsWith('projects/project-123/zones/us-central1-a/instances/devAccess')) ||
(resource.type != 'compute.googleapis.com/Disk' &&
resource.type != 'compute.googleapis.com/Instance')