Panoramica delle condizioni IAM

Questa pagina descrive la funzionalità Condizioni di Identity and Access Management (IAM). Puoi utilizzare le condizioni IAM per definire e applicare il controllo dell'accesso condizionale, basato su attributi per Google Cloud le risorse.

Condizioni e tipi di policy

Puoi utilizzare le condizioni nei seguenti punti:

  • Associazioni di ruoli delle policy di autorizzazione, incluse le associazioni di ruoli gestite dalle Privileged Access Manager entitlements
  • Regole del criterio di negazione
  • Associazioni di policy per le policy sul confine di accesso dell'entità

Le sezioni seguenti descrivono come utilizzare le condizioni in ciascuno di questi punti per applicare il controllo dell'accesso basato su 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'associazione di ruolo ha una condizione, i ruoli vengono concessi alle entità solo se l'espressione della condizione restituisce true.

Per aggiungere una condizione a un'associazione di ruolo, definisci il campo condition:

"bindings": [
  {
    "role": "ROLE",
    "members": [
      "MEMBER_1",
      "MEMBER_2"
    ],
    "condition": {
      "title": "TITLE",
      "description": "DESCRIPTION",
      "expression": "EXPRESSION"
    }
  }
]
Se utilizzi le autorizzazioni di Privileged Access Manager, puoi anche aggiungere condizioni ai ruoli in quell'autorizzazione. Quando un utente richiede correttamente una concessione per quell'autorizzazione, gli viene concesso il ruolo con la condizione specificata.

Per saperne di più sui campi in una condizione, consulta Struttura dellecondizioni in questa pagina.

Solo alcuni tipi di risorse accettano le condizioni nelle associazioni di ruoli. Tuttavia, puoi concedere l'accesso condizionale ad altri tipi di risorse mediante la concessione di 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 le policy 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 policy di negazione per applicare una regola di negazione solo se viene soddisfatta una determinata condizione. Ad esempio, puoi 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 delle policy 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 dei 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 saperne di più sui campi in una condizione, consulta Struttura dellecondizioni in questa pagina.

Per scoprire come creare e gestire le policy di negazione, consulta Negare l'accesso.

Condizioni nelle associazioni di policy sul confine di accesso dell'entità

Puoi utilizzare le condizioni nelle associazioni di policy per le policy sul confine di accesso dell'entità per perfezionare l'insieme di entità a cui si applica la policy sul confine di accesso dell'entità. Ad esempio, puoi applicare una policy solo ai service account o esentare super-admin@example.com da una policy.

Le condizioni sono specificate in ogni associazione di policy. Se un'associazione di policy ha una condizione, la policy nell'associazione di policy viene applicata solo se la condizione restituisce true.

Per aggiungere una condizione a un'associazione di policy, definisci il campo condition nell'associazione di policy:

{
  "displayName": "DISPLAY_NAME",
  "target": {
    "principalSet": "PRINCIPAL_SET"
  },
  "policyKind": "PRINCIPAL_ACCESS_BOUNDARY",
  "policy": "PAB_POLICY",
  "condition": {
    "title": "TITLE",
    "description": "DESCRIPTION",
    "expression": "EXPRESSION"
  }
}

Per saperne di più sui campi in una condizione, consulta Struttura dellecondizioni in questa pagina.

Per scoprire come creare associazioni di policy per le policy sul confine di accesso dell'entità, consulta Applicare una policy sul confine di accesso dell'entità a un insieme di entità.

Struttura delle condizioni

L'oggetto condition ha la seguente struttura:

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

Il title della condizione è obbligatorio, ma la description è facoltativa. Sia il titolo sia la descrizione sono campi puramente informativi che ti aiutano a identificare e descrivere la condizione.

Il campo expression è obbligatorio. Definisce un'espressione logica basata su attributi utilizzando un sottoinsieme di Common Expression Language (CEL). L'espressione della condizione può contenere più istruzioni; ogni istruzione valuta un attributo. Le istruzioni vengono combinate utilizzando operatori logici, seguendo la specifica del linguaggio CEL.

CEL per le condizioni

Common Expression Language, o CEL, è il linguaggio di espressione utilizzato per specificare un'espressione nelle condizioni IAM. È progettato per esprimere espressioni logiche basate su attributi. Per saperne di più, consulta la specifica CEL e la relativa definizione del linguaggio.

Nelle condizioni IAM, 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 !).

Ogni istruzione esprime una regola di controllo basata su attributi e, in definitiva, determina se viene applicata l'associazione di ruolo, la regola di negazione o l'associazione di policy.

Le condizioni nelle 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 String). Queste variabili vengono compilate con il valore in base al contesto in fase di runtime.
  • Operatori: ogni tipo di dati, ad esempio Timestamp o String, supporta un insieme di operatori che possono essere utilizzati 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 restituisce true.
  • Funzioni: una funzione è un operatore composto 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 del prefisso String 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 più 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 per produrre un risultato di valutazione complessivo true.

Per saperne di più sulle variabili, sugli operatori e sulle funzioni supportate, consulta il riferimento agli attributi.

Attributi delle condizioni

Gli attributi delle condizioni 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 policy per cui stai scrivendo le condizioni. Per un elenco completo degli attributi delle condizioni e per ulteriori informazioni sugli attributi supportati per ogni tipo di policy, 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
  • Il nome della risorsa
  • Il Google Cloud servizio utilizzato
  • I tag collegati alla risorsa

Puoi utilizzare uno qualsiasi di questi attributi nelle associazioni di ruoli delle policy di autorizzazione. Inoltre, puoi utilizzare l'attributo dei tag delle risorse nelle regole di negazione delle policy 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 ruolo, 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 alle risorse di nessun altro servizio:

resource.service == 'storage.googleapis.com'

In un'associazione di 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 a Google Cloud risorse con il tag env: prod:

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

Attributi dell'entità

Gli attributi dell'entità consentono di scrivere condizioni basate sull'entità che ha emesso la richiesta. Gli attributi che puoi valutare includono i seguenti:

  • Il tipo di entità nella richiesta
  • L'identità dell'entità nella richiesta

Puoi utilizzare questi attributi nelle associazioni di policy per le policy sul confine di accesso dell'entità.

Per maggiori dettagli, consulta ilriferimento agli attributi delle condizioni.

Espressioni di esempio

In un'associazione di policy sul confine di accesso dell'entità, 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 sul confine di accesso dell'entità, la seguente espressione di condizione garantisce che la policy nell'associazione non venga applicata a 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 di IAP)
  • L'host o il percorso URL previsto (per IAP)

Puoi utilizzare questi attributi nelle associazioni di ruoli delle policy di autorizzazione.

Espressione di esempio 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 una rete aziendale. Poi, aggiungi la seguente espressione di condizione a un'associazione di 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, 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.

Espressione di esempio dell'attributo API

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

Espressioni di esempio 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 ruolo, la seguente espressione di condizione consente l'accesso solo durante gli orari di lavoro specificati, 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 di 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 maggiori 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 Configurazione dell'accesso temporaneo.

Espressioni di esempio di indirizzo IP e porta di destinazione (per il tunneling TCP di IAP)

In un'associazione di ruolo, la seguente espressione di condizione consente l'accesso a un indirizzo IP o a 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

Espressioni di esempio regola di forwarding

In un'associazione di ruolo, la seguente espressione di condizione consente l'accesso a 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 interno Google Cloud :

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

Per maggiori dettagli sugli schemi di bilanciamento del carico, consulta Utilizzare le condizioni IAM nei Google Cloud bilanciatori del carico.

Espressioni di esempio di host o percorso URL (per IAP)

In un'associazione di ruolo, la seguente espressione di condizione consente l'accesso solo a 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')

Espressione di esempio con diversi tipi di attributi

In un'associazione di ruolo, la seguente espressione di condizione consente l'accesso se la richiesta viene effettuata durante un periodo di tempo specifico, corrisponde a un prefisso del nome della risorsa 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.type != 'compute.googleapis.com/Instance')

Passaggi successivi