In questa pagina viene descritta 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.
Con le condizioni IAM, puoi scegliere di concedere l'accesso alle entità solo se sono soddisfatte le condizioni specificate. Ad esempio, potresti concedere temporaneamente l'accesso agli utenti in modo che possano risolvere un problema di produzione oppure concedere l'accesso solo ai dipendenti che effettuano richieste dalla sede aziendale.
Le condizioni sono specificate nelle associazioni di ruolo dei criteri di autorizzazione di una risorsa. Quando esiste una condizione, la richiesta di accesso viene concessa solo se l'espressione della condizione restituisce un valore true
. Ogni espressione di condizione è un insieme di istruzioni logiche che specifica uno o più attributi da verificare.
Consenti criteri con condizioni
I criteri di autorizzazione contengono una o più associazioni di ruoli, che hanno la seguente struttura:
"bindings": [ { "role": ..., "members": ..., "condition": ... }, ... ]
L'oggetto condition
è facoltativo e ogni associazione di ruolo può contenere zero o una condizione. Se un'associazione dei ruoli non ha un oggetto condition
, i
principali di questa associazione hanno sempre il ruolo specificato per la risorsa.
L'oggetto condition
ha la seguente struttura:
"condition": { "title": ..., "description": ..., "expression": ... }
La condizione title
è obbligatoria, ma description
è facoltativa. 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 della condizione può contenere più istruzioni; ogni istruzione valuta un attributo. Le istruzioni vengono combinate utilizzando operatori logici, secondo la specifica del linguaggio CEL.
Per scoprire come aggiungere, modificare e rimuovere le associazioni di ruoli condizionali, consulta Gestire le associazioni di ruoli condizionali.
CEL per le condizioni
Common Expression Language, o CEL, è il linguaggio delle espressioni utilizzato per specificare un'espressione in una condizione IAM. È pensato per esprimere espressioni logiche basate sugli attributi. Per ulteriori informazioni, consulta le specifiche CEL e la relativa definizione del linguaggio.
In condizioni IAM, un sottoinsieme di CEL viene utilizzato per prendere decisioni di autorizzazione booleane in base ai dati degli attributi. In generale, un'espressione di condizione è composta da una o più istruzioni unite da un massimo di 12 operatori logici (&&
, ||
o !
). Ogni istruzione esprime una regola di controllo basata su attributi che si applica all'associazione dei ruoli e determina se l'accesso è consentito.
Le 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 il valore basato sul contesto in fase di esecuzione. - 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 della 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 valorerequest.path
contiene un prefisso corrispondente, come "/finance". - Operatori logici: le condizioni supportano tre operatori logici che possono essere utilizzati per creare espressioni logiche complesse da istruzioni di espressione semplici:
&&
,||
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 semplici istruzioni e richiede che entrambe le istruzioni siano soddisfatte per produrre un risultato complessivo di valutazionetrue
.
Per ulteriori informazioni sulle variabili, gli operatori e le funzioni supportati, consulta il riferimento sugli attributi.
Attributi della condizione
Gli attributi delle condizioni si basano sulla risorsa richiesta, ad esempio il tipo o il nome, o sui dettagli della richiesta, ad esempio il timestamp o l'indirizzo IP di destinazione.
Attributi della risorsa
Puoi utilizzare gli attributi delle risorse per scrivere condizioni per la valutazione delle risorse nella richiesta di accesso. Gli attributi che puoi valutare includono quanto segue:
- Il tipo di risorsa.
- Il nome della risorsa
- Il servizio Google Cloud in uso
- I tag associati alla risorsa
Per un elenco completo degli attributi delle risorse, consulta la documentazione di riferimento degli 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
Consenti l'accesso alle istanze VM di Compute Engine, ma nessun altro tipo di risorsa:
resource.type == "compute.googleapis.com/Instance"
Consenti l'accesso alle risorse Cloud Storage, ma non alle altre risorse dei servizi:
resource.service == "storage.googleapis.com"
Consenti 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/")
Consenti l'accesso alle risorse Google Cloud con il tag env: prod
:
resource.matchTag('123456789012/env', 'prod')
Attributi della richiesta
Puoi utilizzare gli attributi di richiesta per scrivere condizioni per la valutazione dei dettagli, ad esempio:
- Il livello di accesso
- La data e l'ora
- Indirizzo e porta IP di destinazione (per il tunneling TCP IAP)
- L'host/percorso dell'URL previsto (per IAP)
Esempio di espressione del livello di accesso (solo per IAP)
Nel seguente esempio, l'organizzazione definisce un livello di accesso, CorpNet
, che limita l'accesso all'intervallo di indirizzi IP da cui il traffico entra ed esce da una rete aziendale. L'accesso è consentito 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 ad attributi della richiesta, come indirizzo IP di origine, attributi dei dispositivi, ora del giorno e altro ancora. Per ulteriori dettagli, consulta la documentazione di Gestore contesto accesso.
Esempio di espressione dell'attributo API
Consenti a un utente di concedere e revocare solo il ruolo Amministratore account di fatturazione (roles/billing.admin
):
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, consulta Impostare i limiti per la concessione dei ruoli.
Esempi di espressioni data/ora
Consenti l'accesso temporaneo fino a una determinata data/ora di scadenza:
request.time < timestamp("2021-01-01T00:00:00Z")
Consenti l'accesso solo durante l'orario di lavoro specificato, in base al fuso orario per 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") <= 5
Consenti l'accesso solo per un mese e un anno specifici, in base al fuso orario per 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 data/ora, consulta la specifica CEL.
Per scoprire come utilizzare le espressioni data/ora per configurare l'accesso temporaneo, consulta la sezione Configurare l'accesso temporaneo.
Esempi di espressioni IP/porta di destinazione (per il tunneling TCP IAP)
Consenti l'accesso a un indirizzo IP o a un numero di porta interno di destinazione:
destination.ip == "14.0.0.1"
destination.ip != "127.0.0.1"
destination.port == 22
destination.port > 21 && destination.port <= 23
Esempi di espressioni delle regole di forwarding
Consenti l'accesso per un'entità se la richiesta non sta creando una regola di forwarding o se la richiesta sta creando una regola di forwarding per un bilanciatore del carico Google Cloud interno:
!compute.isForwardingRuleCreationOperation() || (
compute.isForwardingRuleCreationOperation() &&
compute.matchLoadBalancingSchemes([
'INTERNAL', 'INTERNAL_MANAGED', 'INTERNAL_SELF_MANAGED'
])
)
Esempi di espressioni host/percorso dell'URL (per IAP)
Consenti 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")
Per maggiori dettagli sugli schemi di bilanciamento del carico, consulta la pagina relativa all'uso delle condizioni IAM sui bilanciatori del carico Google Cloud.
Esempio di espressione con diversi tipi di attributi
Consentire l'accesso se la richiesta viene effettuata in un orario specifico, corrispondente a un prefisso di nome risorsa, con il livello di accesso desiderato 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")
Tipi di risorse che accettano le associazioni di ruoli condizionali
Puoi aggiungere condizioni per consentire i criteri per i seguenti tipi di risorse Google Cloud:
Servizio Google Cloud | Tipi di risorse |
---|---|
Autorizzazione binaria |
|
Certificate Authority Service |
|
Cloud Bigtable (Bigtable) |
|
Cloud Key Management Service (Cloud KMS) |
|
Cloud Spanner |
|
Cloud SQL |
|
Cloud Storage | Bucket 1, 2 |
Compute Engine |
|
Identity-Aware Proxy (IAP) |
|
Resource Manager |
|
Secret Manager |
|
1 Disponibile per i bucket che utilizzano l'accesso uniforme a livello di bucket. Se non puoi abilitare l'accesso uniforme a livello di bucket, puoi aggiungere condizioni al criterio di autorizzazione per una risorsa di livello superiore, ad esempio il progetto.
2 Puoi utilizzare l'attributo |
Altri tipi di risorse non consentono condizioni nei relativi criteri di autorizzazione. Tuttavia, è possibile aggiungere associazioni di ruoli condizionali a livello di organizzazione o di progetto, mentre altre risorse ereditano le associazioni di ruolo tramite la gerarchia delle risorse.
Per maggiori dettagli su quali attributi influiscono sui tipi di risorse, consulta la pagina Riferimento attributi.
Passaggi successivi
- Scopri di più sui criteri di autorizzazione.