Condiciones de IAM para las reglas de reenvío

Las condiciones de administración de identidades y accesos (IAM) te permiten definir políticas de IAM con permisos condicionales. Debes especificar las condiciones en las vinculaciones de funciones de la política de IAM de un recurso. Si una condición existe, el rol solo se otorga cuando la expresión de la condición se evalúa como true. Cada expresión de condición es un conjunto de instrucciones lógicas que te permite especificar uno o varios atributos. A fin de obtener más información, consulta la referencia de atributos para las condiciones de IAM.

Cuando se usa con Cloud Load Balancing, las condiciones de IAM te permiten otorgar de forma condicional roles predefinidos (como administrador del balanceador de cargas o administrador de red) o personalizados.

Las condiciones de IAM admiten una expresión de condición para comprobar el esquema de balanceo de cargas de una regla de reenvío. Por ejemplo, puedes otorgar de forma condicional a un principal de IAM la capacidad de crear balanceadores de cargas internos, pero no externos. Si ese principal de IAM intenta crear una regla de reenvío para un balanceador de cargas externo, Google Cloud rechaza la acción y muestra un error como el siguiente:

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'

Usa condiciones de IAM en los balanceadores de cargas de Google Cloud

El esquema de balanceo de cargas de una regla de reenvío determina qué tipo o tipos de balanceador de cargas puede usar la regla de reenvío. En otras palabras, el esquema de balanceo de cargas corresponde al tipo de balanceador de cargas, como se muestra en la siguiente tabla.

Esquema de balanceo de cargas Descripción
EXTERNAL Balanceador de cargas de aplicaciones clásico
Balanceador de cargas de red del proxy clásico
Balanceador de cargas de red de transferencia externo
EXTERNAL_MANAGED Balanceador de cargas de aplicaciones externo global
Balanceador de cargas de red de proxy externo global
Balanceador de cargas de aplicaciones externo regional
Balanceador de cargas de red de proxy externo regional
INTERNAL Balanceador de cargas de red de transferencia interno
INTERNAL_MANAGED Balanceador de cargas de aplicaciones interno regional
Balanceador de cargas de red del proxy interno regional
Balanceador de cargas de aplicaciones interno entre regiones
Balanceador de cargas de red del proxy interno entre regiones
INTERNAL_SELF_MANAGED Cloud Service Mesh

Cuando crees el balanceador de cargas especifica el campo loadBalancingScheme. Si marcas el campo loadBalancingScheme en una condición de IAM, puedes otorgarle a los principales la capacidad de crear ciertos tipos de balanceadores de cargas.

Especifica las condiciones de IAM

Puedes establecer vinculaciones de roles condicionales mediante el mismo método setIamPolicy que usas para configurar cualquier otra vinculación de roles. Para establecer una vinculación de rol con una condición en un proyecto, puedes usar la API de REST, la herramienta de línea de comandos de gcloud o la página de IAM en la consola de Google Cloud.

Para obtener más información, consulta Administra políticas condicionales.

Ejemplo de expresiones de condición para el balanceo de cargas

La siguiente expresión de condición, que se puede usar en una política de IAM, permite una solicitud a la API solo si se cumple una de las siguientes condiciones:

  • La solicitud no implica crear una regla de reenvío.
  • La solicitud es crear una regla de reenvío que tenga uno de los esquemas de balanceo de cargas internos.

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

Se omite el esquema de balanceo de cargas EXTERNAL. Si una principal intenta crear una regla de reenvío con el esquema de balanceo de cargas EXTERNAL, aparecerá un mensaje de error de permisos.

Ejemplo de una política

Esta política de IAM de ejemplo para un proyecto le otorga al principal de IAM jane@example.com la función predefinida de administrador del balanceador de cargas, y excluye la capacidad de crear balanceadores de cargas externos (porque el esquema de balanceo de cargas EXTERNAL se omite). jane@example.com puede crear balanceadores de cargas internos y administrar, modificar y borrar cualquier balanceador de cargas.

{
  "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'])
             )
          "
      }
    }
  ]
}

Otorga permisos de cuenta de servicio de GKE para tipos específicos de reglas de reenvío

También puedes usar las condiciones de IAM para limitar el acceso a la cuenta de servicio de GKE a fin de crear solo tipos específicos de reglas de reenvío.

En este ejemplo de JSON, se muestra una política de IAM completa para otorgar a la cuenta de servicio de GKE (service-PROJECT_ID@container-engine-robot.iam.gserviceaccount.com) la función de agente de servicio de Kubernetes Engine. Esta función permite que la cuenta de servicio cree, modifique y borre componentes del balanceador de cargas, excepto las reglas de reenvío externas.

Con este otorgamiento condicional, la cuenta de servicio de GKE solo puede crear nuevas reglas de reenvío internas, pero puede administrar todas las reglas de reenvío existentes.

{
  "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()
          "
      }
    }
  ]
}

Si intentas crear un nuevo servicio de GKE de tipo LoadBalancer sin la anotación para un balanceador de cargas de red de transferencia interno cuando no hay otros otorgamientos, aparecerá un mensaje de error como el siguiente:

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

Además, sin otros otorgamientos, intentar crear un nuevo objeto Ingress genera un mensaje de error similar porque el controlador de Ingress de Cloud Load Balancing debe crear un balanceador de cargas de aplicaciones externo.

Los mensajes de error de GKE están disponibles mediante los comandos kubectl describe y kubectl get events -w.

¿Qué sigue?