Pular para conteúdo

Visão geral

O BoxOffice sai do laptop e vai para produção na nuvem. Em um mês, quatro histórias chegam à mesa do time. O laptop de um prestador de serviço é roubado, e nele há um arquivo .env com a chave de API do provedor de pagamentos. O novo app mobile precisa de login, e alguém propõe "é só guardar a senha no app". Às 10:00 do dia em que um show de estádio abre as vendas, bots pegam 30% das reservas de assento no primeiro minuto e revendem os ingressos pelo triplo do preço. E uma biblioteca vulnerável no serviço search permite que um atacante execute código dentro de um pod — de onde, na configuração padrão, todos os outros serviços, o banco de dados e a Internet estão a uma conexão de distância.

Nenhum desses casos é um bug em uma linha de código. São problemas de projeto: onde ficam as fronteiras de rede, quem pode falar com quem, como as identidades são provadas, onde os segredos vivem e com que rapidez podem ser revogados. Esta aula trata segurança e redes do jeito que o resto do curso trata escalabilidade — como decisões de arquitetura com trade-offs, tomadas de propósito, desenhadas no diagrama e defendidas em uma entrevista.

A história até aqui

Capítulo 12 da história da disciplina. O gateway já confere o token de cada fã uma única vez (aula 4 — Identidade, construída no lab 4), e a aula 11 trocou o Compose por Kubernetes e um pipeline de entrega. Agora muitos serviços, construídos por muitas pessoas e por um pipeline, dividem uma plataforma — e as quatro histórias acima mostram o custo dessa confiança: bots na fila da abertura de vendas, uma chave vazada, um pod que alcança tudo, bibliotecas que ninguém revisou. Esta aula responde: onde ficam as fronteiras de confiança, quem pode falar com quem, como segredos são limitados e revogados, e como sabemos o que entregamos?

Objetivos de aprendizagem

Ao final desta aula, você deve ser capaz de:

  • Construir um modelo de ameaças de um fluxo do BoxOffice com STRIDE e mapear cada ameaça para um controle e para o OWASP API Security Top 10.
  • Projetar uma rede em nuvem para o BoxOffice: VPC, plano de CIDR, sub-redes públicas/privadas/isoladas em várias zonas, tabelas de rotas, NAT gateway, security groups e conectividade privada.
  • Explicar o que um service mesh acrescenta (mTLS, políticas de tráfego, telemetria), comparar planos de dados sidecar, ambient e eBPF, e escrever uma política de autorização entre dois serviços.
  • Escolher o fluxo OAuth 2.1 / OpenID Connect certo para cada cliente (app mobile, aplicação web, job em lote) e validar um JWT corretamente no gateway.
  • Aplicar Zero Trust ao tráfego entre serviços, projetar o ciclo de vida de um segredo (a chave da API de pagamentos) e proteger a cadeia de suprimentos de software com SBOMs e imagens assinadas.

Roteiro

  1. Esta visão geral — segurança como projeto: modelagem de ameaças com STRIDE, defesa em profundidade e o OWASP API Security Top 10 aplicado ao BoxOffice. A identidade — tokens, OAuth 2.1 e OIDC — foi ensinada onde o BoxOffice precisou dela primeiro, no gateway: aula 4 — Identidade.
  2. Como a Internet funciona — camadas, roteamento salto a salto e BGP, endereços IP e CIDR, endereços públicos vs privados, NAT, sub-redes e o gateway padrão; dois simuladores (explorador de endereços, caminho do pacote na VPC do BoxOffice).
  3. Redes em nuvem — VPC, sub-redes, tabelas de rotas, Internet e NAT gateways, security groups vs NACLs, endpoints privados, VPN e links dedicados.
  4. Service mesh — plano de dados e plano de controle, sidecar vs ambient vs eBPF, mTLS, políticas de autorização e de tráfego.
  5. Zero Trust, segredos e cadeia de suprimentos — nunca confiar na rede, identidade de workloads, gestão de segredos, SBOM, assinatura de imagens e SLSA.
  6. Quiz — verifique seu entendimento.

Slides

Clique nos slides e use ← → para navegar; F abre em tela cheia e P abre a visão do apresentador, com as notas. Abrir os slides em uma nova aba


Segurança é uma propriedade do projeto

Um erro comum é tratar segurança como uma checklist aplicada no fim ("coloca HTTPS e uma tela de login"). Nessa hora as decisões caras já foram tomadas: o banco de dados está numa sub-rede com rota para a Internet, todos os serviços compartilham uma senha de banco, o gateway é o único lugar que verifica alguma coisa. Mudar isso depois significa refazer a arquitetura.

A alternativa é fazer as perguntas de segurança enquanto se desenha a arquitetura, com a mesma seriedade de "quantas QPS?". Três ideias organizam toda a aula:

Ideia Pergunta que responde Onde na aula
Modelagem de ameaças O que pode dar errado, e onde? esta página
Defesa em profundidade Se um controle falhar, o que segura o atacante em seguida? esta página, todas as subpáginas
Menor privilégio / Zero Trust Qual é o mínimo de que cada usuário, serviço e caminho de rede precisa? Zero Trust, Service mesh

Dois termos usados ao longo da aula:

  • Superfície de ataque (attack surface) — a soma de todos os pontos por onde um atacante pode tentar entrar ou extrair dados: endpoints públicos, portas abertas, dependências, pessoas com acesso.
  • Raio de impacto (blast radius) — o que um atacante alcança depois que um componente é comprometido. Um bom projeto o mantém pequeno.

Modelagem de ameaças com STRIDE

Modelagem de ameaças (threat modeling) é uma conversa estruturada sobre um projeto: desenhar como os dados fluem, marcar onde o nível de confiança muda e perguntar sistematicamente o que pode dar errado em cada elemento1. Adam Shostack a resume em quatro perguntas2:

  1. Em que estamos trabalhando? — desenhe um diagrama de fluxo de dados (DFD).
  2. O que pode dar errado? — enumere ameaças, por exemplo com STRIDE.
  3. O que vamos fazer a respeito? — escolha um controle para cada ameaça (mitigar, aceitar, transferir, eliminar).
  4. Fizemos um bom trabalho? — revise, teste, repita quando o projeto mudar.

Passo 1 — o diagrama de fluxo de dados do checkout

Uma fronteira de confiança (trust boundary) é uma linha onde os dados passam entre componentes com níveis diferentes de confiança: a Internet e a nossa borda, o nosso cluster e o provedor de pagamentos, um serviço e o seu banco. As ameaças se concentram nas fronteiras.

flowchart LR
    subgraph internet ["Internet (não confiável)"]
        M(["App mobile"])
        B(["Bot"])
    end
    subgraph edge ["Borda (sub-rede pública)"]
        W["WAF + API gateway"]
    end
    subgraph cluster ["Cluster BoxOffice (sub-redes privadas)"]
        O["order"]
        I["inventory"]
        P["payment"]
        A["auth"]
    end
    subgraph data ["Dados (sub-redes isoladas)"]
        DB[("PostgreSQL")]
    end
    subgraph ext ["Provedor de pagamentos (terceiro)"]
        PSP["API do PSP"]
    end
    M -->|"POST /orders + token"| W
    B -.->|"POST /holds × 10 000"| W
    W --> O
    O --> I
    I --> DB
    O --> P
    P -->|"chave de API, via NAT"| PSP
    PSP -.->|"webhook: pagamento capturado"| W
    M -->|"login"| A

Cinco fronteiras de confiança são atravessadas em um único checkout: Internet → borda, borda → cluster, serviço → banco, cluster → provedor e provedor → cluster (o webhook). Cada seta é uma pergunta: quem está chamando, como sabemos, e o que ele pode fazer?

Passo 2 — STRIDE

STRIDE é um mnemônico criado na Microsoft para seis categorias de ameaça, cada uma a violação de uma propriedade de segurança1:

Ameaça Propriedade violada Exemplo no BoxOffice Controle Onde
Spoofing (falsificação de identidade) Autenticação um atacante chama payment fingindo ser order; um webhook forjado diz "pagamento capturado" tokens OAuth, mTLS entre serviços, assinatura do webhook (HMAC) Identidade, Service mesh
Tampering (adulteração) Integridade o preço é alterado no corpo da requisição; uma imagem maliciosa é enviada ao registry preço calculado no servidor, TLS, imagens assinadas Zero Trust
Repudiation (repúdio) Não repúdio um cliente diz "nunca comprei esses ingressos" e não conseguimos provar o contrário log de auditoria com id do usuário + trace id, eventos assinados Observabilidade
Information disclosure (vazamento de informação) Confidencialidade GET /orders/1042 devolve o pedido de outro usuário; a chave de API vaza em um log autorização por objeto, gerenciador de segredos, mascaramento de logs Identidade, Zero Trust
Denial of service (negação de serviço) Disponibilidade bots abrem 100 000 reservas de assento e ninguém mais consegue comprar WAF, rate limiting, sala de espera, TTL da reserva Borda
Elevation of privilege (elevação de privilégio) Autorização um usuário comum chama POST /admin/events; o pod search comprometido alcança o banco autorização por função, NetworkPolicy, menor privilégio Zero Trust, Redes em nuvem

STRIDE é aplicado a cada elemento do DFD: processos estão expostos às seis categorias; repositórios de dados, principalmente a adulteração, vazamento de informação e negação de serviço; fluxos de dados, a adulteração, vazamento e DoS; entidades externas, a falsificação e repúdio2.

Passo 3 — avaliar o risco e decidir

Nem toda ameaça merece o mesmo esforço. Uma prática simples é estimar probabilidade × impacto (baixo / médio / alto) e agir a partir do topo da lista. O resultado de uma sessão de modelagem de ameaças é uma tabela curta de ameaça → decisão → responsável, guardada junto com o documento de projeto e revisitada quando o projeto muda.

BoxOffice — três decisões de uma sessão

Ameaça Probabilidade × impacto Decisão
Bots acumulam reservas de assento às 10:00 alta × alto Mitigar: regras de bot no WAF + rate limits por conta e por IP + sala de espera + TTL de 10 minutos na reserva
Webhook "pagamento capturado" forjado média × alto Mitigar: verificar a assinatura HMAC do provedor e consultar de novo o status do pagamento antes de emitir ingressos
Indisponibilidade do provedor não vaza dados, mas bloqueia vendas média × médio Aceitar por enquanto; revisitar com um segundo provedor no próximo trimestre
Pense antes: onde está o ativo mais valioso do BoxOffice?

Não é o banco de eventos — isso é informação pública. Os ativos mais valiosos são a chave de API do provedor de pagamentos (quem a tem pode emitir estornos ou cobranças), os dados pessoais dos clientes (regulados pela LGPD, a Lei Geral de Proteção de Dados) e o próprio inventário de assentos durante uma venda relâmpago (um ativo de negócio que os bots tentam roubar). Os controles devem ser mais fortes em volta deles.


Defesa em profundidade

Nenhum controle é perfeito: regras de WAF têm lacunas, tokens são roubados, uma biblioteca sai com um bug de execução remota de código. Defesa em profundidade empilha camadas independentes, de modo que um atacante que vence uma ainda enfrenta a próxima. As camadas do BoxOffice, de fora para dentro:

flowchart LR
    U(["Cliente"]) -->|"1 · TLS, WAF, rate limit"| GW["API gateway"]
    GW -->|"2 · valida token (OAuth/OIDC)"| O["order"]
    O -->|"3 · verifica dono (authZ)"| O
    O -->|"4 · mTLS + política do mesh"| P["payment"]
    P -->|"5 · sub-rede + security group"| DB[("PostgreSQL")]
    P -->|"6 · segredo de vida curta"| PSP["PSP"]
# Camada Principais ameaças Controles Subpágina
1 Borda DDoS, bots, injeção, escuta TLS, WAF, rate limiting, sala de espera Borda
2 Identidade credenciais roubadas ou forjadas OAuth 2.1 / OIDC, tokens de vida curta, MFA, passkeys Identidade
3 Autorização da requisição usuário lê dados de outra pessoa dono, papéis e escopos verificados em cada serviço Identidade
4 Serviço a serviço movimento lateral, chamadores falsificados mTLS, política de autorização do mesh Service mesh
5 Rede alcançar o que deveria ser inalcançável sub-redes privadas, security groups, NetworkPolicy, banco nunca público Redes em nuvem
6 Dados e segredos chaves e senhas vazadas gerenciador de segredos, rotação, criptografia em repouso (KMS) Zero Trust
7 Cadeia de suprimentos dependência ou imagem maliciosa SBOM, varredura de vulnerabilidades, imagens assinadas, proveniência Zero Trust

As camadas são independentes: o security group do banco não se importa se o token era válido, e a política do mesh não se importa se o WAF foi contornado. Essa independência é o ponto.


OWASP API Security Top 10 (2023)

A OWASP (Open Worldwide Application Security Project) publica uma lista dos riscos mais críticos de APIs3. É a melhor checklist para levar a uma revisão de projeto, porque quase todo item é uma decisão de arquitetura, não um erro de digitação. Aplicada ao BoxOffice:

# Risco Exemplo no BoxOffice Controle principal
API1 Broken Object Level Authorization (BOLA) GET /orders/1042 devolve o pedido 1042 a qualquer usuário logado cada serviço verifica se o objeto pertence a quem chama
API2 Broken Authentication tokens sem expiração; endpoint de login sem proteção contra força bruta provedor OIDC padrão, tokens curtos, login com rate limit, MFA
API3 Broken Object Property Level Authorization PATCH /orders/1042 {"status":"PAID"} aceito; GET /users/me devolve o hash da senha DTOs explícitos de entrada/saída, nunca ligar a requisição direto à entidade
API4 Unrestricted Resource Consumption uma conta abre 5 000 reservas de assento; GET /events?size=1000000 rate limits, cotas, limite de paginação, TTL da reserva
API5 Broken Function Level Authorization um cliente chama POST /admin/events verificação de papel por endpoint, API de admin em rota/rede separada
API6 Unrestricted Access to Sensitive Business Flows bots cambistas compram o estádio inteiro em segundos detecção de bots, limite de compra por conta, sala de espera, CAPTCHA/atestação do dispositivo
API7 Server-Side Request Forgery (SSRF) "importar o pôster do evento a partir de uma URL" busca http://169.254.169.254/ (metadados da nuvem) lista de destinos permitidos, bloquear faixas internas, controle de egress
API8 Security Misconfiguration endpoints de debug em produção; CORS permissivo; stack traces detalhados padrões endurecidos, revisão de configuração no CI
API9 Improper Inventory Management um /v1/orders antigo, sem as novas verificações, ainda está no ar inventário de APIs, depreciar e remover versões antigas
API10 Unsafe Consumption of APIs confiar cegamente no corpo do webhook do provedor verificar assinaturas, validar e consultar de novo, timeouts

BOLA é o número um por um motivo

O gateway consegue dizer "este é o usuário 42". Só o serviço order sabe se o pedido 1042 pertence ao usuário 42. A autorização por objeto não pode ser centralizada na borda; ela vive no código que é dono dos dados. Teste explicitamente: "o usuário A pede o pedido do usuário B → 404 ou 403".

Experimente. Abra o cenário flash-sale e aperte Run: observe como a rajada da abertura da venda (t = 60 s, as nossas 10:00) satura o app e depois o inventory-db. Agora selecione users, ajuste o tráfego de bots para 0,45 — os bots passam a ser cerca de 30% das requisições (API6) — e rode de novo. Qual componente você adicionaria primeiro, e onde — WAF na borda, rate limiting no gateway ou a fila da sala de espera? Use o playground completo (↗) para adicionar os componentes e comparar o p99 e a taxa de erros (as metas contam só usuários reais).

O mapa de conceitos de rede e segurança

Segurança não é uma caixa no diagrama: cada salto de uma requisição responde a uma pergunta de confiança diferente. O mapa liga cada componente da paleta (verde) aos conceitos que ele aplica (azul) e à subpágina que os ensina; os nós azuis são as camadas da defesa em profundidade:

flowchart LR
    client["client · mobile"]:::comp -->|"login"| auth["auth"]:::comp
    client --> waf["waf"]:::comp
    waf --> apigw["apigw"]:::comp
    apigw --> mesh["mesh<br/>(order, payment, …)"]:::comp
    mesh -->|"saída via nat"| pay["payment (PSP)"]:::comp
    vpc["vpc · subnet ·<br/>nat · vpn"]:::comp -.->|"contém"| mesh
    waf -.- c1["bots, rate limits,<br/>OWASP API4 / API6"]:::tech
    auth -.- c2["OAuth 2.1 + PKCE, OIDC,<br/>RBAC / ABAC / ReBAC"]:::tech
    apigw -.- c3["validação de JWT (JWKS),<br/>remover headers de identidade"]:::tech
    mesh -.- c4["mTLS, identidade SPIFFE,<br/>política de authz, NetworkPolicy"]:::tech
    vpc -.- c5["plano de CIDR, sub-redes públicas /<br/>privadas / isoladas, SGs"]:::tech
    pay -.- c6["gerenciador de segredos,<br/>rotação com duas chaves"]:::tech
    c4 -.- d1["Zero Trust: suponha a invasão,<br/>negar por padrão"]
    c1 -.- d2["STRIDE, OWASP API Top 10<br/>(esta visão geral)"]
    classDef comp fill:#1e9e5a22,stroke:#1e9e5a
    classDef tech fill:#2f6fed22,stroke:#2f6fed
Componente da paleta Pergunta que responde Conceitos Ensinado em Cenários
waf Esta requisição é um ataque ou um bot? OWASP API4/API6, regras contra bots, rate limits, sala de espera OWASP API Top 10, Borda — segurança flash-sale, rate-limiter
auth Quem é o usuário, e qual cliente pede? OAuth 2.1, Authorization Code + PKCE, OIDC, Client Credentials, Token Exchange Identidade flash-sale (estenda-o), blank
apigw A requisição traz um token válido? validação de JWT (JWKS, iss, aud, exp), remoção de headers Identidade — gateway rate-limiter, flash-sale
vpc · subnet Onde vive cada componente, e o que o alcança? plano de CIDR, sub-redes públicas/privadas/isoladas, tabelas de rotas, SGs/NACLs Redes na nuvem multi-region, scale-out
nat Como os serviços privados chamam para fora? NAT por AZ, IP de saída estável, VPC endpoints Redes na nuvem payment-system
vpn Como outras redes e pessoas entram? peering, transit, PrivateLink, VPN, session manager Redes na nuvem multi-region
mesh Qual serviço pode chamar qual? mTLS, SPIFFE, política de autorização, política de tráfego, NetworkPolicy Service mesh cascading-failure, retry-storm
payment Quem guarda a chave que movimenta dinheiro? gerenciador de segredos, rotação com duas chaves, identidade de workload, HMAC de webhook Zero Trust — segredos payment-system
(todos eles) Podemos confiar no código que roda? Zero Trust, SBOM, scanning, assinatura, SLSA Zero Trust — cadeia de suprimentos ai-assistant

Na entrevista

Raramente vão pedir "faça uma modelagem de ameaças". Mas um candidato forte traz segurança por conta própria, em uma ou duas frases, na hora certa: "o banco fica numa sub-rede isolada, sem rota para a Internet; os serviços conversam por mTLS; o app mobile usa Authorization Code com PKCE; a chave de pagamento fica num gerenciador de segredos e é rotacionada; e, na borda, WAF mais rate limits por conta protegem o fluxo de abertura de vendas contra bots." Depois siga em frente — a não ser que o entrevistador queira aprofundar. Mencione BOLA sempre que projetar um endpoint com um id no caminho.

Boas práticas

  • Desenhe as fronteiras de confiança no diagrama da arquitetura e registre cada decisão do STRIDE com um responsável — mitigar, aceitar ou transferir, no design doc, para que um revisor veja quais ameaças ficaram abertas de propósito.
  • Negue por padrão — uma rota é protegida a menos que esteja explicitamente listada como aberta, para que um endpoint novo não vá para produção desprotegido. No BoxOffice: o SecurityConfig do gateway termina com .anyExchange().authenticated() (quadro do gateway).
  • Escreva testes negativos de autorização para todo endpoint que recebe um id — "o usuário A pede o pedido do usuário B → 404" roda no CI; BOLA é o API1 porque ninguém o testa.
  • Limite a taxa por conta e por IP nos endpoints caros — o login é lento de propósito (BCrypt, ~10–20 verificações/s por CPU no lab 4) e as reservas são escassas; bots (API6) precisam bater num limite antes de bater no banco.
  • Registre eventos de segurança num armazenamento append-only e alerte sobre eles — logins falhos, rajadas de 401/403, ações de administração e chamadas negadas entre serviços, guardados por tempo suficiente para investigar (por exemplo, 1 ano).
  • Aplique correções com prazo imposto pelo pipeline — uma vulnerabilidade crítica com correção bloqueia a release. No BoxOffice: o portão do Trivy do lab 11.

Armadilhas comuns

  • Segurança só no gateway — qualquer serviço alcançável sem passar por ele (um NodePort, uma porta de debug, um segundo Ingress) contorna tudo.
  • Confiar na rede interna — "está dentro da VPC, então é seguro" é como um pod comprometido vira um vazamento completo.
  • Fazer o seu próprio algoritmo criptográfico, formato de token ou protocolo de login — use padrões e bibliotecas consolidadas.
  • Modelar ameaças uma vez e nunca mais — o modelo fica velho no dia em que um novo fluxo (webhooks, um assistente de IA com ferramentas) é adicionado.

Pontos-chave

  • Segurança é uma propriedade do projeto: decida fronteiras, identidades e privilégios enquanto desenha a arquitetura.
  • Modelagem de ameaças = desenhar o fluxo de dados, marcar as fronteiras de confiança, rodar STRIDE por elemento, decidir e registrar.
  • Defesa em profundidade empilha camadas independentes: borda, identidade, autorização da requisição, serviço a serviço, rede, segredos, cadeia de suprimentos.
  • O OWASP API Top 10 é uma checklist de revisão de projeto; BOLA é o número um e só pode ser corrigido no serviço que é dono dos dados.
  • Na entrevista, mencione segurança de forma breve e concreta no momento certo — sub-redes privadas, mTLS, PKCE, gerenciador de segredos, rate limits.

O que quebra em seguida

Todo chamador desta aula é uma pessoa ou um serviço que nós escrevemos: o fã com um token, o order com uma identidade de workload, o pipeline com uma proveniência assinada. O próximo chamador não é nenhum dos dois. Os fãs querem pedir "dois lugares abaixo de R$ 300 no sábado, reserve", e um assistente responde chamando catalog e inventory por eles: uma dependência lenta, cara e não determinística que pode agir sobre o estoque, em nome do fã, e que pode ser convencida a fazer a coisa errada pelo texto que lê. Projetar um sistema em torno de um modelo — e decidir o que ele pode tocar — é a aula 13 — Sistemas de IA.



  1. KOHNFELDER, L.; GARG, P. The Threats to Our Products. Microsoft, 1999 (republicado por Adam Shostack no blog Microsoft Security, 2009) — origem do STRIDE. Veja também a Threat Modeling Tool — STRIDE da Microsoft. ↩↩

  2. SHOSTACK, A. Threat Modeling: Designing for Security. Wiley, 2014. Veja também o Threat Modeling Manifesto. ↩↩

  3. OWASP. API Security Top 10 — 2023. ↩