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.

Condizioni e tipi di criteri

Puoi utilizzare le condizioni nelle seguenti posizioni:

  • Criteri di autorizzazione
  • Criteri di negazione
  • Associazioni dei criteri per i criteri di confine dell'accesso dell'entità

Le sezioni seguenti descrivono come utilizzare le condizioni in ciascuno di questi luoghi per applicare il controllo dell'accesso basato sugli attributi.

Condizioni nei criteri di autorizzazione

Puoi utilizzare le condizioni nei criteri di autorizzazione per scegliere di concedere l'accesso ai principali solo se sono soddisfatte le condizioni specificate. Ad esempio, puoi concedere agli utenti un accesso temporaneo per 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'associazione di ruoli ha una condizione, il ruolo viene concesso agli entità nel ruolo solo se l'espressione della condizione ha valore true.

Per aggiungere una condizione a un'associazione di ruoli, devi definire 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 Condizione struttura in questa pagina.

Solo alcuni tipi di risorse accettare condizioni nelle associazioni di ruoli. Tuttavia, puoi concedere l'accesso condizionale ad altri tipi di risorse tramite la concessione di ruoli a livello di organizzazione o di progetto.

Come best practice, non aggiungere più di 100 associazioni di ruoli condizionali a un singolo criterio 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 nei criteri di negazione

Puoi utilizzare le condizioni nei criteri di negazione per applicare una regola di negazione solo se è soddisfatta una determinata condizione. Ad esempio, potresti negare un'autorizzazione solo se la risorsa a cui l'entità sta tentando di accedere è contrassegnata come parte dell'ambiente prod.

Le condizioni sono specificate nelle regole di rifiuto dei criteri di rifiuto di una risorsa. Se la condizione restituisce true o non può essere valutata, viene applicata la regola di negazione e le entità non possono usare le autorizzazioni specificate. Se la condizione viene valutata come false, la regola di rifiuto non viene applicata e le entità possono utilizzare le autorizzazioni specificate, se le hanno.

Per aggiungere una condizione a una regola di negazione, devi definire 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 Condizione struttura in questa pagina.

Per informazioni su come creare e gestire i criteri di negazione, vedi Negare l'accesso.

Condizioni nelle associazioni dei criteri di Principal Access Boundary

Puoi utilizzare le condizioni nelle associazioni dei criteri per i criteri di confine dell'accesso dell'entità per perfezionare l'insieme di entità a cui si applica il criterio di confine dell'accesso dell'entità. Ad esempio, puoi applicare un criterio solo per gli account di servizio o esentare super-admin@example.com da un criterio.

Le condizioni sono specificate in ogni associazione di criteri. Se un'associazione di criteri ha un della norma, il criterio nell'associazione dei criteri viene applicato in modo forzato solo se la condizione restituisce 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 di una condizione, consulta Struttura della condizione in questa pagina.

Per scoprire come creare associazioni dei criteri per i criteri di confine dell'accesso dell'entità, consulta Applicare un criterio di confine dell'accesso dell'entità a un insieme di entità.

Struttura delle condizioni

L'oggetto condition ha la seguente struttura:

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

title della condizione è obbligatorio, ma description è facoltativo. Entrambi i campi titolo e descrizione sono campi puramente informativi che consentono di identificare che descrive la condizione.

Il campo expression è obbligatorio. definisce un modello basato su attributi espressione logica utilizzando un sottoinsieme del Common Expression Language (CEL). L'espressione di condizione può contenere più istruzioni, ognuna delle quali valuta un attributo. Le istruzioni vengono combinate utilizzando operatori logici, secondo la specifica del linguaggio CEL.

CEL per le condizioni

Common Expression Language, o CEL, è il linguaggio delle espressioni utilizzato per specificare è un'espressione in condizioni IAM. È personalizzato per esprimere espressioni logiche basate su attributi. Per ulteriori informazioni, consulta Specifiche CEL e relative lingua definizione.

In Condizioni IAM, viene utilizzato un sottoinsieme di CEL per prendere decisioni di autorizzazione booleane in base ai dati degli attributi. In genere, un'espressione di condizione è costituita da una o più istruzioni unite da operatori logici (&&, || o !).

Ogni istruzione esprime una regola di controllo basata sugli attributi e, in ultima analisi, determina se si applica l'associazione dei ruoli, la regola di rifiuto o l'associazione dei criteri.

Le condizioni nelle condizioni IAM usano le seguenti funzionalità CEL:

  • Variabili: le condizioni utilizzano le variabili per esprimere un determinato attributo, ad esempiorequest.time (di tipo Timestamp) o resource.name (di tipo Stringa). Questi vengono compilate con valori basati sul contesto al momento dell'attivazione.
  • 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 valore, come resource.service == 'compute.googleapis.com'. In questo esempio, se il valore di input di resource.service è compute.googleapis.com, l'espressione assume il valore true.
  • Funzioni: una funzione è un operatore composto per i tipi di dati che supportano operazioni più complesse. Nelle espressioni con condizioni, ci sono di funzioni utilizzabili con un determinato tipo di dati. Ad esempio, request.path.startsWith('/finance') utilizza una funzione di corrispondenza del prefisso della 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 istruzioni di espressione di base: &&, || e !. Questi operatori logici consentono di utilizzare variabili di input in un'espressione di condizione. Ad esempio: request.time.getFullYear() < 2020 && resource.service == 'compute.googleapis.com' unisce due istruzioni di base e richiede che entrambe le istruzioni siano soddisfatte in ordine per produrre un risultato di valutazione complessivo di true.

Per ulteriori informazioni su variabili, operatori e funzioni supportati, consulta riferimento dell'attributo.

Attributi della condizione

Gli attributi 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.

Gli attributi della condizione che puoi utilizzare in un'espressione di condizione dipendono il tipo di norma per cui stai scrivendo le condizioni. Per un elenco completo degli attributi delle condizioni e per saperne di più sugli attributi supportati per ciascun tipo di criterio, consulta la documentazione di riferimento relativa agli attributi.

Le sezioni seguenti mostrano esempi di alcuni degli attributi che puoi utilizzare nelle condizioni.

Attributi risorsa

Puoi utilizzare gli attributi della risorsa per scrivere condizioni che valutano la risorsa nella richiesta di accesso. Gli attributi che puoi valutare includono seguenti:

  • Il tipo di risorsa
  • Il nome della risorsa
  • Il servizio Google Cloud utilizzato
  • I tag associati alla risorsa

Per un elenco completo degli attributi delle risorse, consulta 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

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 ruolo, 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'associazione di ruoli, 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 rifiuto, la seguente espressione di condizione nega l'accesso alle risorse Google Cloud con il tag env: prod:

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

Attributi principali

Gli attributi principali ti consentono di scrivere condizioni in base all'entità che ha emesso la richiesta. Gli attributi che puoi valutare includono:

  • Il tipo di entità nella richiesta
  • Identità dell'entità nella richiesta

Per maggiori dettagli, consulta la documentazione di riferimento sull'attributo conditions.

Espressioni di esempio

In un'associazione di criteri di Principal Access Boundary, la seguente espressione di condizione garantisce che il criterio nell'associazione venga applicato solo per gli account di servizio:

principal.type == 'iam.googleapis.com/ServiceAccount'

In un'associazione di criteri di confine dell'accesso dell'entità, la seguente espressione di condizione garantisce che il criterio nell'associazione non venga applicato per super-admin@example.com:

principal.subject != 'super-admin@example.com'

Attributi della richiesta

Puoi utilizzare gli attributi di richiesta per scrivere condizioni che valutano i dettagli la richiesta, ad esempio:

  • Il livello di accesso
  • Data e ora
  • Indirizzo IP e porta di destinazione (per il tunneling TCP IAP)
  • L'host o il percorso dell'URL previsto (per gli acquisti in-app)

Esempio di espressione del 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 un rete aziendale. Quindi, aggiungi la seguente espressione di condizione a un ruolo associazione 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 l'indirizzo IP di origine, gli attributi del dispositivo, l'ora del giorno e altro ancora. Per maggiori informazioni vedi la documentazione di Gestore contesto accesso.

Esempio di espressione di attributo API

Nell'associazione di un ruolo per un ruolo con iam.projects.setIamPolicy l'autorizzazione, la seguente espressione della condizione consente a un utente di concedere e revocare solo il ruolo Amministratore account di fatturazione (roles/billing.admin) nella 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, consulta Impostazione di limiti per la concessione dei ruoli.

Esempi di espressioni di data/ora

In un'associazione di ruoli, 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, in 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 di ruoli, la seguente espressione di condizione consente l'accesso solo per il mese di giugno 2020, in base al fuso orario di Berlino, in Germania:

request.time.getFullYear('Europe/Berlin') == 2020
request.time.getMonth('Europe/Berlin') < 6

Per specificare un timestamp, utilizza RFC 3339 formato. 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.

Scopri come utilizzare le espressioni data/ora per configurare consulta l'articolo Configurazione dell'accesso temporaneo.

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

In un'associazione di ruolo, la seguente espressione di condizione consente l'accesso a un indirizzo IP o un numero di porta 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 delle regole 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 inoltro o se la richiesta crea una regola di inoltro 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 Utilizzare le condizioni IAM sui bilanciatori del carico Google Cloud.

Esempi di espressioni di percorso o host di URL (per IAP)

In un'associazione di ruoli, la seguente espressione di condizione consente 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')

Espressione di esempio 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, corrisponde 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