Restringir o tráfego de saída do servidor de API

É possível melhorar a segurança do plano de controle do Google Kubernetes Engine (GKE) desativando os endereços IP externo das instâncias de máquina virtual (VM) do plano de controle. Este documento mostra aos engenheiros de segurança como controlar o tráfego de saída do servidor da API Kubernetes e como evitar possíveis interrupções nos webhooks de admissão.

Você já precisa estar familiarizado com o seguinte:

Níveis de restrição

É possível especificar um dos seguintes níveis de restrição ao criar ou atualizar um cluster:

  • Sem tráfego (NONE): desative o endereço IP externo de cada instância de VM do plano de controle e encaminhe todo o tráfego de saída do servidor da API para um buraco negro. Esse nível de restrição tem os seguintes efeitos:
    • O GKE bloqueia o tráfego de saída direto do servidor da API para servidores de webhook de admissão que são executados fora do cluster. Todos os webhooks de admissão que usam um URL ou endereço IP para entrar em contato com o servidor de webhook são afetados.
    • O GKE bloqueia qualquer tráfego de saída direto do servidor da API para serviços externos, incluindo a Internet e Google Cloud serviços. O tráfego para autenticação do GKE e para componentes do sistema, como o servidor de metadados, não é afetado.
    • Outros tipos de tráfego de saída, como tráfego crítico do sistema ou tráfego dos nós, não são afetados.
    • O GKE usa uma ValidatingAdmissionPolicy para rejeitar a criação ou atualizações de ValidatingWebhookConfigurations ou MutatingWebhookConfigurations que usam o campo clientConfig.url.
  • Todo o tráfego (VIA_CONTROL_PLANE): mantenha o endereço IP externo de cada instância do plano de controle e permita que o servidor da API use o endereço IP para tráfego de saída. Essa opção é a padrão no GKE.

Limitações

Se você desativar o tráfego de saída definindo o nível de restrição como NONE, o cluster não poderá usar endereços IP públicos usados de modo privado (PUPI).

Antes de começar

Antes de começar, verifique se você realizou as tarefas a seguir:

  • Ativar a API Google Kubernetes Engine.
  • Ativar a API Google Kubernetes Engine
  • Se você quiser usar a Google Cloud CLI para essa tarefa, instale e, em seguida, inicialize a CLI gcloud. Se você instalou a CLI gcloud anteriormente, instale a versão mais recente executando o comando gcloud components update. Talvez as versões anteriores da CLI gcloud não sejam compatíveis com a execução dos comandos neste documento.
  • Verifique se você tem um cluster do GKE Autopilot ou Standard que executa a versão 1.35.1-gke.1396000 ou mais recente. Também é possível criar um cluster do Autopilot.
  • Se você tiver servidores de webhook externos, verifique se está usando uma referência de serviço para entrar em contato com esses servidores. Quando você desativa o tráfego de saída do servidor da API, todos os webhooks que usam um URL para entrar em contato com o servidor de webhook falham. Os webhooks gerenciados pelo GKE não são afetados.

Personalizar o tráfego de saída do servidor da API

É possível personalizar o nível de restrição do tráfego de saída do servidor da API ao criar ou atualizar um cluster. Para atualizar um cluster atual, use a flag --control-plane-egress:

gcloud container clusters update CLUSTER_NAME \
    --location=CONTROL_PLANE_LOCATION \
    --control-plane-egress=CONTROL_PLANE_EGRESS_MODE

Substitua:

  • CLUSTER_NAME: o nome do cluster.
  • CONTROL_PLANE_LOCATION: a região ou zona do plano de controle do seu cluster, como us-central1 ou us-central1-a.
  • CONTROL_PLANE_EGRESS_MODE: o nível de restrição do tráfego de saída do servidor da API. Use um dos seguintes valores:
    • NONE: desative o endereço IP externo das instâncias de VM do plano de controle e bloqueie todo o tráfego de saída não crítico do servidor da API. O GKE impede a criação de novas configurações de webhook que usam o campo clientConfig.url.
    • VIA_CONTROL_PLANE: mantenha o endereço IP externo das instâncias de VM do plano de controle e permita o tráfego de saída do servidor da API. Esse é o valor padrão.

Verificar a restrição de tráfego de saída

Para verificar se o GKE bloqueia o tráfego de saída do servidor da API, use um dos seguintes métodos:

  • Verifique a configuração do cluster:

    gcloud container clusters describe CLUSTER_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --format='value(controlPlaneEgress)'
    

    A saída é uma das seguintes:

    • NONE: o tráfego de saída é restrito.
    • VIA_CONTROL_PLANE: o tráfego de saída não é restrito.
  • Para verificar o efeito das mudanças em novos webhooks, tente criar uma configuração de webhook que use o campo clientConfig.url:

    cat <<EOF | kubectl apply -f -
    apiVersion: admissionregistration.k8s.io/v1
    kind: MutatingWebhookConfiguration
    metadata:
      name: test-webhook-config
    webhooks:
    - name: my-webhook.example.com
      clientConfig:
        url: "https://my-webhook.example.com:9443/my-webhook-path"
    

    O resultado será assim:

    ValidatingAdmissionPolicy 'gke-restrict-webhook-url' denied request: Egress
    traffic from the API server through the control plane is disabled. As a
    result, direct API server calls to external webhook servers are blocked.
    To connect to external webhooks, update any webhook configurations that use
    clientConfig.url to use clientConfig.service instead.
    

    Essa saída indica que uma ValidatingAdmissionPolicy do GKE impede a criação ou atualização de configurações de webhook com o campo clientConfig.url. Se você excluir a ValidatingAdmissionPolicy, poderá criar ou atualizar a configuração, mas as solicitações de admissão não chegarão ao servidor de webhook.

  • Para verificar o efeito das mudanças nos webhooks atuais no cluster, tente enviar uma solicitação direta para um endereço IP fora do cluster:

    1. Ative os registros API_SERVER do cluster.
    2. Exclua a ValidatingAdmissionPolicy gke-restrict-webhook-url:

      kubectl delete validatingadmissionpolicy gke-restrict-webhook-url
      

      Ao excluir a ValidatingAdmissionPolicy, é possível criar ou atualizar configurações de webhook com o campo clientConfig.url. O cluster recria automaticamente a ValidatingAdmissionPolicy, então essa solução alternativa é temporária.

    3. No campo clientConfig.url de uma ValidatingWebhookConfiguration ou MutatingWebhookConfiguration, especifique um endereço IP ou URL para enviar solicitações. É possível usar um valor de exemplo, como http://example.com ou 203.0.113.100.

    4. Verifique os registros do servidor da API em busca de uma mensagem de erro como esta:

      Error from server (InternalError): error when creating "STDIN":
        Internal error occurred: failed calling webhook
        WEBHOOK_NAME": failed to call
        webhook: Post "WEBHOOK_URL":
        proxyconnect tcp: dial tcp: lookup master-internet-access-unavailable.localhost
        on 169.254.169.254:53: no such host
      

      Essa saída indica que, mesmo que a ValidatingAdmissionPolicy seja excluída, as solicitações de admissão não podem acessar um servidor de webhook usando o endereço IP ou URL do servidor.

Depois de desativar os endereços IP externo das instâncias de VM do plano de controle, o GKE bloqueia o tráfego para todos os webhooks que usam um URL para entrar em contato com servidores de webhook externos. É necessário usar o campo clientConfig.service na configuração do webhook para configurar uma rota alternativa para o servidor da API. Para mais informações, consulte Configuração de webhook externo.

A seguir