Condições do IAM para regras de encaminhamento

As Condições de gerenciamento de identidade e acesso (IAM, na sigla em inglês) permitem definir políticas do IAM com concessões condicionais. As condições são especificadas nas vinculações de papéis da política do IAM de um recurso. Se houver uma condição, o papel será concedido somente quando a expressão condicional for considerada true. Cada expressão condicional é um conjunto de instruções lógicas, permitindo que você especifique um ou mais atributos. Para mais informações, consulte a referência de atributo para condições do IAM.

Quando usadas com o Cloud Load Balancing, as condições do IAM permitem que você conceda condicionalmente papéis predefinidos, como administrador do balanceador de carga ou administrador da rede, ou papéis personalizados.

As Condições do IAM aceitam expressões condicionais para verificar o esquema de balanceamento de carga de uma regra de encaminhamento. Por exemplo, você pode conceder condicionalmente a um principal do IAM a capacidade de criar balanceadores de carga internos, mas não externos. Se esse principal tentar criar uma regra de encaminhamento para um balanceador de carga externo, o Google Cloud negará a ação e retornará um erro como o 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'

Como usar condições do IAM nos balanceadores de carga do Google Cloud

O esquema de balanceamento de carga de uma regra de encaminhamento determina quais os tipos de balanceador de carga podem usá-la. Em outras palavras, o esquema de balanceamento de carga corresponde ao tipo de balanceador de carga, como mostrado na tabela a seguir.

Esquema de balanceamento de carga Descrição
EXTERNAL Balanceador de carga de rede do aplicativo clássico
Balanceador de carga de rede de proxy clássico
Balanceador de carga de rede de passagem externa
EXTERNAL_MANAGED Balanceador de carga de aplicativo externo global
Balanceador de carga de rede de proxy externo global
Balanceador de carga de aplicativo externo regional
Balanceador de carga de rede de proxy externo regional
INTERNAL Balanceador de carga de rede de passagem interno
INTERNAL_MANAGED Balanceador de carga de aplicativo interno regional
Balanceador de carga de rede de proxy interno regional
Balanceador de carga de aplicativo interno entre regiões
Balanceador de carga de rede de proxy interno entre regiões
INTERNAL_SELF_MANAGED Cloud Service Mesh

Especifique o campo loadBalancingScheme quando você criar o balanceador de carga. Ao verificar o campo loadBalancingScheme em uma condição do IAM, é possível conceder aos principais a capacidade de criar determinados tipos de balanceadores de carga.

Como especificar condições do IAM

Você pode definir vinculações de papéis condicionais usando o mesmo método setIamPolicy utilizado para configurar outras vinculações de papéis. Para definir uma vinculação de papel com uma condição em um projeto, use a API REST, a ferramenta de linha de comando gcloud ou a página do IAM no console do Google Cloud.

Para mais informações, consulte Como gerenciar políticas condicionais.

Exemplo de expressões condicionais para balanceamento de carga

A expressão de condição a seguir, que pode ser usada em uma política do IAM, permite uma solicitação de API somente se uma das seguintes condições for verdadeira:

  • A solicitação não envolve a criação de uma regra de encaminhamento.
  • A solicitação é para criar uma regra de encaminhamento que tenha um dos esquemas internos de balanceamento de carga.

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

O esquema de balanceamento de carga EXTERNAL foi omitido. Se um principal tentar criar uma regra de encaminhamento com o esquema de balanceamento de carga EXTERNAL, uma mensagem de erro de permissão será exibida.

Exemplo de política

Este exemplo de política de IAM para um projeto concede ao principal do IAM jane@example.com o papel predefinido de administrador do balanceador de carga, com exceção da capacidade de criar balanceadores de carga externos, porque o esquema de balanceamento de carga EXTERNAL é omitido. O principal jane@example.com pode criar balanceadores de carga internos, bem como gerenciar, modificar e excluir qualquer um deles.

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

Como conceder permissões de conta de serviço do GKE para tipos específicos de regras de encaminhamento

Também é possível usar as Condições do IAM para limitar o acesso à conta de serviço do GKE para criar apenas tipos específicos de regras de encaminhamento.

O exemplo em JSON abaixo demonstra uma política de IAM completa que concede à conta de serviço do GKE (service-PROJECT_ID@container-engine-robot.iam.gserviceaccount.com) o papel de agente de serviço do Kubernetes Engine. Com esse papel, a conta de serviço pode criar, modificar e excluir componentes de balanceador de carga, exceto regras de encaminhamento externo.

Ao usar essa concessão condicional, a conta de serviço do GKE pode criar apenas regras de encaminhamento interno novas, mas pode gerenciar todas as que já existem.

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

Sem outras concessões, a tentativa de criar um novo Serviço GKE do tipo LoadBalancer sem a anotação de um balanceador de carga de rede de passagem interno resultará em uma mensagem de erro como esta:

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 do Entrada causa uma mensagem de erro semelhante porque o controlador de Entrada do Cloud Load Balancing precisa criar um balanceador de carga de aplicativo externo.

Mensagens de erro do GKE estão disponíveis usando os comandos kubectl describe e kubectl get events -w.

A seguir