Panoramica delle condizioni IAM

In questa pagina viene descritta la funzionalità Condizioni di Identity and Access Management (IAM). Puoi utilizzare le condizioni IAM per definire e applicare il controllo dell'accesso condizionale e basato sugli attributi per le risorse Google Cloud.

Con le condizioni IAM, puoi scegliere di concedere l'accesso alle entità solo se vengono soddisfatte determinate condizioni. Ad esempio, potresti concedere agli utenti un accesso temporaneo in modo che possano risolvere un problema relativo alla produzione oppure concedere l'accesso solo ai dipendenti che effettuano richieste dal tuo ufficio aziendale.

Le condizioni sono specificate nelle associazioni di ruoli del criterio di autorizzazione di una risorsa. In presenza di una condizione, la richiesta di accesso viene concessa solo se l'espressione della condizione restituisce true. Ogni espressione della condizione è un insieme di istruzioni logiche che specificano uno o più attributi da controllare.

Consenti criteri con condizioni

I criteri consentiti contengono una o più associazioni di ruoli, che hanno la seguente struttura:

"bindings": [
  {
    "role": ...,
    "members": ...,
    "condition": ...
  },
  ...
]

L'oggetto condition è facoltativo e ogni associazione di ruoli può contenere zero o una condizione. Se un'associazione di ruoli non ha un oggetto condition, i principali dell'associazione dei ruoli hanno sempre il ruolo specificato nella risorsa.

L'oggetto condition ha la seguente struttura:

"condition": {
    "title": ...,
    "description": ...,
    "expression": ...
}

La condizione title è obbligatoria, ma description è facoltativa. Sia il titolo sia la descrizione sono campi puramente informativi che consentono di identificare e descrivere la condizione.

Il campo expression è obbligatorio. Definisce un'espressione logica basata su 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, in base alle specifiche del linguaggio CEL.

Per informazioni su come aggiungere, modificare e rimuovere le associazioni di ruoli condizionali, consulta Gestione delle associazioni di ruoli condizionali.

CEL per le condizioni

Il linguaggio CEL è il linguaggio delle espressioni utilizzato per specificare un'espressione nella condizione IAM. È personalizzata per esprimere espressioni logiche basate su 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 booleane di autorizzazione in base ai dati degli attributi. In generale, un'espressione della condizione è costituita 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 infine 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) o resource.name (di tipo Stringa). Il valore di queste variabili viene calcolato in base al contesto in fase di esecuzione.
  • Operatori: ogni tipo di dati, come Timestamp o Stringa, supporta un insieme di operatori che è possibile utilizzare per creare un'espressione logica. Nella maggior parte dei casi, 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 di resource.service è compute.googleapis.com, l'espressione valuta true.
  • Funzioni: una funzione è un operatore "compound" per i tipi di dati che supportano operazioni più complesse. Nelle espressioni delle condizioni, esistono funzioni predefinite che possono essere utilizzate con un determinato tipo di dati. Ad esempio, request.path.startsWith("/finance") utilizza una funzione di corrispondenza di prefisso della stringa e restituisce true se il valore di request.path contiene un prefisso corrispondente, come "/finanza".
  • Operatori logici: le condizioni supportano tre operatori logici che possono essere utilizzati per creare espressioni logiche complesse da istruzioni di espressione semplice: &&, || 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" si unisce a due semplici istruzioni e richiede che entrambe le istruzioni siano soddisfatte per produrre un risultato di valutazione complessivo di true.

Per maggiori informazioni su variabili, operatori e funzioni supportati, consulta il riferimento attributo.

Attributi condizione

Gli attributi della condizione si basano sulla risorsa richiesta, ad esempio il tipo o il nome, o sui dettagli relativi alla richiesta, ad esempio il timestamp o l'indirizzo IP di destinazione.

Attributi della risorsa

Puoi utilizzare gli attributi delle risorse per scrivere condizioni che valutino la risorsa nella richiesta di accesso. Gli attributi che puoi valutare includono:

  • 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 il riferimento degli attributi delle risorse.

Per informazioni su come utilizzare gli attributi delle risorse per configurare l'accesso basato sulle risorse, consulta la sezione Configurare l'accesso basato sulle risorse.

Espressioni di esempio

Consenti l'accesso alle istanze VM di Compute Engine, ma non ci sono altri tipi di risorse:

resource.type == "compute.googleapis.com/Instance"

Consenti l'accesso alle risorse di Cloud Storage, ma a nessun altro servizio:

resource.service == "storage.googleapis.com"

Consenti l'accesso solo ai bucket Cloud Storage i cui nomi iniziano con un prefisso specificato:

resource.type == "storage.googleapis.com/Bucket" &&
resource.name.startsWith("projects/_/buckets/exampleco-site-assets-")

Consenti l'accesso alle risorse Google Cloud che hanno il tag env: prod:

resource.matchTag('123456789012/env', 'prod')

Attributi della richiesta

Puoi utilizzare gli attributi di richiesta per scrivere condizioni che valutino i dettagli della richiesta, come ad esempio quanto segue:

  • Il livello di accesso
  • La data e l'ora
  • Indirizzo e porta IP di destinazione (per tunneling IAP TCP)
  • L'host/percorso dell'URL previsto (per IAP)

Esempio di espressione del livello di accesso (solo per IAP)

Nell'esempio seguente, l'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. 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 agli attributi della richiesta, ad esempio indirizzo IP di origine, attributi del dispositivo, ora del giorno e altro. Per maggiori dettagli, consulta la documentazione relativa a Gestore contesto accesso.

Esempio di attributo dell'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 saperne di più sull'utilizzo degli attributi dell'API per limitare la concessione dei ruoli, consulta Impostare i limiti per la concessione dei ruoli.

Esempi di espressioni data/ora

Consentire l'accesso temporaneamente 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 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") <= 5

Consenti l'accesso solo per un mese e un anno specifici, 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 maggiori dettagli sulle espressioni data/ora, consulta la specifica CEL.

Per informazioni su come utilizzare le espressioni data/ora per configurare l'accesso temporaneo, consulta l'articolo Configurare l'accesso temporaneo.

Esempi di espressioni IP/porta di destinazione (per tunneling IAP TCP)

Consenti l'accesso a un indirizzo IP o a un numero di porta della destinazione interna:

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 regole di forwarding

Consenti l'accesso a un'entità se la richiesta non crea 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 dell'host/percorso dell'URL (per IAP)

Consentire l'accesso solo per determinati sottodomini o percorsi dell'URL nella richiesta:

request.host == "hr.example.com"
request.host.endsWith(".example.com")
request.path == "/admin/payroll.js"
request.path.startsWith("/admin")

Per informazioni dettagliate sugli schemi di bilanciamento del carico, vedi Utilizzo delle condizioni IAM sui bilanciatori del carico Google Cloud.

Esempio di espressione con diversi tipi di attributi

Consenti l'accesso se la richiesta viene effettuata in un periodo di tempo specifico, corrispondente a un prefisso del nome della risorsa, al livello di accesso desiderato e a 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 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
  • Attestatori
  • Configurazioni di convalida continua
  • Criteri
Cloud Bigtable (Bigtable)
  • Istanze
  • Tabelle
Cloud Key Management Service (Cloud KMS)
  • Chiavi di crittografia
  • Versioni delle chiavi di crittografia
  • Keyring
Cloud Spanner
  • Backup
  • Database
  • Istanze
Cloud SQL Istanze
Cloud Storage Bucket 1, 2
Compute Engine
  • Servizi di backend globali
  • Servizi di backend regionali
  • Firewall
  • Immagini
  • Modelli di istanza
  • Istanze
  • Dischi permanenti a livello di area geografica
  • Dischi permanenti a livello di zona
  • Snapshot
Identity-Aware Proxy (IAP)
  • Tunnel
  • Istanze tunnel
  • Zone tunnel
  • Tutti i servizi web
  • Singoli servizi web
  • Tipi di servizi web
  • Versioni servizio web
Resource Manager
  • Organizzazioni
  • Cartelle
  • Progetti
  • Chiavi tag
  • Valori tag
Secret Manager
  • Secret
  • Versioni secret

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 resource.name per fare riferimento agli oggetti nei bucket Cloud Storage. Tuttavia, devi aggiungere la condizione al criterio di autorizzazione per una risorsa di livello superiore, come il bucket o il progetto.

Altri tipi di risorse non consentono condizioni nei relativi criteri consentiti. Tuttavia, puoi aggiungere associazioni di ruoli condizionali a livello di organizzazione o di progetto e altre risorse ereditano le associazioni di ruolo tramite la gerarchia delle risorse.

Per informazioni dettagliate sugli attributi che influiscono sui tipi di risorse, consulta la documentazione di riferimento.

Passaggi successivi