Questa pagina descrive la funzionalità Condizioni di Identity and Access Management (IAM). Puoi utilizzare le condizioni IAM per definire e applicare forzatamente il controllo dell'accesso condizionale basato su attributi per le risorse Google Cloud .
Condizioni e tipi di norme
Puoi utilizzare le condizioni nei seguenti punti:
- Consenti le associazioni di ruoli delle policy, incluse le associazioni di ruoli gestite dai diritti di Privileged Access Manager
- Regole del criterio di negazione
- Associazioni di policy per le policy di Principal Access Boundary
Le sezioni seguenti descrivono come utilizzare le condizioni in ciascuno di questi luoghi per applicare controllo dell'accesso basato sugli attributi.
Condizioni nelle policy di autorizzazione
Puoi utilizzare le condizioni nelle policy di autorizzazione per scegliere di concedere l'accesso alle entità solo se sono soddisfatte le condizioni specificate. Ad esempio, puoi concedere l'accesso temporaneo agli utenti in modo che possano risolvere un problema di produzione oppure puoi concedere l'accesso solo ai dipendenti che effettuano richieste dalla rete aziendale.
Le condizioni sono specificate nelle associazioni di ruolo dei criteri di autorizzazione di una risorsa. Se un
binding del ruolo ha una condizione, i principal nel ruolo ricevono il ruolo solo se l'espressione della condizione restituisce true
.
Per aggiungere una condizione a un'associazione di ruoli, definisci il campo condition
:
"bindings": [ { "role": "ROLE", "members": [ "MEMBER_1", "MEMBER_2" ], "condition": { "title": "TITLE", "description": "DESCRIPTION", "expression": "EXPRESSION" } } ]
Per scoprire di più sui campi in una condizione, consulta Struttura della condizione in questa pagina.
Solo alcuni tipi di risorse accettano condizioni nei binding dei ruoli. Tuttavia, puoi concedere l'accesso condizionale ad altri tipi di risorse concedendo ruoli a livello di organizzazione o progetto.
Come best practice, non aggiungere più di 100 associazioni di ruoli condizionali a una singola policy di autorizzazione. Se utilizzi un numero maggiore di associazioni di ruoli condizionali, potresti superare il limite di dimensioni complessivo per i criteri di autorizzazione.
Per scoprire come aggiungere, modificare e rimuovere le associazioni di ruoli condizionali, consulta Gestione delle associazioni di ruoli condizionali.
Condizioni nelle policy di negazione
Puoi utilizzare le condizioni nelle norme di negazione per applicare una regola di negazione
solo se viene soddisfatta una determinata condizione. Ad esempio, potresti negare un'autorizzazione
solo se la risorsa a cui l'entità sta tentando di accedere è taggata come parte
dell'ambiente prod
.
Le condizioni sono specificate nelle regole di negazione dei criteri di negazione di una risorsa. Se la condizione restituisce true
o non può essere valutata, viene applicata la regola di negazione e le entità non possono utilizzare le autorizzazioni specificate. Se la condizione
restituisce false
, la regola di negazione non viene applicata e le entità possono utilizzare
le autorizzazioni specificate, se le hanno.
Le condizioni nelle policy di negazione hanno la stessa struttura delle condizioni nelle policy di autorizzazione; tuttavia, riconoscono solo le funzioni di tag delle risorse.
Per aggiungere una condizione a una regola di negazione, definisci il campo denialCondition
:
"rules": [ { "denyRule": { "deniedPrincipals": [ "PRINCIPAL_1", "PRINCIPAL_2" ], "exceptionPrincipals": [ "EXCEPTION_PRINCIPAL_1", "EXCEPTION_PRINCIPAL_2" ], "deniedPermissions": [ "DENIED_PERMISSION_1", "DENIED_PERMISSION_2" ], "denialCondition": { "title": "TITLE", "description": "DESCRIPTION", "expression": "EXPRESSION" } } } ]
Per scoprire di più sui campi in una condizione, consulta Struttura della condizione in questa pagina.
Per scoprire come creare e gestire le policy di negazione, consulta Nega l'accesso.
Condizioni nelle associazioni delle policy di Principal Access Boundary
Puoi utilizzare le condizioni nelle associazioni di policy per le policy di Principal Access Boundary per perfezionare l'insieme di entità a cui si applica la policy di Principal Access Boundary. Ad esempio, potresti applicare una norma solo agli account di servizio o esentare super-admin@example.com
da una norma.
Le condizioni sono specificate in ogni associazione di policy. Se un binding dei criteri ha una condizione, i criteri nel binding dei criteri vengono applicati solo se la condizione restituisce il valore true
.
Per aggiungere una condizione a un'associazione di criteri, definisci il campo condition
nell'associazione di criteri:
{ "displayName": "DISPLAY_NAME", "target": { "principalSet": "PRINCIPAL_SET" }, "policyKind": "PRINCIPAL_ACCESS_BOUNDARY", "policy": "PAB_POLICY", "condition": { "title": "TITLE", "description": "DESCRIPTION", "expression": "EXPRESSION" } }
Per scoprire di più sui campi in una condizione, consulta Struttura della condizione in questa pagina.
Per scoprire come creare associazioni di policy per le policy di Principal Access Boundary, consulta Applica una policy di Principal Access Boundary a un insieme di entità.
Struttura della condizione
L'oggetto condition
ha la seguente struttura:
"condition": { "title": ..., "description": ..., "expression": ... }
L'attributo title
della condizione è obbligatorio, mentre l'attributo description
è facoltativo. Sia il titolo che la descrizione sono campi puramente informativi che ti aiutano a identificare e descrivere la condizione.
Il campo expression
è obbligatorio. Definisce un'espressione logica basata sugli attributi utilizzando un sottoinsieme del Common Expression Language (CEL).
L'espressione di condizione può contenere più istruzioni; ogni istruzione
valuta un attributo. Le istruzioni vengono combinate utilizzando operatori logici,
in conformità con la specifica del linguaggio CEL.
CEL per le condizioni
Common Expression Language, o CEL, è il linguaggio delle espressioni utilizzato per specificare un'espressione in IAM Conditions. È progettato per esprimere espressioni logiche basate sugli attributi. Per maggiori informazioni, consulta le specifiche CEL e la relativa definizione di lingua.
In IAM Conditions, viene utilizzato un sottoinsieme di CEL per prendere decisioni di autorizzazione booleane in base ai dati degli attributi. In generale, un'espressione
di condizione è costituita da una o più istruzioni unite da operatori
logici (&&
, ||
o !
).
Le condizioni in Condizioni IAM utilizzano le seguenti funzionalità CEL:
- Variabili: le condizioni utilizzano le variabili per esprimere un determinato attributo, ad esempio
request.time
(di tipo Timestamp) oresource.name
(di tipo Stringa). Queste variabili vengono compilate con un valore in base al contesto in fase di runtime. - Operatori: ogni tipo di dati, ad esempio Timestamp o Stringa, supporta un insieme
di operatori che possono essere utilizzati per creare un'espressione logica. Più comunemente,
gli operatori vengono utilizzati per confrontare il valore contenuto in una variabile con un valore letterale, ad esempio
resource.service == 'compute.googleapis.com'
. In questo esempio, se il valore di input diresource.service
ècompute.googleapis.com
, l'espressione restituiscetrue
. - Funzioni: una funzione è un operatore composto per i tipi di dati che supportano
operazioni più complesse. Nelle espressioni di condizione, esistono funzioni predefinite
che possono essere utilizzate con un determinato tipo di dati. Ad esempio,
request.path.startsWith('/finance')
utilizza una funzione di corrispondenza del prefisso stringa e restituiscetrue
se il valore direquest.path
contiene un prefisso corrispondente, ad esempio/finance
. - Operatori logici: le condizioni supportano tre operatori logici che possono essere
utilizzati per creare espressioni logiche complesse da istruzioni di espressione di base:
&&
,||
e!
. Questi operatori logici consentono di utilizzare più variabili di input in un'espressione della condizione. Ad esempio:request.time.getFullYear() < 2020 && resource.service == 'compute.googleapis.com'
unisce due istruzioni di base e richiede che entrambe le istruzioni vengano soddisfatte in ordine per produrre un risultato di valutazione complessivotrue
.
Per ulteriori informazioni su variabili, operatori e funzioni supportati, consulta il riferimento agli attributi.
Attributi di condizione
Gli attributi della condizione si basano sulla risorsa richiesta, ad esempio il tipo o il nome, oppure sui dettagli della richiesta, ad esempio il timestamp o l'indirizzo IP di destinazione.
Gli attributi delle condizioni che puoi utilizzare in un'espressione di condizione dipendono dal tipo di criterio per cui stai scrivendo le condizioni. Per un elenco completo degli attributi delle condizioni e maggiori informazioni sugli attributi supportati per ogni tipo di criterio, consulta il riferimento agli attributi.
Le sezioni seguenti mostrano esempi di alcuni degli attributi che puoi utilizzare nelle condizioni.
Attributi risorsa
Puoi utilizzare gli attributi delle risorse per scrivere condizioni che valutano la risorsa nella richiesta di accesso. Gli attributi che puoi valutare includono i seguenti:
- Il tipo di risorsa
- Nome della risorsa
- Il servizio Google Cloud in uso
- I tag collegati alla risorsa
Puoi utilizzare uno qualsiasi di questi attributi nei binding dei ruoli dei criteri di autorizzazione. Inoltre, puoi utilizzare l'attributo dei tag delle risorse nelle regole di negazione delle norme di negazione.
Per un elenco completo degli attributi delle risorse, consulta il riferimento agli attributi delle risorse.
Per scoprire come utilizzare gli attributi delle risorse per configurare l'accesso basato sulle risorse, consulta Configurazione dell'accesso basato sulle risorse.
Espressioni di esempio
In un'associazione di ruoli, la seguente espressione di condizione consente l'accesso alle istanze VM di Compute Engine, ma a nessun altro tipo di risorsa:
resource.type == 'compute.googleapis.com/Instance'
In un'associazione di ruoli, la seguente espressione di condizione consente l'accesso alle risorse Cloud Storage, ma non alle risorse di altri servizi:
resource.service == 'storage.googleapis.com'
In un binding del ruolo, la seguente espressione di condizione consente l'accesso solo agli oggetti Cloud Storage all'interno di un bucket specifico:
resource.type == 'storage.googleapis.com/Object' &&
resource.name.startsWith('projects/_/buckets/exampleco-site-assets/')
In una regola di negazione, la seguente espressione di condizione nega l'accesso alle risorseGoogle Cloud che hanno il tag env: prod
:
resource.matchTag('123456789012/env', 'prod')
Attributi principali
Gli attributi dell'entità ti consentono di scrivere condizioni basate sull'entità che ha emesso la richiesta. Gli attributi che puoi valutare includono:
- Il tipo di entità nella richiesta
- L'identità del principal nella richiesta
Puoi utilizzare questi attributi nelle associazioni delle policy di Principal Access Boundary.
Per maggiori dettagli, consulta il riferimento all'attributo condizioni.
Espressioni di esempio
In un'associazione di policy di Principal Access Boundary, la seguente espressione di condizione garantisce che la policy nell'associazione venga applicata solo ai service account:
principal.type == 'iam.googleapis.com/ServiceAccount'
In un'associazione di policy di Principal Access Boundary, la seguente espressione di condizione
garantisce che la policy nell'associazione non venga applicata per
super-admin@example.com
:
principal.subject != 'super-admin@example.com'
Attributi della richiesta
Puoi utilizzare gli attributi della richiesta per scrivere condizioni che valutano i dettagli della richiesta, ad esempio:
- Il livello di accesso
- La data e l'ora
- L'indirizzo IP e la porta di destinazione (per il tunneling TCP IAP)
- L'host o il percorso dell'URL previsto (per IAP)
Puoi utilizzare questi attributi nei binding dei ruoli dei criteri di autorizzazione.
Espressione di esempio per un livello di accesso (solo per IAP)
Nell'esempio seguente, la tua organizzazione definisce un livello di accesso, CorpNet
,
che limita l'accesso all'intervallo di indirizzi IP in cui il traffico entra ed esce da una
rete aziendale. Poi, aggiungi la seguente espressione di condizione a un binding del ruolo per consentire l'accesso solo se la richiesta soddisfa il livello di accesso CorpNet
:
'accessPolicies/199923665455/accessLevels/CorpNet' in
request.auth.access_levels
La tua organizzazione definisce i livelli di accesso in base agli attributi della richiesta, ad esempio indirizzo IP di origine, attributi del dispositivo, ora del giorno e altro ancora. Per maggiori dettagli, consulta la documentazione di Gestore contesto accesso.
Esempio di espressione dell'attributo API
In un binding del ruolo per un ruolo con l'autorizzazione iam.projects.setIamPolicy
, la seguente espressione di condizione consente a un utente di concedere e revocare solo il ruolo Amministratore account di fatturazione (roles/billing.admin
) nel progetto:
api.getAttribute('iam.googleapis.com/modifiedGrantsByRole', [])
.hasOnly(['roles/billing.admin'])
Per scoprire di più sull'utilizzo degli attributi API per limitare la concessione dei ruoli, vedi Impostare limiti per la concessione dei ruoli.
Esempi di espressioni di data/ora
In un'associazione di ruolo, la seguente espressione di condizione consente l'accesso fino alla mezzanotte del 1° gennaio 2021:
request.time < timestamp('2021-01-01T00:00:00Z')
In un'associazione di ruoli, la seguente espressione della condizione consente l'accesso solo durante l'orario di lavoro specificato, in base al fuso orario di Berlino, Germania:
request.time.getHours('Europe/Berlin') >= 9 &&
request.time.getHours('Europe/Berlin') <= 17 &&
// Days of the week range from 0 to 6, where 0 == Sunday and 6 == Saturday.
request.time.getDayOfWeek('Europe/Berlin') >= 1 &&
request.time.getDayOfWeek('Europe/Berlin') <= '
In un'associazione ruolo, la seguente espressione di condizione consente l'accesso solo per il mese di giugno 2020, in base al fuso orario di Berlino, Germania:
request.time.getFullYear('Europe/Berlin') == 2020
request.time.getMonth('Europe/Berlin') < 6
Per specificare un timestamp, utilizza il formato RFC 3339. Per specificare un fuso orario, utilizza gli identificatori nel database dei fusi orari IANA.
Per ulteriori dettagli sulle espressioni di data/ora, consulta la specifica CEL.
Per scoprire come utilizzare le espressioni di data/ora per configurare l'accesso temporaneo, consulta l'articolo Configurazione dell'accesso temporaneo.
Esempi di espressioni di IP e porta di destinazione (per il tunneling TCP IAP)
In un binding del ruolo, la seguente espressione di condizione consente l'accesso a un numero di porta o a un indirizzo IP di destinazione interno:
destination.ip == '14.0.0.1'
destination.ip != '127.0.0.1'
destination.port == 22
destination.port > 21 && destination.port <= 23
Esempi di espressioni di regola di forwarding
In un'associazione di ruoli, la seguente espressione di condizione consente l'accesso per un'entità se la richiesta non crea una regola di forwarding o se la richiesta crea una regola di forwarding per un bilanciatore del carico Google Cloud interno:
!compute.isForwardingRuleCreationOperation() || (
compute.isForwardingRuleCreationOperation() &&
compute.matchLoadBalancingSchemes([
'INTERNAL', 'INTERNAL_MANAGED', 'INTERNAL_SELF_MANAGED'
])
)
Per informazioni dettagliate sugli schemi di bilanciamento del carico, consulta Utilizzo delle condizioni IAM sui bilanciatori del carico. Google Cloud
Esempi di espressioni di host o percorso URL (per IAP)
In un binding del ruolo, la seguente espressione di condizione consente l'accesso solo per determinati sottodomini o percorsi URL nella richiesta:
request.host == 'hr.example.com'
request.host.endsWith('.example.com')
request.path == '/admin/payroll.js'
request.path.startsWith('/admin')
Esempio di espressione con diversi tipi di attributi
In un'associazione di ruoli, la seguente espressione di condizione consente l'accesso se la richiesta viene effettuata in un momento specifico, corrispondente a un prefisso del nome della risorsa, con il livello di accesso scelto e per un tipo di risorsa specifico:
request.time > timestamp('2018-08-03T16:00:00-07:00') &&
request.time < timestamp('2018-08-03T16:05:00-07:00') &&
((resource.name.startsWith('projects/project-123/zones/us-east1-b/instances/dev') ||
(resource.name.startsWith('projects/project-123/zones/us-east1-b/instances/prod') &&
'accessPolicies/34569256/accessLevels/CorpNet' in request.auth.access_levels)) ||
resource.type != 'compute.googleapis.com/Instance')
Passaggi successivi
- Visualizza i dettagli sugli attributi di condizione che puoi utilizzare per gestire l'accesso.
- Scopri di più sulle norme di autorizzazione.
- Trova i tipi di risorse che accettano le associazioni di ruoli condizionali.