Condições do IAM para regras de encaminhamento

As condições de gestão de identidade e de acesso (IAM) permitem-lhe definir políticas de IAM com concessões condicionais. Especifica condições nas associações de funções da política de IAM de um recurso. Se existir uma condição, a função só é concedida quando a expressão de condição é avaliada como true. Cada expressão de condição é um conjunto de declarações lógicas que lhe permite especificar um ou vários atributos. Para mais informações, consulte a Referência de atributos para condições do IAM.

Quando usadas com o Cloud Load Balancing, as condições do IAM permitem-lhe conceder condicionalmente funções predefinidas, como administrador do equilibrador de carga ou administrador de rede, ou funções personalizadas.

As condições da IAM suportam uma expressão de condição para verificar o esquema de balanceamento de carga de uma regra de encaminhamento. Por exemplo, pode conceder condicionalmente a um principal do IAM a capacidade de criar balanceadores de carga internos, mas não externos. Se esse principal do IAM tentar criar uma regra de encaminhamento para um balanceador de carga externo,Google Cloud nega a ação e devolve um erro semelhante ao seguinte:

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'

Usar condições da IAM em Google Cloud balanceadores de carga

O esquema de balanceamento de carga de uma regra de encaminhamento determina que tipo ou tipos de balanceador de carga podem usar a regra de encaminhamento. Por outras palavras, o esquema de balanceamento de carga corresponde ao tipo de balanceador de carga, conforme apresentado na tabela seguinte.

Esquema de balanceamento de carga Descrição
EXTERNO Balanceador de carga de aplicações clássico
Balanceador de carga de rede de proxy clássico
Balanceador de carga de rede de passagem externo
EXTERNAL_MANAGED Balanceador de carga de aplicações externo global
Balanceador de carga de rede de proxy externo global
Balanceador de carga de aplicações externo regional
Balanceador de carga de rede de proxy externo regional
INTERNO Balanceador de carga de rede de encaminhamento interno
INTERNAL_MANAGED Balanceador de carga de aplicações interno regional
Balanceador de carga de rede de proxy interno regional
Balanceador de carga de aplicações interno entre regiões
Balanceador de carga de rede de proxy interno entre regiões
INTERNAL_SELF_MANAGED Cloud Service Mesh

Especifica o campo loadBalancingScheme quando cria o balanceador de carga. Ao selecionar o campo loadBalancingScheme numa condição de IAM, pode conceder aos responsáveis a capacidade de criar determinados tipos de equilibradores de carga.

Especificar condições do IAM

Pode definir associações de funções condicionais através do mesmo método setIamPolicy que usa para configurar quaisquer outras associações de funções. Para definir uma associação de funções com uma condição num projeto, pode usar a API REST, a ferramenta de linha de comandos gcloud ou a página IAM na consola Google Cloud .

Para mais informações, consulte o artigo Gerir políticas condicionais.

Exemplos de expressões de condições para o balanceamento de carga

A seguinte expressão de condição, que pode ser usada numa política do IAM, permite um pedido de API apenas se uma das seguintes opções for verdadeira:

  • O pedido não envolve a criação de uma regra de encaminhamento.
  • O pedido destina-se a criar uma regra de encaminhamento que tenha um dos esquemas de balanceamento de carga internos.

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

O esquema de balanceamento de carga EXTERNAL é omitido. Se um principal tentar criar uma regra de encaminhamento com o esquema de balanceamento de carga EXTERNAL, é apresentada uma mensagem de erro de autorizações.

Exemplo de política

Este exemplo de política de IAM para um projeto concede ao principal do IAM jane@example.com a função predefinida de administrador do balanceador de carga, excluindo a capacidade de criar balanceadores de carga externos (porque o esquema de balanceamento de carga EXTERNAL é omitido). jane@example.com pode criar balanceadores de carga internos e gerir, modificar e eliminar qualquer balanceador de carga.

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

Conceder autorizações de contas de serviço do GKE para tipos específicos de regras de encaminhamento

Também pode usar as condições do IAM para limitar o acesso da conta de serviço do GKE à criação apenas de tipos específicos de regras de encaminhamento.

Este exemplo JSON demonstra uma política IAM completa para conceder à conta de serviço do GKE (service-PROJECT_ID@container-engine-robot.iam.gserviceaccount.com) a função de agente do serviço do Kubernetes Engine. Esta função permite à conta de serviço criar, modificar e eliminar componentes do equilibrador de carga, exceto regras de encaminhamento externas.

Com esta concessão condicional, a conta de serviço do GKE só pode criar regras de encaminhamento interno novas, mas pode gerir todas as regras de encaminhamento 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()
          "
      }
    }
  ]
}

Na ausência de outras concessões, a tentativa de criar um novo serviço GKE do tipo LoadBalancer, sem a anotação para um Network Load Balancer de encaminhamento interno, resulta numa mensagem de erro semelhante à seguinte:

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

Além disso, sem outras concessões, a tentativa de criar um novo objeto Ingress gera uma mensagem de erro semelhante porque o controlador Ingress do Cloud Load Balancing tem de criar um Application Load Balancer externo.

As mensagens de erro do GKE estão disponíveis através dos comandos kubectl describe e kubectl get events -w.

O que se segue?