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) ao desativar os endereços IP externo das instâncias de máquina virtual (VM) do plano de controle. Neste documento, mostramos aos engenheiros de segurança como controlar o tráfego de saída do servidor de API do Kubernetes e como evitar possíveis interrupções nos webhooks de admissão.

Você já precisa conhecer os seguintes conceitos:

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 direcione 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 de API para servidores 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 de API para serviços externos, incluindo a Internet e serviços doGoogle Cloud . 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 seus 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 deixe o servidor da API usar o endereço IP para o tráfego de saída. Essa é a opção 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 de uso particular (PUPI).

Antes de começar

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

  • Ative 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 eles. Quando você desativa o tráfego de saída do servidor de 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 de API

É possível personalizar o nível de restrição para o tráfego de saída do servidor de 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 cluster, como us-central1 ou us-central1-a.
  • CONTROL_PLANE_EGRESS_MODE: o nível de restrição para o tráfego de saída do seu servidor de 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 essencial 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 seu servidor de 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 está 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á o seguinte:

    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 que você crie ou atualize configurações de webhook com o campo clientConfig.url. Se você excluir a ValidatingAdmissionPolicy, será possível 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 do cluster, tente enviar uma solicitação direta para um endereço IP fora do cluster:

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

      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 esse bypass é temporário.

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

    4. Verifique se há uma mensagem de erro como esta nos registros do servidor da API:

      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 o ValidatingAdmissionPolicy seja excluído, as solicitações de admissão não poderão alcançar um servidor webhook usando o endereço IP ou o 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. Use o campo clientConfig.service na configuração do webhook para definir uma rota alternativa que o servidor da API possa usar. Para mais informações, consulte Configuração de webhook externo.

A seguir