Marcio Cunha

Como isolar pods no Kubernetes com Network Policies e Namespaces

Descubra como estruturar fronteiras de segurança rígidas e bloquear tráfego indesejado entre aplicações no mesmo cluster usando recursos nativos do Kubernetes.

Marcio Cunha•7 min
Também disponível em:EnglishEspañol
Resumo
  • Namespaces criam divisões lógicas no cluster, mas não impedem que pods troquem pacotes de rede por padrão.
  • Network Policies funcionam como paredes e cancelas eletrônicas que filtram o tráfego IP no nível de cada pod.
  • A ausência de políticas restritivas deixa todas as cargas de trabalho expostas a invasões laterais caso um serviço seja comprometido.
  • O uso combinado de seletores de rótulos permite liberar portas específicas apenas para microsserviços autorizados.
  • O monitoramento de erros de conexão ajuda a validar se as regras de firewall interno estão bloqueando o fluxo legítimo.

Por que o isolamento de rede nativo no Kubernetes é uma ilusão perigosa

Quando criamos um cluster de computadores para gerenciar nossos programas usando o Kubernetes, a ferramenta que nos ajuda a organizar tudo se chama Namespace, que funciona basicamente como uma pasta ou um armário separado para guardar projetos diferentes. Muita gente assume que, se colocar uma aplicação de pagamentos no armário financeiro e um blog público no armário de marketing, eles viverão em mundos totalmente isolados. Na prática, por padrão, o Kubernetes permite que qualquer programa converse com qualquer outro programa em qualquer armário, criando uma rede aberta onde um invasor que roube a senha de uma aplicação simples consegue fuçar o banco de dados de clientes inteiros.

Essa facilidade inicial de comunicação existe para que equipes não percam tempo configurando firewalls logo no primeiro dia de testes. Porém, quando o sistema cresce e vai para a produção real, deixar as portas escancaradas é um convite para desastres de segurança. Se um painel administrativo antigo for invadido, o criminoso ganha passe livre para transitar pela rede interna até achar dados sensíveis. É justamente para resolver essa vulnerabilidade silenciosa que precisamos entender como impor barreiras físicas e lógicas usando ferramentas nativas de filtragem.

Para quem já gerencia infraestruturas complexas e precisa garantir a estabilidade geral, aplicar essas travas de segurança se assemelha aos cuidados que tomamos ao usar o Istio para criptografar tráfego mTLS no Kubernetes, garantindo que nenhum pacote circule sem identificação criptográfica. O objetivo central é transformar uma rede totalmente aberta em um ambiente onde cada conversa precisa de autorização prévia e explícita, reduzindo drasticamente o raio de estrago caso algum contêiner seja invadido por hackers ou apresente falhas graves.

O papel dos Namespaces na organização lógica e suas limitações

Os Namespaces dividem o cluster em ambientes administrativos separados, permitindo que equipes diferentes criem objetos com os mesmos nomes sem brigar por espaço. Imagine um prédio de escritórios onde cada andar pertence a uma empresa diferente; os corredores e elevadores são os mesmos, mas as salas têm portas trancadas. No entanto, no Kubernetes, as paredes entre essas salas são feitas de vidro translúcido: qualquer um pode bater papo com o vizinho do lado usando o endereço IP interno do pod, ignorando completamente o fato de estarem em namespaces distintos.

Na prática, isso significa que criar um namespace chamado 'producao' e outro 'homologacao' não impede que uma máquina de testes mande comandos maliciosos para o banco de produção. Essa confusão comum pega muita gente de surpresa na primeira auditoria de segurança. O namespace serve para organizar cotas de consumo de memória, separar permissões de acesso de usuários e evitar conflitos de nomes, mas ele falha miseravelmente quando o assunto é impedir que pacotes de rede viajem de um lado para o outro.

Para fechar essas frestas e impedir o tráfego lateral indesejado, precisamos recorrer a um segundo mecanismo de defesa que atua diretamente na camada de rede, controlando o tráfego porta por porta. O segredo para uma arquitetura robusta está em combinar a organização limpa dos namespaces com regras rígidas de tráfego, criando zonas de confiança bem delimitadas dentro da mesma infraestrutura compartilhada.

Como funcionam as Network Policies para blindar seus pods

As Network Policies são regras de firewall aplicadas diretamente no nível de cada pod, decidindo quem pode entrar (tráfego de entrada, conhecido como ingress) e quem pode sair (tráfego de saída, egress). Pense nelas como a portaria de um condomínio fechado onde a lista de convidados é atualizada em tempo real: mesmo que alguém saiba o endereço exato do seu apartamento, o segurança na entrada só vai deixar passar quem estiver com o nome na lista autorizada.

Por padrão, quando nenhuma regra é aplicada a um namespace, o tráfego é totalmente livre. No entanto, assim que você cria a primeira política de negação padrão, o comportamento muda radicalmente: tudo é bloqueado, e você passa a liberar apenas o que for estritamente necessário para o funcionamento do sistema. Essa abordagem, conhecida como 'deny-all', é a fundação de qualquer estratégia séria de segurança cibernética em ambientes modernos de computação em nuvem.

O controle é feito através de seletores de rótulos (labels), que funcionam como crachás colados nos pods. Você pode dizer, por exemplo, que apenas os pods rotulados com 'app=frontend' têm permissão para chamar os pods do 'app=api-backend' na porta 8080. Qualquer outra tentativa de conexão vinda de fora desse grupo é sumariamente ignorada pelo sistema de rede subjacente do cluster.

Criando a primeira política de negação padrão passo a passo

Antes de abrir portas específicas para serviços conversarem, o ideal é trancar a casa inteira para garantir que nenhum tráfego não autorizado passe despercebido. Vamos criar uma regra que bloqueia todo o tráfego de entrada em um namespace específico, servindo como base segura para as liberações posteriores que faremos logo em seguida.

Execute os passos abaixo na sua máquina para aplicar essa barreira inicial de segurança usando um arquivo de configuração padrão:

  1. Abra o seu terminal e crie um arquivo chamado deny-all.yaml usando seu editor de texto favorito.
  2. Cole a estrutura básica de bloqueio total de entrada que garante o isolamento completo do namespace.
  3. Aplique o arquivo no seu cluster executando o comando de criação do Kubernetes na linha de comando.
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default-deny-ingress
  namespace: meu-namespace-seguro
spec:
  podSelector: {}
  policyTypes:
  - Ingress

Na prática, isso significa que qualquer tentativa de comunicação externa com os pods deste namespace será rejeitada imediatamente, a menos que uma regra complementar seja criada para abrir exceções pontuais. É o equivalente digital a trocar todas as fechaduras de um prédio e recolher as chaves antigas antes de entregar cópias novas apenas para os moradores autorizados.

Liberando tráfego seletivo entre microsserviços com segurança

Com o bloqueio geral ativo, suas aplicações ficarão incomunicáveis até que você defina quem pode falar com quem. Para permitir que o frontend converse com o banco de dados ou com a API interna, criamos uma nova regra que autoriza o tráfego apenas para os rótulos corretos e nas portas específicas que o serviço utiliza para escutar requisições legítimas.

Essa granularidade evita que um aplicativo comprometido na mesma infraestrutura consiga varrer portas vizinhas em busca de vulnerabilidades abertas. O tráfego passa a ser um contrato estrito: o pod de origem precisa ter a etiqueta certa e a porta de destino precisa estar explicitamente liberada no manifesto da política de rede.

Manter essa disciplina de configuração evita dores de cabeça futuras, funcionando de forma parecida com a organização de processos que discutimos ao gerenciar segredos em produção com HashiCorp Vault, onde cada aplicação enxerga apenas o que é estritamente necessário para rodar. Nenhuma carga de trabalho deve ter superpoderes de acesso à rede se a sua função comercial não exige tal liberdade.

Erros comuns e armadilhas ao configurar políticas de rede

Um dos erros mais comuns ao implementar Network Policies é esquecer que a resolução de nomes (DNS) precisa de tráfego liberado para funcionar corretamente. Se você bloquear todo o tráfego de saída (egress) sem liberar as consultas para o servidor DNS interno do cluster (geralmente rodando na porta 53 do namespace kube-system), suas aplicações pararão de responder porque simplesmente não conseguirão encontrar os endereços IP dos outros serviços.

Outra armadilha frequente é assumir que qualquer plugin de rede do Kubernetes suporta políticas nativamente. Se o seu cluster estiver rodando com uma infraestrutura de rede básica que não implementa a especificação de Network Policies (como algumas configurações antigas do Flannel), as regras simplesmente serão ignoradas em silêncio, dando uma falsa sensação de segurança enquanto tudo continua totalmente vulnerável.

Para evitar surpresas desagradables em ambientes produtivos, sempre valide suas regras usando ferramentas de teste de conectividade, como disparar requisições temporárias de um pod de teste para verificar se o bloqueio está funcionando conforme o planejado. A verificação constante garante que alterações de infraestrutura não derrubem silenciosamente a comunicação essencial entre os serviços do sistema.

Considerações finais sobre isolamento e segurança em clusters

Isolar cargas de trabalho no Kubernetes usando Namespaces e Network Policies deixou de ser um luxo para se tornar o requisito mínimo de sobrevivência em arquiteturas modernas. Dividir ambientes em pastas lógicas organiza a casa, mas são as regras rígidas de tráfego que constroem as muralhas de verdade contra invasões laterais e movimentos maliciosos dentro da rede interna.

Adotar uma postura de segurança baseada em negação padrão exige planejamento e testes rigorosos, mas o retorno sobre o esforço é a tranquilidade de saber que um incidente isolado não comprometerá o ecossistema inteiro. Mantenha suas políticas auditadas, documente as exceções necessárias e trate a rede do seu cluster com o mesmo rigor de um datacenter físico tradicional.