Configurar uma extensão de autorização

Com o Service Extensions, os balanceadores de carga de aplicativo podem enviar chamadas para serviços de back-end e inserir processamento personalizado no caminho de processamento. As extensões de autorização são executadas no caminho de processamento de solicitações quando o balanceador de carga recebe cabeçalhos de solicitação e depois que o mapa de URL escolhe o serviço de back-end. Nesta página, descrevemos como configurar extensões de autorização para usar um mecanismo de autorização personalizado definido em uma política de autorização.

Para uma visão geral das extensões do balanceador de carga de aplicativo, consulte Visão geral das extensões do Cloud Load Balancing.

Introdução

Com o Cloud Load Balancing, é possível configurar políticas de autorização que aplicam o controle de acesso ao tráfego que entra nos balanceadores de carga. Às vezes, decisões complexas de autorização não podem ser expressas facilmente usando uma política de autorização.

É possível configurar políticas de autorização com extensões para delegar decisões de autorização a mecanismos personalizados. No caminho de dados, as extensões de autorização são executadas após as extensões de rota, mas antes das extensões de tráfego. Para mais informações sobre políticas de autorização, consulte Visão geral da política de autorização.

Para cada solicitação de autorização, o proxy encaminha os cabeçalhos de solicitação para a extensão. Dependendo da resposta do provedor, o proxy encaminha ou rejeita a solicitação.

No pré-lançamento, para balanceadores de carga de aplicativo externos regionais e balanceadores de carga de aplicativo internos regionais, é possível configurar extensões de autorização separadamente para políticas de autorização de solicitação e políticas de autorização de conteúdo. As extensões baseadas em políticas de autorização de solicitação são configuradas para serem executadas antes daquelas baseadas em políticas de autorização de conteúdo.

Para informações sobre os limites relacionados às extensões do balanceador de carga de aplicativo, consulte a página Cotas e limites.

Configurar uma extensão de autorização básica

O exemplo a seguir mostra como configurar uma extensão de autorização, my-authz-ext, com uma política de autorização para delegar decisões de autorização para um balanceador de carga de aplicativo externo global.

gcloud

  1. Crie os recursos necessários, conforme descrito em Configurar um serviço de back-end de callout.

    Para este exercício, crie um balanceador de carga de aplicativo externo global. Nomeie o serviço como authz-service e a regra de encaminhamento como fr1.

  2. Configure a extensão de autorização.

    1. Defina a extensão em um arquivo YAML que a associa ao serviço de back-end, authz-service. Use os valores de amostra fornecidos.

      cat >authz-extension.yaml <<EOF
          name: my-authz-ext
          authority: ext11.com
          loadBalancingScheme: EXTERNAL_MANAGED
          service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/authz-service
          forwardHeaders:
            - Authorization
          failOpen: false
          timeout: "0.1s"
          forwardAttributes:
          - request.mcp_param
          - connection.client_cert_leaf
      EOF
      

      Substitua PROJECT_ID pelo ID do projeto.

      Para mais informações sobre os campos no arquivo YAML, consulte ExtensionChain na documentação da API. Para informações sobre atributos compatíveis, consulte Atributos compatíveis.

    2. Importe a extensão de autorização. Use o comando gcloud service-extensions authz-extensions import com os seguintes valores de exemplo.

      gcloud service-extensions authz-extensions import my-authz-ext \
          --source=authz-extension.yaml \
          --location=global
      

      Se você quiser definir o protocolo como ext_authz, use o comando gcloud beta service-extensions authz-extensions import.

  3. Configure uma política de autorização com a extensão.

    1. Defina uma política de autorização que associe a extensão my-authz-ext à regra de encaminhamento fr1. Use os valores de amostra fornecidos. A ação CUSTOM indica que uma extensão está sendo usada.

      cat >authz-policy.yaml <<EOF
          name: my-authz-policy
          target:
            loadBalancingScheme: EXTERNAL_MANAGED
            resources:
              - "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/forwardingRules/fr1"
          action: CUSTOM
          customProvider:
            authzExtension:
              resources:
                - "projects/PROJECT_ID/locations/global/authzExtensions/my-authz-ext"
      EOF
      
    2. Importe a política de autorização para o projeto. Use o comando gcloud network-security authz-policies import com os seguintes valores de exemplo.

      gcloud network-security authz-policies import my-authz-policy \
          --source=authz-policy.yaml \
          --location=global
      

Configurar extensões de autorização com base em perfis

É possível configurar extensões de autorização separadamente para políticas de autorização de solicitação e de conteúdo.

Para uma política de autorização de solicitação

O exemplo a seguir mostra como configurar uma extensão de autorização que aplica uma política de autorização de solicitação a uma regra de encaminhamento em us-west1. A política exige que o tráfego passe pela autenticação TLS mútua de um principal específico antes de chegar ao destino, example.com/mcp.

gcloud

  1. Configure um serviço de back-end de callout chamado lb-request-authz-service em us-west1 com uma regra de encaminhamento chamada fr2.

    Para o serviço, configure um balanceador de carga de aplicativo externo regional com back-ends de grupos de instâncias de VM.

  2. Configure a extensão de autorização.

    1. Defina a extensão em um arquivo YAML que associa a extensão ao serviço de back-end, lb-request-authz-service. Use os valores de amostra fornecidos.

      cat >lb-request-authz-extension.yaml <<EOF
      name: my-lb-request-authz-ext
      authority: ext11.com
      loadBalancingScheme: INTERNAL_MANAGED
      service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/backendServices/lb-authz-request-service
      forwardHeaders:
        - Authorization
      failOpen: false
      timeout: "0.1s"
      wireFormat: EXT_AUTHZ_GRPC
      EOF
      

      Substitua PROJECT_ID pelo ID do projeto.

      A extensão precisa estar na mesma região do seu serviço de back-end.

      Por padrão, todas as chamadas de Service Extensions usam o protocolo Envoy External Processing ou ext_proc. No caso de callouts de autorização, o protocolo de autorização externa ou ext_authz também é compatível com o Pré-lançamento. Quando a opção wireFormat é definida como EXT_AUTHZ_GRPC, a callout usa o protocolo ext_authz. Se a opção não for especificada, a nota explicativa vai usar o protocolo ext_proc.

      Para políticas de autorização de solicitação, o valor wireFormat pode ser EXT_AUTHZ_GRPC para que a callout use o protocolo ext_authz, embora o protocolo ext_proc também seja compatível.

      Por padrão, failOpen é definido como false. Se a extensão atingir o tempo limite ou falhar, o processamento da solicitação será interrompido. Essa opção padrão é preferível quando a prioridade é a segurança ou a integridade em vez da disponibilidade.

    2. Importe a extensão de autorização. Use o comando gcloud beta service-extensions authz-extensions import com os seguintes valores de amostra.

      gcloud beta service-extensions authz-extensions import my-lb-request-authz-ext \
          --source=lb-request-authz-extension.yaml \
          --location=us-west1
      
  3. No mesmo projeto, configure uma política de autorização com a extensão.

    Para qualquer solicitação a example.com/mcp, a política exige autenticação TLS mútua de uma principal específica e delega ainda mais a decisão de autorização à extensão de autorização, my-lb-authz-request-ext.

    1. Defina uma política de autorização que associe a extensão my-lb-request-authz-ext à regra de encaminhamento fr2. Use os valores de amostra fornecidos.

      cat >lb-request-authz-policy.yaml <<EOF
      name: my-lb-request-authz-policy
      target:
        resources:
          - "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/forwardingRules/fr2"
      policyProfile: REQUEST_AUTHZ
      httpRules:
      - to:
          operations:
          - hosts:
            - exact: "example.com"
          - paths:
            - prefix: "/mcp"
        from:
          sources:
          - principals:
            - principal_selector: CLIENT_CERT_DNS_NAME_SANS
              principal:
                exact: "spiffe://p.global.123.workload.id.goog/ns/ns1/sa/hellomcp"
      action: CUSTOM
      customProvider:
        authzExtension:
          resources:
            - "projects/PROJECT_ID/locations/us-west1/authzExtensions/my-lb-request-authz-ext"
      EOF
      

      Para políticas de autorização de solicitação, o valor de policyProfile precisa ser REQUEST_AUTHZ. Esse valor indica que o provedor de política personalizada age em solicitações para permitir ou negar tráfego.

      A ação CUSTOM indica que uma extensão está associada ao proxy.

      Para mais informações sobre um recurso de política de autorização, consulte a documentação de referência do authzPolicy.

    2. Importe a política de autorização para o projeto. Use o comando gcloud beta network-security authz-policies import com os seguintes valores de exemplo.

      gcloud beta network-security authz-policies import my-lb-request-authz-policy \
          --source=lb-request-authz-policy.yaml \
          --location=us-west1
      

Para uma política de autorização de conteúdo

O exemplo a seguir mostra como configurar uma extensão de autorização que aplica uma política de autorização de conteúdo a uma regra de encaminhamento em us-west1. A política exige um serviço de limpeza de conteúdo para realizar uma inspeção detalhada dos payloads de aplicativos e permitir ou negar solicitações ou alterar as solicitações e respostas, conforme necessário.

gcloud

  1. Configure um serviço de back-end de callout chamado lb-content-authz-service em us-west1 com uma regra de encaminhamento chamada fr3.

    Para o serviço, configure um balanceador de carga de aplicativo externo regional com back-ends de grupos de instâncias de VM.

    Configure o servidor de extensão com o protocolo ext_proc no FULL_DUPLEX_STREAMED modo de processamento de corpo e compatível com todos os eventos.

  2. Configure a extensão de autorização.

    1. Defina a extensão em um arquivo YAML que associa a extensão ao serviço de back-end, lb-content-authz-service. Use os valores de amostra fornecidos.

      cat >lb-content-authz-extension.yaml <<EOF
      name: my-lb-content-authz-ext
      authority: ext11.com
      loadBalancingScheme: INTERNAL_MANAGED
      service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/backendServices/lb-authz-sdp-service
      failOpen: false
      timeout: "0.1s"
      EOF
      

      Para políticas de autorização de conteúdo, o valor de policyProfile precisa ser CONTENT_AUTHZ.

      Para políticas de CONTENT_AUTHZ, o valor de wireFormat não precisa ser definido explicitamente como EXT_PROC_GRPC. Por padrão, a callout usa o protocolo ext_proc.

    2. Importe a extensão de autorização. Use o comando gcloud beta service-extensions authz-extensions import com os seguintes valores de exemplo.

      gcloud beta service-extensions authz-extensions import my-lb-content-authz-ext \
          --source=lb-content-authz-extension.yaml \
          --location=us-west1
      
  3. Configure uma política de autorização com a extensão.

    1. Defina uma política de autorização que associe a extensão my-lb-content-authz-ext à regra de encaminhamento, fr3. Use os valores de amostra fornecidos.

      cat >lb-content-authz-policy.yaml <<EOF
      name: lb-content-authz-policy
      target:
        resources:
          - "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/forwardingRules/fr3"
      policyProfile: CONTENT_AUTHZ
      httpRules:
      - to:
          operations:
          - hosts:
            - exact: "example.com"
          - paths:
            - prefix: "/sensitive-stuff"
      action: CUSTOM
      customProvider:
        authzExtension:
          resources:
            - "projects/PROJECT_ID/locations/us-west1/authzExtensions/my-lb-authz-content-ext"
      EOF
      

      O valor de policyProfile precisa ser CONTENT_AUTHZ.

    2. Importe a política de autorização para o projeto. Use o comando gcloud beta network-security authz-policies import com os seguintes valores de exemplo.

      gcloud beta network-security authz-policies import my-lb-content-authz-policy \
          --source=lb-content-authz-policy.yaml \
          --location=us-west1
      

Limitações para extensões de autorização

Confira algumas limitações das extensões de autorização:

  • Uma política de autorização pode ter apenas uma extensão de autorização.
  • Uma regra de encaminhamento pode ser usada com várias políticas de autorização, mas apenas uma delas pode ser personalizada.

Para limitações aplicáveis a todas as extensões, consulte Limitações das extensões.

A seguir