Docker & Kubernetes

Network Policies em Kubernetes: Isolamento de Rede entre Pods: Do Básico ao Avançado

11 min de leitura

Network Policies em Kubernetes: Isolamento de Rede entre Pods: Do Básico ao Avançado

Network Policies em Kubernetes: Isolamento de Rede entre Pods Network Policies são recursos fundamentais do Kubernetes que permitem controlar o tráfego de rede entre pods, implementando segurança em nível de microsserviços. Por padrão, o Kubernetes permite comunicação irrestrita entre todos os pods em um cluster, o que viola o princípio do menor privilégio. Com Network Policies, você define regras explícitas de entrada (ingress) e saída (egress) de tráfego, criando um modelo de segurança robusto e granular. Neste artigo, vamos explorar como as Network Policies funcionam, quando e por que utilizá-las, e como implementá-las de forma prática em seus clusters. Entender esse conceito é essencial para qualquer engenheiro que trabalha com Kubernetes em ambientes de produção. O que é uma Network Policy e Como Funciona Entendendo o Conceito Fundamental Uma Network Policy é um objeto Kubernetes que define regras de firewall para pods. Ela atua no nível de rede, controlando quais pods podem se comunicar entre si através de seletores de

<h2>Network Policies em Kubernetes: Isolamento de Rede entre Pods</h2>

<p>Network Policies são recursos fundamentais do Kubernetes que permitem controlar o tráfego de rede entre pods, implementando segurança em nível de microsserviços. Por padrão, o Kubernetes permite comunicação irrestrita entre todos os pods em um cluster, o que viola o princípio do menor privilégio. Com Network Policies, você define regras explícitas de entrada (ingress) e saída (egress) de tráfego, criando um modelo de segurança robusto e granular.</p>

<p>Neste artigo, vamos explorar como as Network Policies funcionam, quando e por que utilizá-las, e como implementá-las de forma prática em seus clusters. Entender esse conceito é essencial para qualquer engenheiro que trabalha com Kubernetes em ambientes de produção.</p>

<h2>O que é uma Network Policy e Como Funciona</h2>

<h3>Entendendo o Conceito Fundamental</h3>

<p>Uma Network Policy é um objeto Kubernetes que define regras de firewall para pods. Ela atua no nível de rede, controlando quais pods podem se comunicar entre si através de seletores de labels. Quando uma Network Policy é criada, o controlador de rede do cluster (como Calico, Weave ou Cilium) implementa essas regras no sistema operacional do nó, geralmente através de iptables ou eBPF.</p>

<p>A grande diferença entre Network Policy e um firewall tradicional é que ela trabalha com abstrações do Kubernetes (labels, namespaces) ao invés de endereços IP. Isso torna as regras portáveis e dinâmicas: mesmo que um pod seja recriado com um novo IP, a política continua aplicável porque se baseia em labels.</p>

<h3>Componentes de uma Network Policy</h3>

<p>Uma Network Policy consiste em quatro elementos principais:</p>

<ul>

<li><strong>podSelector</strong>: Define quais pods a política se aplica (usando labels)</li>

<li><strong>policyTypes</strong>: Especifica se a política controla tráfego de Ingress, Egress ou ambos</li>

<li><strong>ingress</strong>: Lista de regras que permitem tráfego de entrada</li>

<li><strong>egress</strong>: Lista de regras que permitem tráfego de saída</li>

</ul>

<p>Quando uma Network Policy é aplicada a um pod através do <code>podSelector</code>, esse pod entra em modo restritivo: por padrão, todo tráfego é bloqueado, exceto o explicitamente permitido pelas regras. Isso é importante: ausência de regra significa negação.</p>

<h2>Implementando Network Policies na Prática</h2>

<h3>Exemplo 1: Bloqueio Total com Permissão Seletiva</h3>

<p>Vamos começar com um caso simples: bloquear todo o tráfego de entrada e permitir apenas de pods específicos. Este é um padrão muito comum em produção.</p>

<pre><code class="language-yaml">apiVersion: networking.k8s.io/v1

kind: NetworkPolicy

metadata:

name: deny-all-ingress

namespace: default

spec:

podSelector: {}

policyTypes:

  • Ingress</code></pre>

<p>Essa política aplica-se a <strong>todos</strong> os pods no namespace (porque <code>podSelector: {}</code> está vazio) e nega todo tráfego de entrada. Agora, vamos permitir tráfego apenas de pods com label <code>role: frontend</code>:</p>

<pre><code class="language-yaml">apiVersion: networking.k8s.io/v1

kind: NetworkPolicy

metadata:

name: allow-from-frontend

namespace: default

spec:

podSelector:

matchLabels:

role: backend

policyTypes:

  • Ingress

ingress:

  • from:
  • podSelector:

matchLabels:

role: frontend

ports:

  • protocol: TCP

port: 8080</code></pre>

<p>Aqui, apenas pods com <code>role: backend</code> são afetados. Eles receberão tráfego TCP na porta 8080 vindo de pods com <code>role: frontend</code>. Qualquer outro tráfego é bloqueado.</p>

<h3>Exemplo 2: Controle de Egress (Saída)</h3>

<p>Nem sempre pensamos em bloquear tráfego de saída, mas é igualmente importante. Vamos criar uma política que permite que um pod de aplicação acesse apenas um banco de dados específico:</p>

<pre><code class="language-yaml">apiVersion: networking.k8s.io/v1

kind: NetworkPolicy

metadata:

name: allow-app-to-db

namespace: production

spec:

podSelector:

matchLabels:

app: myapp

policyTypes:

  • Egress

egress:

  • to:
  • podSelector:

matchLabels:

app: postgres

ports:

  • protocol: TCP

port: 5432

  • to:
  • namespaceSelector:

matchLabels:

name: kube-system

ports:

  • protocol: TCP

port: 53

  • protocol: UDP

port: 53</code></pre>

<p>Neste exemplo, o pod <code>myapp</code> pode fazer requisições saintes para:</p>

<ol>

<li>Pods <code>postgres</code> na mesma rede na porta 5432</li>

<li>Qualquer pod no namespace <code>kube-system</code> nas portas 53 (DNS)</li>

</ol>

<p>Observe que adicionamos uma regra DNS. Sem ela, o pod não conseguiria resolver nomes de domínio, mesmo podendo fazer conexões.</p>

<h3>Exemplo 3: Política com Múltiplos Critérios</h3>

<p>Políticas complexas precisam de múltiplos seletores. Vamos permitir tráfego de múltiplas origens:</p>

<pre><code class="language-yaml">apiVersion: networking.k8s.io/v1

kind: NetworkPolicy

metadata:

name: complex-policy

namespace: default

spec:

podSelector:

matchLabels:

tier: api

policyTypes:

  • Ingress
  • Egress

ingress:

  • from:
  • podSelector:

matchLabels:

role: frontend

  • namespaceSelector:

matchLabels:

environment: staging

ports:

  • protocol: TCP

port: 8080

  • from:
  • namespaceSelector: {}

ports:

  • protocol: TCP

port: 443

egress:

  • to:
  • podSelector:

matchLabels:

tier: database

ports:

  • protocol: TCP

port: 5432

  • to:
  • namespaceSelector: {}

ports:

  • protocol: TCP

port: 443

  • protocol: TCP

port: 80</code></pre>

<p>Nesta política:</p>

<ul>

<li>Pods com <code>tier: api</code> recebem tráfego na porta 8080 de pods <code>frontend</code> OU de qualquer pod em namespaces com label <code>environment: staging</code></li>

<li>Recebem tráfego na porta 443 de qualquer namespace</li>

<li>Enviam tráfego apenas para pods <code>database</code> na porta 5432 e para qualquer destino nas portas 80 e 443</li>

</ul>

<h2>Estratégias e Melhores Práticas</h2>

<h3>Começar Restritivo e Evoluir</h3>

<p>A abordagem mais segura é começar com uma &quot;deny-all&quot; policy em todos os namespaces e depois adicionar permissões conforme necessário. Muitos engenheiros fazem o oposto e perdem o controle rapidamente.</p>

<pre><code class="language-yaml">apiVersion: networking.k8s.io/v1

kind: NetworkPolicy

metadata:

name: default-deny-all

namespace: production

spec:

podSelector: {}

policyTypes:

  • Ingress
  • Egress</code></pre>

<p>Quando essa política está em vigor, nenhum pod consegue comunicar. A partir daí, você adiciona exceções necessárias. Essa abordagem garante que você está explicitamente permitindo o que precisa, não tentando negar tudo que não deveria.</p>

<h3>Usar Namespaces como Barreira</h3>

<p>Namespaces fornecem um isolamento organizacional natural. Combine-os com Network Policies para criar zonas de segurança:</p>

<pre><code class="language-yaml">apiVersion: networking.k8s.io/v1

kind: NetworkPolicy

metadata:

name: isolate-namespace

namespace: sensitive-data

spec:

podSelector: {}

policyTypes:

  • Ingress
  • Egress

ingress:

  • from:
  • namespaceSelector:

matchLabels:

name: sensitive-data

egress:

  • to:
  • namespaceSelector:

matchLabels:

name: sensitive-data

  • to:
  • podSelector:

matchLabels:

role: external-api</code></pre>

<p>Isso isola um namespace inteiro, permitindo comunicação apenas interna e com serviços externos aprovados.</p>

<h3>Debugging e Validação</h3>

<p>Para verificar se suas políticas estão funcionando, você pode testar conectividade entre pods:</p>

<pre><code class="language-bash"># Execute um pod de teste

kubectl run -it --rm debug --image=busybox --restart=Never -- sh

Dentro do pod, teste conectividade

wget -O- http://service-name:port

Verifique logs de iptables (se disponível)

kubectl exec -it pod-name -- iptables -L -n</code></pre>

<p>Uma ferramenta excelente é o <code>kube-networkpolicy-viewer</code> ou usar logs do seu CNI plugin (Calico, Cilium) para auditoria.</p>

<h2>Considerações Técnicas Importantes</h2>

<h3>Requisitos de Infraestrutura</h3>

<p>Network Policies só funcionam com CNI plugins que as suportam. Kubernetes com kubenet (padrão em alguns casos) <strong>não funciona</strong> com Network Policies. Você precisa de:</p>

<ul>

<li><strong>Calico</strong>: Excelente suporte, usa iptables/eBPF</li>

<li><strong>Cilium</strong>: Suporte avançado com eBPF, ideal para produção</li>

<li><strong>Weave</strong>: Funciona bem, bom para ambientes menores</li>

<li><strong>Kube-router</strong>: Alternativa leve</li>

</ul>

<p>Se está usando um serviço gerenciado (EKS, GKE, AKS), o provedor já oferece um CNI compatível.</p>

<h3>Performance e Impacto</h3>

<p>Network Policies baseadas em iptables podem impactar performance em clusters muito grandes com mudanças frequentes de pods. Cilium com eBPF é mais eficiente. Porém, para a maioria dos casos, o impacto é negligenciável.</p>

<p>Teste em staging antes de rollout em produção. Identifique os padrões de comunicação real:</p>

<pre><code class="language-bash"># Use ferramentas como Cilium CLI para mapear tráfego

cilium connectivity test

Ou verifique logs do seu observability stack

(Prometheus, ELK, Jaeger, etc)</code></pre>

<h2>Conclusão</h2>

<p>Network Policies são um componente essencial de uma arquitetura Kubernetes segura. Os três pontos principais que você deve levar deste artigo são:</p>

<ol>

<li><strong>Princípio do Menor Privilégio</strong>: Comece negando tudo e permita apenas o necessário. Isso previne vazamentos de dados e movimentação lateral de ataques.</li>

</ol>

<ol>

<li><strong>Abstrações Kubernetes</strong>: Use labels e seletores, não endereços IP. Isso torna suas políticas resilientes a mudanças dinâmicas de pods e fáceis de manter.</li>

</ol>

<ol>

<li><strong>Validação Contínua</strong>: Network Policies não funcionam isoladas. Combine com observability, auditoria de logs e testes regulares para garantir que estão tendo o efeito desejado.</li>

</ol>

<p>A implementação de Network Policies não é opcional em ambientes de produção, especialmente quando múltiplas equipes compartilham um cluster. Invista tempo compreendendo os padrões de comunicação reais da sua aplicação antes de implementar as políticas.</p>

<h2>Referências</h2>

<ul>

<li><a href="https://kubernetes.io/docs/concepts/services-networking/network-policies/" target="_blank" rel="noopener noreferrer">Kubernetes Network Policies Documentation</a></li>

<li><a href="https://docs.tigera.io/calico/latest/reference/resources/networkpolicy" target="_blank" rel="noopener noreferrer">Calico Network Policy</a></li>

<li><a href="https://docs.cilium.io/en/stable/security/policy/" target="_blank" rel="noopener noreferrer">Cilium Network Policy Examples</a></li>

<li><a href="https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-190.pdf" target="_blank" rel="noopener noreferrer">Kubernetes Security Best Practices - NIST</a></li>

<li><a href="https://kubernetes.io/docs/concepts/services-networking/" target="_blank" rel="noopener noreferrer">The Kubernetes Network Model</a></li>

</ul>

<p>&lt;!-- FIM --&gt;</p>

Comentários

Mais em Docker & Kubernetes

O que Todo Dev Deve Saber sobre Kustomize em Kubernetes: Overlays, Patches e Bases Reutilizáveis
O que Todo Dev Deve Saber sobre Kustomize em Kubernetes: Overlays, Patches e Bases Reutilizáveis

Introdução ao Kustomize: Por que Precisamos Dele Kubernetes é poderoso, mas g...

O que Todo Dev Deve Saber sobre kubectl em Profundidade: Comandos, Contexts e Kubeconfig
O que Todo Dev Deve Saber sobre kubectl em Profundidade: Comandos, Contexts e Kubeconfig

Introdução: O que é kubectl e Por Que Importa O kubectl é a ferramenta de lin...

Supply Chain Security: SBOM, Cosign e Verificação de Imagens: Do Básico ao Avançado
Supply Chain Security: SBOM, Cosign e Verificação de Imagens: Do Básico ao Avançado

Supply Chain Security: Protegendo sua Pipeline de Software A segurança da cad...