MÓDULO 11 · 2 SEMANAS · SEGURANÇA

Segurança — ameaças, controles e o mínimo que todo sênior precisa saber

Threat modeling, OWASP Top 10, autenticação e autorização, OAuth 2.1, JWT, RBAC/ABAC, criptografia aplicada, TLS, secrets management, supply chain security, audit logs. Segurança como propriedade de design, não checklist de final de projeto.

Duração ~2 semanas
Conceitos 12 fundamentais
Projeto Auth Completo + Threat Model
Pré-requisito Módulos 01, 03, 09
Segurança Confiabilidade Qualidade

Doze conceitos que cobrem a segurança do ponto de vista de quem projeta e constrói sistemas — não de quem os ataca. O módulo começa em threat modeling (pensar como adversário antes de escrever código), percorre as vulnerabilidades mais comuns (OWASP Top 10) com exploits reais e controles concretos, aprofunda em auth completa (OAuth 2.1, JWT, RBAC, ABAC), e chega em criptografia aplicada, TLS, gestão de segredos e supply chain security. O fio condutor é security by design: cada decisão arquitetural tem implicação de segurança, e o momento certo de pensar nisso é no design, não no pentest.

01

Threat modeling — STRIDE e árvores de ataque

Adam Shostack e o modelo STRIDE (Spoofing, Tampering, Repudiation, Information Disclosure, Denial of Service, Elevation of Privilege). Como fazer threat modeling em design review: DFD, trust boundaries, threats por componente. Threat modeling como prática contínua, não evento único.

estudar →
02

OWASP Top 10 — vulnerabilidades, exploits e controles

As 10 categorias de 2021: injection, broken auth, sensitive data exposure, XXE, broken access control, security misconfiguration, XSS, insecure deserialization, known vulnerabilities, insufficient logging. Para cada uma: o que é, como é explorada, como é mitigada no código.

estudar →
03

Autenticação vs autorização — fundamentos e modelos

A distinção fundamental que mais confunde: autenticação (quem é você?) vs autorização (o que você pode fazer?). Session-based vs token-based. Fatores de autenticação: algo que você sabe, tem, é. MFA: TOTP, WebAuthn/FIDO2. Passkeys como futuro do auth.

estudar →
04

OAuth 2.1 e OpenID Connect — flows, tokens e segurança

OAuth 2.1 como consolidação do 2.0 com PKCE obrigatório. Authorization Code Flow com PKCE: passo a passo. Client Credentials para machine-to-machine. Refresh tokens. OpenID Connect: ID token, userinfo endpoint. Segurança de OAuth: state parameter, PKCE, token binding. Keycloak e Auth0 como identity providers.

estudar →
05

JWT em profundidade — claims, assinatura e armadilhas

Anatomia do JWT: header.payload.signature. Algoritmos: HS256 (simétrico) vs RS256/ES256 (assimétrico) — quando usar cada um. Claims padrão e customizados. Validação correta: iss, aud, exp, nbf. A vulnerabilidade alg:none. Token revogação e blacklisting. JWK endpoint e rotação de chaves.

estudar →
06

RBAC, ABAC e ReBAC — modelos de controle de acesso

RBAC (Role-Based): papéis, permissões, hierarquia de papel. Simples de implementar, difícil de escalar. ABAC (Attribute-Based): políticas sobre atributos de usuário, recurso e contexto. Flexível, complexo de auditar. ReBAC (Relationship-Based): Google Zanzibar, SpiceDB. Qual modelo para qual problema.

estudar →
07

Criptografia aplicada — o que usar, por quê, e o que evitar

Criptografia simétrica: AES-GCM como padrão atual. Assimétrica: RSA vs ECC — por que curvas elípticas vencem. Hashing de senha: bcrypt, Argon2, scrypt. Funções de hash criptográficas: SHA-256, SHA-3. O que não usar: MD5, SHA-1, DES, ECB mode. Geração de chaves e IVs: por que aleatório importa.

estudar →
08

TLS em profundidade — handshake, certificados e HSTS

TLS 1.3 como padrão mínimo hoje. O handshake em detalhe: ClientHello, ServerHello, key exchange, finished. Certificados X.509: CA chain, SAN, wildcard. Let's Encrypt e ACME protocol. HSTS: preloading e max-age. Certificate pinning: quando faz sentido e quando é armadilha. mTLS para autenticação mútua.

estudar →
09

Segurança de APIs — CORS, input validation e SQL injection

CORS: preflight, allowed origins, credenciais — o que o browser faz e o que o servidor controla. Input validation: allowlist vs denylist, sanitização vs validação. SQL injection com exemplos em 3 linguagens e como parameterized queries resolvem. Mass assignment, IDOR (Insecure Direct Object Reference) e broken object-level authorization.

estudar →
10

Secrets management — Vault, KMS e rotação automática

O problema de segredos em código e em variáveis de ambiente simples. HashiCorp Vault: dynamic secrets, leases, AppRole auth. AWS Secrets Manager e KMS: integração com IAM. Rotação automática como prática padrão (conceito 14 do módulo 08 já implementou o padrão). Detecção de segredos em repositório: git-secrets, TruffleHog, GitGuardian.

estudar →
11

Supply chain security — SBOM, SLSA e dependências

O ataque SolarWinds (2020) e a Log4Shell (2021) como casos de estudo. SBOM (Software Bill of Materials): SPDX, CycloneDX. SLSA (Supply chain Levels for Software Artifacts): níveis de maturidade. Dependabot e Renovate para atualizações automáticas. Sigstore/cosign para assinar imagens de container. Dependências como superfície de ataque.

estudar →
12

Audit logs e compliance — LGPD, SOC 2 e rastreabilidade

Audit log como registro imutável de quem fez o quê, quando, e de onde. Campos obrigatórios: actor, action, resource, result, timestamp, IP. Proteção contra adulteração: append-only storage, hash chaining. LGPD: direito ao esquecimento vs necessidade de audit trail. SOC 2 Type II: o que auditores pedem. GDPR para sistemas com usuários europeus.

estudar →
princípio orientador

Segurança não é uma feature que se adiciona no final — é uma propriedade que emerge (ou não) das decisões de design. Um sistema que trata autenticação como afterthought, que não fez threat modeling antes de lançar, que armazena segredos em variáveis de ambiente no repositório, não pode ser "securizado" com patches. O momento certo de pensar em segurança é o mesmo momento em que se pensa em escalabilidade e disponibilidade: no design. Engenheiros sênior não delegam segurança para o time de AppSec — eles chegam à revisão de segurança com threat model já feito.

Segurança envolve trade-offs reais de usabilidade, performance e custo de implementação. As decisões abaixo forçam articular por que uma escolha é mais segura que outra — e o que você está aceitando ao escolher o caminho mais simples.

JWT stateless ou sessions com armazenamento central?

JWT stateless permite que qualquer instância do serviço valide o token sem consultar banco — bom para escala horizontal, zero latência de lookup. O problema é revogação: um JWT válido por 1 hora não pode ser invalidado antes de expirar sem algum mecanismo centralizado (blocklist), o que elimina a vantagem de ser stateless. Sessions centralizadas (Redis) permitem revogação imediata mas adicionam latência de lookup e dependência. A solução prática usada na indústria: JWT com tempo de expiração curto (15 minutos) + refresh token de longa duração armazenado no servidor. Isso limita a janela de risco sem precisar de blocklist de tokens de acesso.

RBAC ou ABAC — quando a complexidade de ABAC se justifica?

RBAC se justifica quando as regras de acesso são baseadas em papel e relativamente estáticas: "admin pode fazer tudo, editor pode publicar, reader só lê". Simples de implementar, auditar e explicar. ABAC se justifica quando as regras dependem de contexto dinâmico: "usuário pode editar o documento se for o autor E o documento estiver em rascunho E o horário for entre 8h e 18h". RBAC com atributos extras (chamado às vezes de RBAC+) frequentemente resolve 80% dos casos de ABAC sem a complexidade total. ReBAC (Zanzibar) é o caminho para sistemas multi-tenant onde as relações entre entidades definem o acesso — Google Drive, GitHub, Notion são exemplos.

Armazenar segredos em variáveis de ambiente, secrets manager ou Vault?

Variáveis de ambiente são melhores que hardcoded no código, mas piores que todos percebem: acabam em logs (quando o processo imprime o ambiente), em dumps de crash, em docker inspect, e em arquivos .env que frequentemente vão para o repositório. Secrets Manager (AWS, GCP) é o padrão mínimo para produção: segredos não ficam no processo, rotação é mais fácil, acesso é auditado. Vault adiciona dynamic secrets (o segredo é gerado no momento da solicitação e expira com a lease) — mais seguro, mais complexo. A decisão prática: variáveis de ambiente para desenvolvimento local, Secrets Manager para produção inicial, Vault quando dynamic secrets e auditoria avançada são requisito.

Certificate pinning: sim ou não?

Certificate pinning fixa o certificado ou a chave pública que o cliente aceita — protege contra man-in-the-middle mesmo com CA comprometida. O problema é operacional: quando o certificado expira ou é rotacionado, o cliente para de funcionar até ser atualizado. Em apps mobile isso pode ser catastrófico — usuários com versões antigas perdem acesso. A recomendação atual da indústria é pinning de CA raiz (não do certificado leaf) e backup pins — duas chaves aceitas ao mesmo tempo durante a transição. Para APIs consumidas por clientes que você controla e pode atualizar rapidamente, pinning faz sentido. Para APIs públicas com clientes de terceiro, os riscos operacionais raramente justificam.

Validação de input: denylist (bloquear o ruim) ou allowlist (permitir só o bom)?

Denylist bloqueia padrões conhecidos de ataque (DROP TABLE, <script>, ../../../). O problema é que atacantes são criativos: encodings diferentes (URL encoding, unicode, double encoding), casos extremos, e combinações novas passam pelo filtro. Denylist é um jogo de whack-a-mole sem fim. Allowlist define o que é válido e rejeita tudo o mais: um campo de nome aceita apenas letras, espaços e hífens — qualquer outra coisa é inválida. Mais restritivo, mas muito mais seguro. A regra: sempre preferir allowlist (também chamada de positive validation). Denylist apenas como camada adicional em situações onde allowlist é impossível (campos de texto livre irrestrito).

O projeto constrói o sistema de auth completo de uma API — do zero ao deploy — com threat model documentado antes de escrever uma linha de código, e audit log de todas as operações sensíveis.

PROJETO PRÁTICO

Auth Completo + Threat Model

Sistema de autenticação e autorização para uma API de gerenciamento de documentos: OAuth 2.1 com PKCE para login via identity provider, JWT de curta duração + refresh token para sessão, RBAC com três papéis (admin, editor, viewer), e audit log imutável de todas as operações sensíveis. O projeto começa com um threat model STRIDE documentado antes do código — ameaças identificadas, controles escolhidos, residual risk aceito.

REQUISITOS
  • Threat model STRIDE documentado: pelo menos 5 ameaças identificadas com controles
  • OAuth 2.1 Authorization Code + PKCE com Keycloak como identity provider (docker)
  • JWT access token (15 min) + refresh token (7 dias) armazenado com httpOnly cookie
  • Validação correta de JWT: iss, aud, exp — rejeitar alg:none e algoritmos fracos
  • RBAC: admin (CRUD tudo), editor (criar e editar próprios docs), viewer (somente leitura)
  • IDOR protection: editor não pode editar documento de outro editor verificado por teste
  • Audit log: login, logout, criação/edição/exclusão de documento, tentativa de acesso negado
  • Audit log append-only: tabela com trigger que impede UPDATE e DELETE
  • Rate limiting no endpoint de login: máximo 5 tentativas por IP em 1 minuto
  • Senha armazenada com Argon2id — nunca bcrypt com cost factor padrão insuficiente
  • HTTPS obrigatório em produção com HSTS header
  • Testes de segurança: ao menos um teste que tenta acessar recurso sem token, com token expirado, e com papel insuficiente
Segurança Qualidade Confiabilidade
STACK SUGERIDA POR LINGUAGEM
STACK
.NET 10 + ASP.NET Core + Microsoft.AspNetCore.Authentication.JwtBearer + Keycloak (docker) + Entity Framework Core + PostgreSQL + ASP.NET Core Data Protection (refresh tokens)
ESTRUTURA / NOTAS
  • AddAuthentication().AddJwtBearer() com TokenValidationParameters explícito (validar iss, aud, exp, alg)
  • Policy-based authorization com IAuthorizationRequirement para RBAC granular
  • Audit log via EF Core SaveChangesInterceptor — transparente, sem esquecer entidades
  • Argon2id via Konscious.Security.Cryptography ou ASP.NET Core Identity com password hasher customizado
  • Rate limiting via ASP.NET Core 8+ RateLimiter (FixedWindowRateLimiter por IP no endpoint de login)
STACK
Python 3.13 + FastAPI + python-jose ou PyJWT + Keycloak (docker) + SQLAlchemy + PostgreSQL + argon2-cffi + slowapi (rate limiting)
ESTRUTURA / NOTAS
  • Dependency injection FastAPI com get_current_user usando PyJWT com algorithms=["RS256"] explícito
  • RBAC via decorator customizado requires_role(*roles) aplicado em routers
  • Audit log via SQLAlchemy event listener (after_flush) para capturar todas as mutações
  • argon2-cffi para hash de senha com parâmetros Argon2id explícitos (time_cost=3, memory_cost=65536)
  • slowapi com key_func=get_remote_address e limite no endpoint de login
STACK
Go 1.23 + chi + golang-jwt/jwt v5 + Keycloak (docker) + pgx + postgres + golang.org/x/crypto/argon2 + tollbooth (rate limiting)
ESTRUTURA / NOTAS
  • JWT validation com golang-jwt/jwt v5: ParseWithClaims com validação explícita de iss, aud, exp
  • Middleware de auth chi retornando 401/403 com corpo padronizado (RFC 7807 Problem Details)
  • RBAC via middleware RequireRole(roles ...string) composto na rota
  • Audit log via pgx AfterExec hook ou tabela de audit com trigger PostgreSQL AFTER INSERT/UPDATE/DELETE
  • Argon2id via golang.org/x/crypto/argon2 com parâmetros explícitos — não usar bcrypt
entregável

Repositório com README documentando o threat model (tabela STRIDE com ameaça, componente, controle e risco residual), o fluxo OAuth 2.1 com PKCE em diagrama de sequência, e uma tabela de teste de segurança (cenário, resultado esperado, resultado obtido). Bonus: um relatório de análise de SBOM das dependências do projeto usando Syft + Grype — vulnerabilidades conhecidas identificadas e triadas.

Segurança é pergunta obrigatória em entrevistas de staff e para posições que envolvem dados sensíveis. As perguntas abaixo testam entendimento real dos mecanismos — não memorização de siglas.

Q.01

Explique o Authorization Code Flow do OAuth 2.1 com PKCE, passo a passo. Por que o PKCE foi introduzido e que ataque ele mitiga?

Q.02

Um JWT foi roubado por XSS em seu site. Qual é a superfície de dano, quais são as suas opções de mitigação imediata, e o que você mudaria no design para que isso não fosse possível?

Q.03

Explique IDOR (Insecure Direct Object Reference) com um exemplo concreto em uma API REST. Como você protegeria o endpoint /documents/{id} contra esse tipo de ataque?

Q.04

Seu time quer armazenar chaves de API de parceiros para fazer chamadas em nome deles. Qual é a sua arquitetura de secrets management — onde as chaves ficam, quem pode acessar, como são rotacionadas?

Q.05

O que é threat modeling? Faça um threat model simplificado de um endpoint de login: identifique pelo menos 3 ameaças STRIDE e descreva o controle para cada uma.