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, la función 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 funciones predefinidas, como el administrador del balanceador de cargas o el administrador de red, o funciones personalizadas, de manera que solo se puedan crear ciertos tipos de balanceadores de cargas.

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 miembro de IAM la capacidad de crear balanceadores de cargas internos, pero no externos. Si ese miembro 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 Balanceo de cargas de HTTP(S) externo
Balanceo de cargas de los proxies SSL y TCP externo
Balanceo de cargas de red de TCP/UDP externo
INTERNAL Balanceo de cargas de TCP/UDP interno
INTERNAL_MANAGED Balanceo de cargas de HTTP(S) interno
INTERNAL_SELF_MANAGED Traffic Director

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 miembros la capacidad de crear ciertos tipos de balanceadores de cargas.

Especifica las condiciones de IAM

Puedes establecer vinculaciones de funciones condicionales mediante el mismo método setIamPolicy que usas para configurar cualquier otra vinculación de funciones. Para establecer una vinculación de función 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 Cloud Console.

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 internos.
!compute.isForwardingRuleCreationOperation() || (
  compute.isForwardingRuleCreationOperation() &&
  compute.matchLoadBalancingSchemes(['INTERNAL', 'INTERNAL_MANAGED', 'INTERNAL_SELF_MANAGED'])
)

El efecto de esta política es provocar que aparezca un mensaje de error de permiso si un miembro intenta crear una regla de reenvío con el esquema de balanceo de cargas EXTERNAL porque se omite el esquema de balanceo de cargas EXTERNAL.

Ejemplo de una política

Esta política de IAM de ejemplo para un proyecto le otorga al miembro 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', 'INTERNAL_SELF_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-<project-ID>@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', 'INTERNAL_SELF_MANAGED'])
              )
                  ||
              !compute.isForwardingRuleCreationOperation()
          "
      }
    }
  ]
}

Si intentas crear un nuevo servicio de GKE de tipo LoadBalancer sin la anotación para un balanceador de cargas de TCP/UDP 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, si intentas crear un objeto Ingress nuevo con el controlador de Ingress de Cloud Load Balancing cuando no hay otros otorgamientos, se mostrará un mensaje de error similar porque el controlador de Ingress de Cloud Load Balancing debe crear un balanceador de cargas de HTTP(S) externo.

En los ejemplos anteriores, los mensajes de error de GKE están disponibles mediante los comandos kubectl describe y kubectl get events -w.

Próximos pasos