Condizioni IAM per le regole di inoltro

Le condizioni IAM (Identity and Access Management) ti consentono di definire criteri IAM con concessioni condizionali. Specifichi le condizioni nelle associazioni di ruolo del criterio IAM di una risorsa. Se esiste una condizione, il ruolo viene concesso solo quando l'espressione della condizione ha valore true. Ogni espressione di condizione è un insieme di istruzioni logiche che consente di specificare uno o più attributi. Per ulteriori informazioni, consulta il riferimento agli attributi per le condizioni IAM.

Se utilizzate con Cloud Load Balancing, le condizioni IAM ti consentono di concedere condizionatamente ruoli predefiniti, come Amministratore bilanciatore del carico o Amministratore di rete, o ruoli personalizzati.

Le condizioni IAM supportano un'espressione di condizione per controllare lo schema di bilanciamento del carico di una regola di inoltro. Ad esempio, puoi concedere in modo condizionale a un entità IAM la possibilità di creare bilanciatori del carico interni, ma non esterni. Se questo principale IAM tenta di creare una regola di forwarding per un bilanciatore del carico esterno, Google Cloud nega l'azione e restituisce un errore simile al seguente:

ERROR: (gcloud.compute.forwarding-rules.create) Could not fetch resource:

 - Required 'compute.forwardingRules.create' permission for
 'projects/PROJECT_ID/regions/REGION/forwardingRules/FORWARDING_RULE_NAME'

Utilizzo delle condizioni IAM sui bilanciatori del carico Google Cloud

Lo schema di bilanciamento del carico di una regola di forwarding determina il tipo o i tipi di bilanciatore del carico che possono utilizzare la regola di forwarding. In altre parole, lo schema di bilanciamento del carico corrisponde al tipo di bilanciatore del carico, come mostrato nella tabella seguente.

Schema di bilanciamento del carico Descrizione
EXTERNAL Bilanciatore del carico delle applicazioni classico
Bilanciatore del carico di rete proxy classico
Bilanciatore del carico di rete passthrough esterno
EXTERNAL_MANAGED Bilanciatore del carico delle applicazioni esterno globale
Bilanciatore del carico di rete proxy esterno globale
Bilanciatore del carico delle applicazioni esterno regionale
Bilanciatore del carico di rete proxy esterno regionale
INTERNAL Bilanciatore del carico di rete passthrough interno
INTERNAL_MANAGED Bilanciatore del carico delle applicazioni interno regionale
Bilanciatore del carico di rete proxy interno regionale
Bilanciatore del carico delle applicazioni interno tra regioni
Bilanciatore del carico di rete proxy interno tra regioni
INTERNAL_SELF_MANAGED Cloud Service Mesh

Specifica il campo loadBalancingScheme quando crei il bilanciatore del carico. Se selezioni il campo loadBalancingScheme in una condizione IAM, puoi concedere alle entità la possibilità di creare determinati tipi di bilanciatori del carico.

Specifica delle condizioni IAM

Puoi impostare le associazioni di ruoli condizionali utilizzando lo stesso metodo setIamPolicy impiegato per configurare qualsiasi altra associazione di ruoli. Per impostare un'associazione di ruoli con una condizione in un progetto, puoi utilizzare l'API REST, lo strumento a riga di comando gcloud o la pagina IAM nella console Google Cloud.

Per ulteriori informazioni, consulta Gestire i criteri agevolati.

Esempi di espressioni di condizione per il bilanciamento del carico

La seguente espressione di condizione, che può essere utilizzata in un criterio IAM, consente una richiesta API solo se una delle seguenti condizioni è vera:

  • La richiesta non prevede la creazione di una regola di forwarding.
  • La richiesta è di creare una regola di forwarding che abbia uno degli schemi di bilanciamento del carico interno.

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

Lo schema di bilanciamento del carico EXTERNAL viene omesso. Se un entità principale tenta di creare una regola di forwarding con lo schema di bilanciamento del carico EXTERNAL, viene visualizzato un messaggio di errore relativo alle autorizzazioni.

Norme di esempio

Questo criterio IAM di esempio per un progetto concede all'entità IAM jane@example.com il ruolo predefinito Amministratore bilanciatore del carico, escludendo la possibilità di creare bilanciatori del carico esterni (poiché lo schema di bilanciamento del carico EXTERNAL è omesso). jane@example.com può creare bilanciatori del carico interni e può gestire, modificare ed eliminare qualsiasi bilanciatore del carico.

{
  "bindings": [
    {
      "role": "roles/compute.loadBalancerAdmin",
      "members": ["user:jane@example.com"],
      "condition": {
          "title": "only_internal_lb_schemes",
          "description": "Internal LB creation only permitted",
          "expression": "
             !compute.isForwardingRuleCreationOperation() || (
                compute.isForwardingRuleCreationOperation() &&
                compute.matchLoadBalancingSchemes(['INTERNAL', 'INTERNAL_MANAGED'])
             )
          "
      }
    }
  ]
}

Concedere autorizzazioni all'account di servizio GKE per tipi specifici di regole di inoltro

Puoi anche utilizzare le condizioni IAM per limitare l'accesso all'account di servizio GKE in modo da creare solo tipi specifici di regole di inoltro.

Questo esempio JSON mostra un criterio IAM completo per concedere all'account di servizio GKE (service-PROJECT_ID@container-engine-robot.iam.gserviceaccount.com) il ruolo Agente di servizio Kubernetes Engine. Questo ruolo consente all'account di servizio di creare, modificare ed eliminare i componenti del bilanciatore del carico, ad eccezione delle regole di inoltro esterno.

Con questa concessione condizionale, l'account di servizio GKE può creare solo nuove regole di inoltro interno, ma può gestire tutte le regole di inoltro esistenti.

{
  "bindings": [
    {
      "role": "roles/container.serviceAgent",
      "members": ["serviceAccount:service-<var>PROJECT_ID</var>@container-engine-robot.iam.gserviceaccount.com"],
      "condition": {
          "title": "only_internal_lb_schemes",
          "description": "Internal LB Creation Only Permitted",
          "expression": "(
                 compute.isForwardingRuleCreationOperation()
                      &&
                  compute.matchLoadBalancingSchemes(['INTERNAL', 'INTERNAL_MANAGED'])
              )
                  ||
              !compute.isForwardingRuleCreationOperation()
          "
      }
    }
  ]
}

In assenza di altre concessioni, il tentativo di creare un nuovo servizio GKE di tipo LoadBalancer senza l'annotazione per un bilanciatore del carico di rete passthrough interno genera un messaggio di errore simile al seguente:

Error creating load balancer (will retry): failed to ensure load balancer for
service default/SERVICE-NAME: failed to create forwarding rule for load balancer
(a01d427111c7011ea96e142010a80006(default/SERVICE-NAME)): googleapi: Error 403:
Required 'compute.forwardingRules.create' permission for
'projects/PROJECT_ID/regions/[region]/forwardingRules/FORWARDING_RULE_NAME',
forbidden

Inoltre, senza altre concessioni, il tentativo di creare un nuovo oggetto Ingress provoca un messaggio di errore simile perché il controller Ingress di Cloud Load Balancing deve creare un Application Load Balancer esterno.

I messaggi di errore di GKE sono disponibili utilizzando i comandi kubectl describe e kubectl get events -w.

Passaggi successivi