A segurança em microsserviços é um desafio complexo devido à natureza distribuída e à comunicação constante entre serviços. Diferente de aplicações monolíticas, onde a segurança pode ser centralizada, em microsserviços cada serviço deve ser protegido individualmente, e a comunicação entre eles precisa ser autenticada e autorizada. Esta aula explora quatro pilares essenciais: segregação, autenticação serviço-a-serviço, observabilidade e confiança zero.

Esses conceitos, quando aplicados corretamente, reduzem a superfície de ataque, garantem que apenas entidades autorizadas interajam e permitem detectar e responder a incidentes rapidamente. Vamos mergulhar em cada um deles com exemplos práticos.

Segregação

A segregação em microsserviços significa dividir o sistema em serviços menores, cada um com uma responsabilidade bem definida e com seus próprios limites de segurança. Isso impede que uma vulnerabilidade em um serviço comprometa todo o sistema. Por exemplo, um serviço de autenticação deve ser separado de um serviço de processamento de pagamentos.

Na prática, a segregação envolve o uso de namespaces, redes virtuais e políticas de firewall para isolar serviços. Em Kubernetes, por exemplo, você pode usar Network Policies para controlar o tráfego entre pods. Um exemplo de política que permite apenas tráfego do serviço A para o serviço B:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-frontend-to-backend
spec:
  podSelector:
    matchLabels:
      app: backend
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: frontend
    ports:
    - protocol: TCP
      port: 8080

Além disso, a segregação deve ser aplicada também a dados e permissões. Cada serviço deve ter acesso apenas aos dados necessários para sua função, seguindo o princípio do menor privilégio.

Service-to-service auth

A autenticação entre serviços (service-to-service auth) garante que a comunicação entre microsserviços seja segura, verificando a identidade de cada serviço. Isso é diferente da autenticação de usuários; aqui, serviços precisam provar quem são para outros serviços.

Uma abordagem comum é usar tokens JWT (JSON Web Tokens) ou certificados TLS mútuos (mTLS). No mTLS, cada serviço possui um certificado, e a conexão TLS exige que ambos os lados apresentem seus certificados. Isso pode ser implementado com service meshes como Istio ou Linkerd. Um exemplo de configuração no Istio para habilitar mTLS entre serviços:

apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
  name: default
  namespace: istio-system
spec:
  mtls:
    mode: STRICT

Outra técnica é o uso de tokens de curta duração, como os emitidos por um serviço de identidade. Cada serviço obtém um token ao iniciar e o utiliza para autenticar requisições a outros serviços. O token deve ser validado por um serviço de autorização central ou por cada serviço receptor.

Observabilidade

Observabilidade em segurança de microsserviços refere-se à capacidade de monitorar, registrar e rastrear eventos de segurança em todo o sistema distribuído. Isso inclui logs de acesso, métricas de tráfego e rastreamento de requisições (tracing). Sem observabilidade, é difícil detectar ataques ou mau funcionamento.

Ferramentas como Prometheus para métricas, Elasticsearch para logs e Jaeger para tracing são comuns. Um exemplo de configuração de logging estruturado em um serviço Node.js:

const winston = require('winston');
const logger = winston.createLogger({
  level: 'info',
  format: winston.format.json(),
  transports: [
    new winston.transports.Console(),
    new winston.transports.File({ filename: 'security.log' })
  ]
});

// Em uma requisição
logger.info('Requisição recebida', {
  service: 'auth',
  method: req.method,
  path: req.path,
  user: req.user?.id,
  timestamp: new Date().toISOString()
});

Além disso, é crucial estabelecer alertas para comportamentos anômalos, como múltiplas tentativas de autenticação falhas ou picos de tráfego inesperados. A observabilidade permite uma resposta rápida a incidentes.

Zero trust

O modelo de confiança zero (zero trust) parte do princípio de que nenhuma entidade, seja dentro ou fora da rede, deve ser confiável por padrão. Toda requisição deve ser autenticada, autorizada e criptografada. Isso elimina a confiança implícita baseada na localização da rede.

Em microsserviços, zero trust é implementado com verificação contínua de identidade, políticas de acesso granulares e microssegmentação. Por exemplo, cada serviço deve verificar as credenciais do serviço solicitante, mesmo que estejam na mesma rede interna. Um exemplo de política de autorização usando OPA (Open Policy Agent):

package authz

allow {
  input.method == "GET"
  input.path == "/api/data"
  input.service == "frontend"
}

allow {
  input.method == "POST"
  input.path == "/api/data"
  input.service == "backend"
  input.token == valid_token
}

A confiança zero também exige criptografia em trânsito (TLS) e em repouso, além de monitoramento contínuo. Ferramentas como SPIFFE/SPIRE ajudam a gerenciar identidades de serviço de forma dinâmica.

Boas práticas e observações finais

Ao implementar segurança em microsserviços, comece com a segregação e a autenticação serviço-a-serviço. Em seguida, adicione observabilidade para detectar problemas. Por fim, adote o modelo zero trust para uma postura de segurança robusta. Lembre-se de que a segurança é um processo contínuo: revise políticas, atualize certificados e monitore logs regularmente.

Exercícios

  1. Explique por que a segregação de serviços é importante para a segurança em microsserviços e cite um exemplo de como implementá-la.
  2. ✓ Resposta: A segregação isola serviços para limitar o impacto de uma violação. Por exemplo, usando Network Policies no Kubernetes para permitir tráfego apenas entre serviços específicos.
  3. Descreva duas técnicas de autenticação serviço-a-serviço e suas vantagens.
  4. ✓ Resposta: mTLS (certificados mútuos) e tokens JWT. mTLS oferece criptografia e autenticação fortes, enquanto JWT é leve e fácil de implementar com escopos.
  5. Por que a observabilidade é crucial para a segurança em microsserviços? Dê exemplos de dados a serem monitorados.
  6. ✓ Resposta: A observabilidade permite detectar ataques em tempo real. Exemplos: logs de autenticação, métricas de tráfego (picos anômalos) e tracing de requisições para identificar caminhos suspeitos.
  7. Explique o princípio de confiança zero e como ele se aplica a microsserviços.
  8. ✓ Resposta: Confiança zero significa não confiar em nenhuma entidade por padrão, exigindo verificação contínua. Em microsserviços, isso implica autenticar e autorizar cada requisição, mesmo dentro da rede, e usar criptografia.
  9. Cite uma ferramenta ou tecnologia que ajuda a implementar autenticação serviço-a-serviço e explique brevemente como funciona.
  10. ✓ Resposta: Istio é um service mesh que oferece mTLS automático entre serviços, gerenciando certificados e políticas de segurança sem alterar o código dos serviços.

Referências