Marcio Cunha

Vazamento de dados no Kubernetes? Como isolar workloads

Descubra como blindar seu cluster Kubernetes contra invasões laterais entre pods usando NetworkPolicies nativas. Aprenda a restringir tráfego na camada 3 e 4 com exemplos práticos.

Marcio Cunha•5 min
Também disponível em:EnglishEspañol
Resumo
  • O comportamento padrão do Kubernetes permite que qualquer pod se comunique livremente com qualquer outro pod na rede do cluster.
  • As NetworkPolicies atuam nas camadas de rede 3 e 4 do modelo OSI, controlando endereços IP, portas e protocolos de transporte.
  • A implementação de políticas de negação padrão cria um perímetro seguro onde o tráfego precisa ser explicitamente autorizado.
  • Problemas graves como pods presos em CrashLoopBackOff exigem diagnósticos rápidos para evitar brechas duradouras de segurança.
  • O isolamento adequado de namespaces impede que um ataque comprometendo uma aplicação se propague para bancos de dados críticos.

O perigo invisível da comunicação aberta entre pods no Kubernetes

Quando criamos um cluster no Kubernetes, a configuração padrão é surpreendentemente permissiva. Na prática, isso significa que qualquer pod, que é a menor unidade de computação que você gerencia e que abriga um ou mais containers, consegue falar livremente com qualquer outro pod ou serviço em qualquer namespace, que serve como uma divisão lógica para separar ambientes. Se um invasor conseguir invadir uma aplicação web exposta na internet, ele ganha passe livre para varrer a rede interna e tentar derrubar o banco de dados. É exatamente aqui que entra a necessidade urgente de implementar barreiras de segurança nas camadas inferiores da rede.

Muitas equipes confiam cegamente na segurança do perímetro da nuvem e esquecem que a movimentação lateral dentro do cluster é um dos vetores favoritos de ataque. Para mitigar esse risco de forma eficiente, a engenharia de redes precisa olhar para a camada 3 e 4 do modelo OSI, controlando endereços IP, portas TCP e UDP. Assim como tratamos problemas complexos de infraestrutura, a exemplo de quando investigamos por que pods ficam presos em CrashLoopBackOff ou quando lidamos com a limitação de CPU usando cgroups no Docker, a segurança de rede exige rigor técnico, previsibilidade e testes constantes para garantir que nenhuma brecha permaneça aberta.

O que são NetworkPolicies e como elas blindam seu cluster

As NetworkPolicies são regras declarativas nativas do Kubernetes que funcionam como um firewall inteligente para os seus pods. Na prática, elas utilizam seletores baseados em rótulos, conhecidos como labels, para decidir quais conexões entram e saem de um determinado conjunto de pods. Quando você aplica uma política de negação padrão, conhecida como default deny, o cluster passa a bloquear todo o tráfego por padrão, exigindo que você crie regras específicas para liberar apenas o estritamente necessário. Isso transforma uma rede totalmente aberta em um ambiente segmentado e de menor privilégio.

Para entender o funcionamento técnico, imagine o tráfego de rede como um prédio comercial onde as portas estão destrancadas. Sem uma NetworkPolicy, qualquer pessoa pode entrar em qualquer sala. Com a política ativa, cada porta exige um crachá específico baseado em quem está chamando e qual porta de serviço está sendo acessada. Essa abordagem protege aplicações sensíveis contra varreduras maliciosas e impede que um vazamento de credenciais em um serviço menor comprometa o ecossistema inteiro de microsserviços. O ganho de segurança compensa amplamente o esforço operacional de configuração.

Criando sua primeira regra de isolamento na camada 3 e 4

A implementação prática de uma NetworkPolicy exige atenção aos seletores de namespace e de pods para garantir precisão cirúrgica. Abaixo, apresentamos um manifesto YAML funcional que bloqueia todo o tráfego de entrada em um namespace específico, permitindo apenas que um pod de frontend converse com o banco de dados na porta 5432. Esse é um excelente ponto de partida para blindar ambientes produtivos contra acessos não autorizados de pods vizinhos que não deveriam enxergar dados confidenciais.

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: isolar-banco-de-dados
  namespace: producao
spec:
  podSelector:
    matchLabels:
      app: postgresql
  policyTypes:
  - Ingress
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: frontend
    ports:
    - protocol: TCP
      port: 5432

Neste manifesto, o bloco podSelector identifica o alvo da regra, que neste caso é o banco de dados rotulado como app: postgresql. O bloco ingress define estritamente quem tem permissão para entrar, limitando a origem aos pods rotulados como app: frontend e restringindo o protocolo de transporte estritamente à porta TCP 5432. Qualquer tentativa de conexão vinda de outra origem ou porta será descartada silenciosamente pelo plugin de rede do cluster, garantindo a integridade e o sigilo das informações armazenadas.

Armadilhas comuns e o papel crucial do CNI no Kubernetes

Um erro clássico cometido por administradores iniciantes é aplicar NetworkPolicies sem verificar se o CNI, que é a interface de rede do container responsável por implementar as regras de conectividade no nível do nó, oferece suporte a essa funcionalidade. Plugins básicos de rede como o kubenet padrão em alguns ambientes simples simplesmente ignoram essas políticas sem gerar nenhum aviso de erro, deixando o operador com uma falsa sensação de segurança. Para que o isolamento funcione de verdade, você precisa utilizar CNI robustos e compatíveis, como Calico, Cilium ou Flannel com suporte a políticas ativado.

Outro ponto crítico de atenção diz respeito ao tráfego de saída, conhecido como Egress. Se você configurar apenas o tráfego de entrada, as aplicações ainda poderão fazer requisições arbitrárias para fora do namespace, o que pode abrir brechas para exfiltração de dados para servidores externos controlados por atacantes. O planejamento de segurança de rede deve abranger tanto a entrada quanto a saída, estabelecendo perímetros rígidos que dificultem qualquer tentativa de comunicação lateral indesejada ou vazamento de informações sigilosas para a internet pública.

Validando e testando o isolamento de tráfego na prática

Depois de aplicar suas políticas de rede, nunca assuma que elas funcionam perfeitamente sem realizar testes práticos de validação. A maneira mais simples e direta de testar o bloqueio é criar um pod temporário com ferramentas de linha de comando como o curl ou netcat dentro de um namespace não autorizado e tentar alcançar o serviço protegido. Se o tráfego for cortado com sucesso, a conexão ficará travada aguardando tempo limite ou retornará um erro de conexão recusada, confirmando que o firewall do cluster está cumprindo seu papel adequadamente.

Manter essa rotina de testes deve fazer parte do ciclo de vida de entrega contínua da sua infraestrutura, integrando verificações de segurança sempre que houver alterações nas regras de roteamento. Quando unimos uma rede rigorosamente segmentada a boas práticas de observabilidade e controle de recursos, transformamos o Kubernetes em um ambiente resiliente e preparado para resistir a incidentes graves de segurança, protegendo os dados dos usuários e a reputação da empresa contra ameaças persistentes.