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 vários 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 os de administrador do balanceador de carga ou administrador de rede, ou então papéis personalizados para criar apenas determinados tipos de balanceador de carga.

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 membro do IAM a capacidade de criar balanceadores de carga internos, mas não externos. Se esse membro do IAM 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 Balanceamento de carga HTTP(S) externo
Balanceamento de carga de proxy SSL e de proxy TCP externos
Balanceamento de carga de rede TCP/UDP externo
INTERNAL Balanceamento de carga TCP/UDP interno
INTERNAL_MANAGED Balanceamento de carga HTTP(S) interno
INTERNAL_SELF_MANAGED Traffic Director

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

O efeito dessa política é fazer com que uma mensagem de erro de permissões seja exibida se um membro tentar criar uma regra de encaminhamento com o esquema de balanceamento de carga EXTERNAL, porque o esquema EXTERNAL foi omitido.

Exemplo de política

Este exemplo de política de IAM para um projeto concede ao membro 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 membro 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', 'INTERNAL_SELF_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-<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()
          "
      }
    }
  ]
}

Sem outras concessões, a tentativa de criar um novo Serviço GKE do tipo LoadBalancer sem a anotação para um balanceador de carga TCP/UDP 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 usando o controlador do Entrada do Cloud Load Balancing (em inglês) resulta em uma mensagem de erro semelhante porque tal controlador precisa criar um balanceador de carga HTTP(S) externo.

Nos exemplos acima, é possível ver as mensagens de erro do GKE usando os comandos kubectl describe e kubectl get events -w.

A seguir