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 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, puoi concedere l'accesso temporaneo agli utenti in modo che possano risolvere un problema di produzione oppure concedere l'accesso solo ai dipendenti che presentano richieste dalla sede aziendale.

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

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 dei ruoli può contenere zero o una condizione. Se un'associazione dei ruoli non ha un oggetto condition, le entità nell'associazione del ruolo avranno sempre il ruolo specificato nella risorsa.

Solo alcuni tipi di risorse accettano le condizioni nelle associazioni di ruoli. Tuttavia, puoi concedere l'accesso condizionale ad altri tipi di risorse concedendo ruoli a livello di organizzazione o di progetto.

L'oggetto condition ha la seguente struttura:

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

Il valore title della condizione è obbligatorio, mentre description è facoltativo. Sia il titolo che 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 alla specifica del linguaggio CEL.

Per scoprire come aggiungere, modificare e rimuovere associazioni di ruoli condizionali, consulta Gestire le associazioni di ruoli condizionali.

CEL per le condizioni

Common Expression Language, o CEL, è il linguaggio di espressione utilizzato per specificare un'espressione in una condizione IAM. È personalizzato per esprimere espressioni logiche basate su attributi. Per ulteriori informazioni, consulta la specifica CEL e la relativa definizione della lingua.

Nelle condizioni IAM, viene utilizzato un sottoinsieme di CEL per prendere decisioni di autorizzazione booleana 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, infine, determina se l'accesso è consentito.

Le condizioni IAM utilizzano le seguenti funzionalità CEL:

  • Variabili: le condizioni utilizzano variabili per esprimere un determinato attributo, ad esempio request.time (di tipo Timestamp) o resource.name (di tipo Stringa). Queste variabili vengono compilate con valori basati sul contesto in fase di esecuzione.
  • Operatori: ogni tipo di dati, ad esempio Timestamp o String, 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 di resource.service è compute.googleapis.com, l'espressione restituisce true.
  • 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 restituisce true se il valore di request.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 semplici istruzioni di espressione: &&, || e !. Questi operatori logici consentono di utilizzare più variabili di input in un'espressione di condizione. Ad esempio: request.time.getFullYear() < 2020 && resource.service == "compute.googleapis.com" unisce due semplici istruzioni e richiede che vengano soddisfatte entrambe per produrre un risultato di valutazione complessivo di true.

Per ulteriori informazioni su variabili, operatori e funzioni supportati, consulta la documentazione di riferimento sugli attributi.

Attributi condizione

Gli attributi della condizione 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 che valutano la risorsa 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 il riferimento per gli 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 a nessun altro tipo di risorsa:

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 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 che hanno il tag env: prod:

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

Attributi della richiesta

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

  • Il livello di accesso
  • Data e ora
  • L'indirizzo IP e la porta 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)

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, come l'indirizzo IP di origine, gli attributi del dispositivo, l'ora del giorno e altro ancora. Per maggiori dettagli, consulta la documentazione di Gestore contesto accesso.

Esempio di espressione di 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 di data/ora

Consenti l'accesso temporaneamente fino a una data/ora di scadenza specificata:

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 il mese e l'anno specificati, 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 informazioni su come utilizzare le espressioni di data/ora per configurare l'accesso temporaneo, consulta Configurazione dell'accesso temporaneo.

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

Consenti l'accesso a un indirizzo IP o a un numero di porta interni 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 di regola di forwarding

Consenti l'accesso per 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 di Google Cloud interno:

!compute.isForwardingRuleCreationOperation() || (
  compute.isForwardingRuleCreationOperation() &&
  compute.matchLoadBalancingSchemes([
    'INTERNAL', 'INTERNAL_MANAGED', 'INTERNAL_SELF_MANAGED'
  ])
)

Esempio di espressioni host/percorso dell'URL (per IAP)

Consenti 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 maggiori dettagli sugli schemi di bilanciamento del carico, consulta Utilizzo delle condizioni IAM sui bilanciatori del carico Google Cloud.

Espressione di esempio con diversi tipi di attributi

Consenti l'accesso se la richiesta viene effettuata in un orario specifico, corrispondente al prefisso del nome di una risorsa, al 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")

Passaggi successivi