O que são boas práticas operacionais em autenticação/autorização
Boas práticas operacionais são decisões e rotinas que tornam o sistema observável e investigável sem vazar dados sensíveis. Elas se apoiam em quatro pilares: logs (registro técnico de eventos), auditoria (trilha confiável de ações relevantes), monitoramento (métricas/alertas para detectar anomalias) e respostas seguras (comportamento HTTP que não ajuda atacantes e facilita diagnóstico interno).
O objetivo é responder perguntas como: “quem fez o quê?”, “quando?”, “de onde?”, “com qual resultado?” e “qual foi o impacto?”, mantendo privacidade e conformidade.
Quais eventos registrar (e por quê)
Defina uma política de eventos mínimos para autenticação/autorização. O ideal é registrar eventos suficientes para investigação e detecção de abuso, sem registrar segredos.
Eventos recomendados
- Login bem-sucedido: para detectar acessos suspeitos e construir histórico de conta.
- Falha de login: para identificar brute force, credenciais vazadas e enumeração de usuários.
- Refresh de token: para rastrear rotação e detectar uso anômalo (ex.: refresh em locais incomuns).
- Revogação/Logout: para confirmar invalidação e investigar sessões/tokens comprometidos.
- Mudança de senha: evento crítico de segurança; deve gerar auditoria e alerta.
- Alteração de permissões/papéis: mudança de autorização é evento de alto impacto; exige trilha de auditoria forte.
- Erros de validação de token: expiração, assinatura inválida, emissor/audiência incorretos, token revogado, clock skew; úteis para detectar ataques e problemas de configuração.
Campos mínimos por evento (padrão recomendado)
Padronize um esquema de log estruturado (JSON) com campos consistentes:
- timestamp (UTC), level, service, env, version
- event.type (ex.: auth.login.success), event.outcome (success/failure)
- request.id (correlação), trace.id/span.id (se houver tracing)
- actor.id (userId) e/ou actor.subject (sub), actor.type (user/service)
- client.ip, client.user_agent (com cuidado), client.device_id (se existir)
- auth.method (password/mfa/refresh), auth.provider (local/oidc/etc.)
- resource e action (para eventos de permissão)
- http.method, http.path, http.status_code, latency_ms
- error.code (interno) e error.class (categoria), sem detalhes sensíveis
Como evitar dados sensíveis em logs (redaction e minimização)
Logs são frequentemente exportados para sistemas de terceiros e acessados por muitas pessoas. Trate logs como um canal de alto risco: registre o mínimo necessário e aplique redaction (mascaramento) e hash quando precisar correlacionar sem expor o valor.
- Ouça o áudio com a tela desligada
- Ganhe Certificado após a conclusão
- + de 5000 cursos para você explorar!
Baixar o aplicativo
O que NÃO registrar
- Senhas (mesmo em falhas), códigos MFA, tokens (access/refresh), cookies de sessão
- Authorization header, Set-Cookie, CSRF tokens
- Dados pessoais desnecessários (documentos, endereço, telefone) em eventos de auth
- Corpo completo de requisições/respostas em endpoints de autenticação
Estratégias práticas de redaction
- Allowlist de campos: logue apenas campos explicitamente permitidos (mais seguro que bloquear alguns).
- Mascaramento parcial: e-mail como
jo***@dominio.com. - Hash com salt para correlação: por exemplo, hash do e-mail para agrupar tentativas sem expor o valor.
- Truncamento: user-agent pode ser truncado para evitar payloads enormes.
- Separação de dados: eventos de auditoria podem guardar “antes/depois” de permissões, mas nunca segredos.
Exemplos de log com redaction (JSON estruturado)
{ "timestamp":"2026-01-25T12:34:56.789Z", "level":"INFO", "service":"api", "env":"prod", "event":{ "type":"auth.login.success", "outcome":"success" }, "request":{ "id":"req_01HZZ...", "method":"POST", "path":"/auth/login", "ip":"203.0.113.10" }, "actor":{ "type":"user", "id":"u_12345" }, "client":{ "user_agent":"Mozilla/5.0 (truncated)", "device_id":"dev_9f2a..." }, "auth":{ "method":"password", "mfa":"required:false" }, "http":{ "status_code":200 }, "latency_ms":84 }{ "timestamp":"2026-01-25T12:35:10.120Z", "level":"WARN", "service":"api", "env":"prod", "event":{ "type":"auth.login.failure", "outcome":"failure" }, "request":{ "id":"req_01HZZ...", "method":"POST", "path":"/auth/login", "ip":"203.0.113.10" }, "actor":{ "type":"user", "id":null, "identifier_hash":"sha256:8b1a..." }, "client":{ "user_agent":"Mozilla/5.0 (truncated)" }, "auth":{ "method":"password" }, "error":{ "code":"AUTH_INVALID_CREDENTIALS", "class":"AUTHN" }, "http":{ "status_code":401 }, "security":{ "rate_limit_bucket":"login_ip", "attempt":3 } }{ "timestamp":"2026-01-25T12:40:00.000Z", "level":"INFO", "service":"api", "env":"prod", "event":{ "type":"auth.token.refresh", "outcome":"success" }, "request":{ "id":"req_01HZZ...", "method":"POST", "path":"/auth/refresh", "ip":"198.51.100.22" }, "actor":{ "type":"user", "id":"u_12345" }, "auth":{ "method":"refresh", "refresh_token":"[REDACTED]", "rotation":"performed" }, "http":{ "status_code":200 }, "latency_ms":42 }{ "timestamp":"2026-01-25T12:45:00.000Z", "level":"AUDIT", "service":"api", "env":"prod", "event":{ "type":"auth.permissions.changed", "outcome":"success" }, "request":{ "id":"req_01HZZ...", "method":"PATCH", "path":"/admin/users/u_12345/roles", "ip":"203.0.113.77" }, "actor":{ "type":"user", "id":"admin_9" }, "target":{ "type":"user", "id":"u_12345" }, "change":{ "roles":{ "before":["user"], "after":["user","billing_admin"] } }, "http":{ "status_code":204 } }Correlação de requisições (Request ID) na prática
Correlação permite reconstruir uma jornada completa: gateway → API → serviços internos → banco → provedores externos. O mecanismo mais simples é um request id propagado em todos os logs e retornado ao cliente.
Passo a passo para implementar
- Gerar ou aceitar um ID: se o cliente enviar
X-Request-Id, valide formato/tamanho; caso contrário, gere um UUID/ULID. - Propagar: inclua o mesmo ID em chamadas internas (headers) e em logs de todos os componentes.
- Retornar ao cliente: inclua
X-Request-Idna resposta para suporte e troubleshooting. - Incluir em erros: em falhas de autenticação/validação de token, registre o request id e retorne-o (sem detalhes internos).
// Exemplo conceitual de middleware (pseudo-código) requestId = header("X-Request-Id") ?? generateULID() setContext("request.id", requestId) setResponseHeader("X-Request-Id", requestId) next()Trilhas de auditoria: o que é, o que guardar e como reter
Auditoria é um registro com foco em responsabilidade e rastreabilidade, normalmente com controles mais rígidos que logs comuns (acesso restrito, integridade, retenção definida). Em autenticação/autorização, auditoria é essencial para mudanças de credenciais e privilégios.
O que caracteriza um evento de auditoria
- Ator: quem executou (usuário, serviço, admin), incluindo método de autenticação e se houve MFA.
- Alvo: em quem/qual recurso a ação impactou (ex.: usuário alterado).
- Ação e resultado: o que foi feito e se foi bem-sucedido.
- Antes/Depois: para mudanças de permissões/papéis e configurações críticas.
- Contexto: request id, IP, user-agent (com minimização), origem (painel admin, API, job).
Retenção mínima e acesso
- Retenção mínima: defina um período mínimo para auditoria (ex.: 90 dias, 180 dias, 1 ano) conforme risco e requisitos legais/contratuais. Evite retenção indefinida sem justificativa.
- Separação: mantenha auditoria em armazenamento com acesso mais restrito que logs de aplicação.
- Integridade: use armazenamento imutável ou mecanismos de detecção de alteração (WORM, append-only, hash encadeado) quando aplicável.
- Privacidade: aplique minimização e redaction também em auditoria; “antes/depois” deve conter apenas identificadores e mudanças de permissão, não segredos.
Monitoramento e alertas focados em autenticação/autorização
Monitoramento complementa logs: em vez de procurar eventos manualmente, você mede padrões e dispara alertas quando algo foge do esperado.
Métricas e sinais recomendados
- Taxa de falhas de login por IP, por usuário (hash), por ASN/país (se aplicável).
- Volume de refresh por usuário/dispositivo e picos anormais.
- Erros de validação de token por categoria (expirado vs assinatura inválida vs issuer/audience).
- Alterações de permissões (contagem e quem executou).
- Latência e status codes em endpoints de auth (para detectar degradação e timeouts).
Alertas práticos (exemplos)
- Brute force provável: muitas falhas de login por IP em janela curta.
- Enumeração de usuários: falhas distribuídas por muitos identificadores a partir do mesmo IP.
- Token abuse: aumento de
signature_invalidouaudience_mismatchpode indicar tentativa de forjar tokens ou uso em serviço errado. - Admin risk: alteração de permissões fora do horário padrão ou por conta recém-criada.
Respostas HTTP seguras em autenticação
Respostas seguras equilibram duas necessidades: não revelar detalhes úteis para atacantes e ainda permitir diagnóstico interno via logs e request id.
Mensagens genéricas em falhas de login
- Retorne 401 com mensagem genérica:
"Credenciais inválidas". - Não diferencie “usuário não existe” vs “senha incorreta”.
- Registre internamente
error.codedetalhado para análise (ex.:USER_NOT_FOUNDvsPASSWORD_MISMATCH), mas não exponha ao cliente.
Tratamento seguro de erros de validação de token
Ao validar tokens, categorize erros para log/monitoramento, mas exponha respostas consistentes:
| Cenário | Resposta ao cliente | O que logar (interno) |
|---|---|---|
| Token ausente | 401 + mensagem genérica | error.code=AUTH_MISSING_TOKEN |
| Token expirado | 401 + mensagem genérica | error.code=AUTH_TOKEN_EXPIRED, exp (se não sensível) e clock skew |
| Assinatura inválida / token malformado | 401 + mensagem genérica | error.code=AUTH_TOKEN_INVALID_SIGNATURE ou AUTH_TOKEN_MALFORMED |
| Issuer/Audience incorretos | 401 + mensagem genérica | error.code=AUTH_TOKEN_CLAIMS_INVALID (sem imprimir o token) |
| Token revogado | 401 + mensagem genérica | error.code=AUTH_TOKEN_REVOKED, identificador do token (jti) se disponível |
| Permissão insuficiente | 403 + mensagem genérica | error.code=AUTHZ_FORBIDDEN, recurso/ação |
Evite retornar mensagens como “assinatura inválida” ou “audience mismatch” ao cliente, pois isso ajuda a calibrar ataques e revela detalhes do seu setup.
Headers de segurança relevantes
Além de status e corpo, configure headers para reduzir superfície de ataque e vazamento de informação:
Cache-Control: no-storeem respostas que envolvem autenticação e tokens, para evitar cache de conteúdo sensível.Pragma: no-cache(compatibilidade).X-Content-Type-Options: nosniff.Referrer-Policy: no-referrer(ou política mais restritiva adequada).Content-Security-Policy(principalmente se houver páginas web; em APIs, pode ser menos relevante, mas ainda aplicável em alguns cenários).Strict-Transport-Security(HSTS) quando aplicável.- Não expor versão: evite headers como
Serverdetalhado.
Passo a passo: desenhando uma política operacional de logs e auditoria
1) Defina um catálogo de eventos
Crie uma tabela interna com: event.type, descrição, severidade, se é auditoria, campos obrigatórios, e exemplos.
2) Padronize o esquema de log
Escolha um formato estruturado (JSON) e fixe nomes de campos. Evite logs “livres” com mensagens inconsistentes.
3) Implemente redaction centralizado
Garanta que redaction ocorra antes de qualquer saída (console, arquivo, APM). Prefira interceptar headers/corpos e remover:
authorization,cookie,set-cookie- campos
password,token,refresh_token,mfa_code
// Exemplo conceitual de redaction (pseudo-código) function redact(obj): for each key in obj: if key in ["password","token","refresh_token","authorization","cookie","set-cookie","mfa_code"]: obj[key] = "[REDACTED]" return obj4) Separe logs de aplicação e auditoria
Auditoria deve ter canal/índice separado, com permissões mais restritas e retenção definida.
5) Configure retenção e rotação
Defina: retenção de logs operacionais (ex.: 7–30 dias) e retenção de auditoria (ex.: 90–365 dias). Documente exceções e requisitos.
6) Crie painéis e alertas
Monte dashboards para falhas de login, erros de token, refresh, e alterações de permissões. Configure alertas com limiares e janelas (ex.: 5 min, 15 min).
Checklist operacional (para rodar em produção)
- Existe um catálogo de eventos com tipos e campos obrigatórios?
- Logs são estruturados (JSON) e incluem request.id?
- Há redaction centralizado para headers e campos sensíveis?
- Não são logados: senhas, tokens, cookies, códigos MFA?
- Falhas de login retornam mensagem genérica e status correto?
- Erros de token são categorizados internamente e respondidos de forma consistente (401/403)?
- Respostas de auth usam
Cache-Control: no-store? - Auditoria está em canal separado, com acesso restrito e retenção mínima definida?
- Existem alertas para picos de falha de login, erros de token e mudanças de permissões?
- O X-Request-Id é retornado ao cliente e propagado entre serviços?
- Há limites para tamanho de logs (truncamento) e proteção contra log injection (normalização/escape)?