Segurança de rede

Segurança na comunicação entre serviços: TLS, mTLS, service mesh, políticas de rede e segmentação em arquiteturas distribuídas.

Por que a rede é um vetor de ataque

Em uma arquitetura monolítica, a comunicação entre componentes ocorre dentro do mesmo processo — não há rede envolvida. Em microsserviços, cada chamada entre serviços trafega pela rede, o que introduz novos vetores de ataque:

  • Interceptação: um atacante pode capturar o tráfego entre serviços
  • Falsificação de identidade: um serviço malicioso pode se passar por outro
  • Man-in-the-middle: um atacante pode modificar os dados em trânsito
  • Movimento lateral: se um serviço é comprometido, o atacante pode acessar outros serviços na mesma rede

A segurança de rede em microsserviços não é opcional — é fundamental.

TLS (Transport Layer Security)

O TLS cifra a comunicação entre dois pontos, garantindo confidencialidade e integridade.

Como funciona o TLS

sequenceDiagram
    participant C as Cliente
    participant S as Servidor

    C->>S: ClientHello (versões TLS, cipher suites)
    S->>C: ServerHello (versão escolhida, cipher suite)
    S->>C: Certificado do servidor
    C->>C: Verificar certificado contra CA
    C->>S: Chave pre-master cifrada com a chave pública do servidor
    Note over C,S: Ambos derivam a chave de sessão
    C->>S: Dados cifrados com a chave de sessão
    S->>C: Dados cifrados com a chave de sessão

Configuração recomendada

# Configuração TLS moderna
tls:
  min_version: TLSv1.2    # Mínimo TLS 1.2, preferir 1.3
  cipher_suites:
    - TLS_AES_256_GCM_SHA384
    - TLS_CHACHA20_POLY1305_SHA256
    - TLS_AES_128_GCM_SHA256
  certificate: /etc/certs/server.crt
  private_key: /etc/certs/server.key
  ca_certificate: /etc/certs/ca.crt

TLS na prática

  • Terminação TLS no Gateway: o tráfego externo chega cifrado ao API Gateway, que encerra o TLS e roteia internamente
  • TLS end-to-end: o tráfego permanece cifrado do cliente até o serviço final
  • Recifragem: o Gateway encerra o TLS externo e estabelece uma nova conexão TLS interna

mTLS (Mutual TLS)

No TLS padrão, apenas o servidor apresenta um certificado. No mTLS, ambas as partes se autenticam mutuamente.

Por que usar mTLS em microsserviços

Em uma rede interna com dezenas de serviços, você precisa garantir que:

  1. O serviço que chama é quem diz ser
  2. O serviço que responde é quem diz ser
  3. Ninguém pode interceptar ou modificar a comunicação
sequenceDiagram
    participant A as Serviço A
    participant B as Serviço B

    A->>B: ClientHello
    B->>A: ServerHello + Certificado de B
    A->>A: Verificar certificado de B
    B->>A: Solicitar certificado de A
    A->>B: Certificado de A
    B->>B: Verificar certificado de A
    Note over A,B: Ambos verificados, comunicação cifrada
    A->>B: Request cifrado
    B->>A: Response cifrado

Gestão de certificados

O maior desafio do mTLS é a gestão de certificados em escala:

  • Cada serviço precisa do seu próprio certificado
  • Os certificados devem ser renovados antes de expirar
  • É necessária uma Certificate Authority (CA) interna
  • A revogação de certificados deve ser rápida
# Exemplo: certificado por serviço
service: orders-service
certificate:
  common_name: orders-service.internal
  san:
    - orders-service.default.svc.cluster.local
    - orders-service.production.svc.cluster.local
  validity: 24h          # Certificados de curta duração
  auto_renewal: true      # Renovação automática
  issuer: internal-ca

Ferramentas para mTLS

  • cert-manager (Kubernetes): automatiza a emissão e renovação de certificados
  • Vault (HashiCorp): PKI como serviço, gera certificados sob demanda
  • SPIFFE/SPIRE: framework de identidade para workloads, gera SVIDs (identidades verificáveis)

Service Mesh

Um service mesh é uma camada de infraestrutura dedicada a gerenciar a comunicação entre serviços. Implementa mTLS, observabilidade e políticas de tráfego de forma transparente.

Como funciona

Cada serviço tem um sidecar proxy que intercepta todo o tráfego de rede:

[Serviço A] ←→ [Proxy A] ←→ [Rede] ←→ [Proxy B] ←→ [Serviço B]
                  (Envoy)                  (Envoy)

O serviço não precisa implementar TLS, retry, circuit breaking nem métricas — o proxy faz isso por ele.

Benefícios de segurança

  1. mTLS automático: o mesh gerencia certificados e cifra todo o tráfego entre serviços
  2. Políticas de acesso: define quais serviços podem se comunicar entre si
  3. Observabilidade: visibilidade completa do tráfego entre serviços
  4. Cifragem transparente: os serviços não precisam de código de segurança adicional

Exemplo: política de acesso no Istio

# Somente o BFF pode chamar o serviço de pedidos
apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
  name: orders-service-policy
  namespace: production
spec:
  selector:
    matchLabels:
      app: orders-service
  rules:
    - from:
        - source:
            principals: ["cluster.local/ns/production/sa/bff-service"]
      to:
        - operation:
            methods: ["GET", "POST"]
            paths: ["/api/orders/*"]

Service meshes populares

MeshCaracterísticas
IstioO mais completo, baseado em Envoy, ampla comunidade
LinkerdMais leve, focado em simplicidade e desempenho
Consul ConnectIntegrado com o HashiCorp Consul, bom para ambientes híbridos

Políticas de rede (Network Policies)

No Kubernetes, as Network Policies controlam quais pods podem se comunicar entre si em nível de rede.

Por padrão: tudo aberto

Sem Network Policies, qualquer pod pode se comunicar com qualquer outro pod no cluster. Isso é perigoso: se um pod é comprometido, o atacante tem acesso a toda a rede interna.

Exemplo: restringir acesso ao serviço de banco de dados

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: db-access-policy
  namespace: production
spec:
  podSelector:
    matchLabels:
      app: postgres
  policyTypes:
    - Ingress
  ingress:
    - from:
        - podSelector:
            matchLabels:
              app: orders-service
        - podSelector:
            matchLabels:
              app: users-service
      ports:
        - protocol: TCP
          port: 5432

Esta política diz: somente os pods orders-service e users-service podem se conectar ao pod postgres na porta 5432. Todo o restante está bloqueado.

Estratégia de segmentação

Zona pública:     [API Gateway]

Zona de aplicação: [BFF] [Auth Service]

Zona de serviços:  [Orders] [Users] [Payments]

Zona de dados:      [PostgreSQL] [Redis] [Kafka]

Cada zona tem políticas que restringem o acesso:

  • A zona pública só pode falar com a zona de aplicação
  • A zona de aplicação pode falar com a zona de serviços
  • Somente a zona de serviços pode falar com a zona de dados
  • A zona de dados não inicia conexões para fora

DNS e descoberta segura de serviços

Em microsserviços, os serviços são descobertos dinamicamente. Esse mecanismo também precisa ser seguro:

  • DNS interno: usar DNS privado dentro do cluster, sem expor nomes de serviços internos
  • Service discovery cifrado: as consultas de descoberta devem ser autenticadas
  • Validação de endpoints: verificar que o serviço descoberto é legítimo antes de enviar dados
# Kubernetes: os serviços são resolvidos por DNS interno
# orders-service.production.svc.cluster.local
# Este DNS não é acessível de fora do cluster

Boas práticas de segurança de rede

  1. Cifre todo o tráfego: use TLS ou mTLS para toda comunicação, mesmo a interna
  2. Aplique o princípio do mínimo acesso: cada serviço só pode se comunicar com os serviços que precisa
  3. Segmente a rede: separe serviços em zonas com diferentes níveis de confiança
  4. Monitore o tráfego: detecte padrões anômalos que possam indicar um ataque
  5. Rotacione certificados com frequência: certificados de curta duração (horas, não anos)
  6. Use um service mesh: simplifica a implementação de segurança de rede em escala
  7. Bloqueie por padrão: as Network Policies devem negar tudo e permitir explicitamente

Resumo

A segurança de rede em arquiteturas distribuídas exige cifrar toda a comunicação (TLS/mTLS), autenticar cada serviço, segmentar a rede em zonas de confiança e monitorar o tráfego. Um service mesh simplifica enormemente essa tarefa ao gerenciar mTLS, políticas de acesso e observabilidade de forma transparente. As Network Policies do Kubernetes complementam o mesh controlando o acesso em nível de rede. A regra fundamental é: nunca confie na rede, mesmo que ela seja “interna”.