Pular para o conteúdo

Disponível para propostasGoiânia ou remoto

jnogxavier
Voltar aos casos

Fechar as portas depois do ataque

DevOps Engineer na BCJ, 2026

O que deveria acontecer

Nada alcança um serviço interno sem passar por uma camada que exige identidade, limita volume e decide o que entra.

O que acontecia

Tentativas de ataque chegando de várias origens ao mesmo tempo. Os serviços eram alcançáveis por caminhos que não o gateway, não havia teto de requisição, e o que existia de gateway era repasse: tudo que batia na borda seguia adiante.

O que eu fiz

A borda passou a filtrar tráfego por origem. E o gateway deixou de ser opção: endpoint que não estivesse declarado nele simplesmente parava de responder — o que fechou os caminhos alternativos de uma vez, ao custo de toda rota nova passar a exigir uma mudança no gateway. Atrás dele entrou validação de JWT em RS256 contra o Keycloak, com a chave pública buscada do próprio emissor e o issuer conferido; teto de requisição global e por cliente; circuit breaker; e limite de tamanho de corpo e de quantidade de cabeçalho.

clientegatewayvalida o token e o emissorteto por rota e por clienteserviço internocom tokensó o que passouendpoint não declarado aqui não responde
O ganho não é o gateway existir — ele já existia. É ele ter virado o único caminho, e passado a exigir identidade para deixar passar.

1caminho até os serviços, e endpoint fora dele não respondecontra vários caminhos antes

O que isso destravou

  • Identidade deixou de ser responsabilidade de cada serviço. O gateway valida o token antes de encaminhar, com algoritmo assimétrico e chave buscada do emissor — serviço nenhum precisa guardar segredo de assinatura.
  • O teto de requisição é em dois níveis: um global para a rota e outro por cliente. Um endereço sozinho não consome a capacidade da rota inteira.
  • Circuit breaker entre o gateway e os serviços, então falha de um backend não vira fila acumulando na borda.
  • Corpo limitado a um megabyte e cabeçalho limitado em quantidade e tamanho. Requisição absurda é recusada antes de custar processamento.
  • A esteira passou a varrer segredo, código, infraestrutura e imagem antes de publicar. O que não passa não chega na borda.
  • Tentativa de autenticação, bloqueio por limite e erro de autorização viram log auditável — então ataque deixou de ser invisível e virou coisa que se consulta.

O que eu faria diferente

Tudo isso foi reação. O gateway existia e estava configurado como repasse, e só virou fronteira depois que alguém tentou entrar. O que me incomoda não é o que fizemos, é a ordem: identidade e teto de requisição custam pouco antes do incidente e custam fim de semana depois. E uma parte do que foi feito nasceu no console, apertando botão sob pressão, em vez de nascer como código revisado. Funcionou, mas proteção que não está versionada é proteção que depende de memória — e memória é a primeira coisa que uma equipe perde quando alguém sai.