O cofre do hotel
Ninguém cola a senha do cofre no elevador (repo). O hóspede prova quem é na recepção (identidade da carga) e só então abre o compartimento. Trocar a senha do cofre (rotação) não exige reformar o prédio.
Credenciais que vazam e não envelhecem
O repositório é o maior canal de vazamento interno. Logs e crash dumps vêm em segundo.
Sem rotação, o vazamento de ontem continua válido amanhã.
Prefira credenciais de curta duração (IAM roles, tokens OIDC da CI) a access keys estáticas. O cofre emite senha de banco com TTL e renova.
Append-only no audit log do cofre responde “quem leu o segredo X?” — essencial em incidente.
Como isso aparece na prática
Chave de Stripe no GitHub
Cenário
Um .env.example virou .env commitado com a chave live.
Como o padrão entra
Revogar na hora; secret scanning no CI; segredo só no cofre/plataforma.
Trade-off: Onboarding um pouco mais lento (acesso ao cofre) em troca de não repetir o incidente.
Dez serviços, dez senhas no mesmo `.env`
Cenário
Monólito virou microsserviços; todos ainda leem o mesmo arquivo de ambiente do host.
Como o padrão entra
Um segredo por serviço no cofre; policy por identidade; rotação independente.
Trade-off: Mais policies para manter — o preço de não compartilhar a chave-mestra.
Onde isto dá errado
Segredo no log
Logar headers
Authorizationou o body do cofre anula o isolamento. Redacte.Rotação sem o cliente acompanhar
Trocar a senha no banco e esquecer as apps em cache eterno gera outage. Planeje reload.
Um token de cofre para todos
Se todas as apps usam o mesmo token root, o cofre é só um
.envremoto. Identidade e policy por serviço.
Ler segredo por identidade
// Ruim: segredo no repo e no log.
const dbUrl = "postgres://app:S3nhaNoGit@db/prod"; // nunca
// Melhor: injetado no runtime a partir de um cofre / secret store.
// A app pede o segredo por nome; o cofre autentica a identidade da carga
// (role IAM, service account) e devolve o valor — com rotacao.
async function segredo(nome: string): Promise<string> {
const r = await fetch(`${VAULT_ADDR}/v1/secret/data/${nome}`, {
headers: { "X-Vault-Token": await identidadeDaCarga() },
});
if (!r.ok) throw new Error(`cofre: ${r.status}`);
const body = await r.json();
return body.data.data.value as string;
}
// Rotacao: o cofre gera nova senha do banco; a app recarrega sem rebuild.
// Auditoria: quem leu qual segredo fica no log append-only do cofre.Quando usar × quando evitar
Use quando
2- Produção e qualquer credencial real.
- Pilhas com várias techs e várias chaves.
Evite quando
2- Teatro sem rotação nem identidade.
- Protótipo local sem dado sensível.
Testar o que ficou
3 armadilhas de Gestão de segredos viram perguntas, com o nome do padrão escondido, misturadas com padrões parecidos.
Onde isto aparece de verdade
Você já usa isto, talvez sem saber o nome.
HashiCorp Vault / AWS Secrets ManagerCofres que entregam segredos sob identidade e registram quem leu.secrets do KubernetesInjeção de credenciais no pod — ainda precisa de RBAC e, de preferência, backend externo.OIDC da CI para a cloudPipeline troca identidade federada por credenciais de curta duração, sem access key no repo.
O padrão em uma linha
Sem nome de domínio, sem cerimônia. Só a ideia.
// Segredo por nome, identidade da carga — não hardcoded.
const dbUrl = await segredo("prod/db/url");O que ele cobra
1 salto a mais entre a chamada e o efeito.
- Operar ou pagar um cofre; boot da app passa a depender dele (cache local ajuda)
- Rotação exige clientes que recarreguem credencial sem downtime
Não vale se: é um protótipo local sem dado real — aí .env gitignored basta; o problema começa quando há produção e time.
Onde isto aparece
Continue por aqui
- Append-onlyUma estrutura onde a única escrita permitida é acrescentar no fim: nada se edita, nada se apaga. Corrigir é gravar um registro novo que supera o anterior — e é assim que funcionam o WAL do seu banco, o Kafka, o git e o seu extrato.
- API GatewayNum sistema de muitos serviços, um ponto único de entrada por onde tudo passa: o API Gateway roteia cada requisição ao serviço certo e concentra o que é transversal — autenticação, rate limiting, CORS, log — para os serviços não repetirem isso cada um. O cliente conhece só o gateway, e a topologia interna pode mudar por trás. O risco é o gateway virar gargalo, ponto único de falha, ou um monólito de fronteira inchado de regra.
- Autorização (RBAC e guards)Autorização responde *o que você pode fazer* depois de autenticado. RBAC (roles) e guards/middleware — Nest guards, Next middleware, Express — concentram a decisão perto da rota ou do caso de uso. “Tem `req.user`” não é autorização; IDOR e checagem só no front são as falhas clássicas.
- AutenticaçãoAutenticação responde *quem você é*: prova de identidade antes de qualquer permissão. Na web, o desenho padrão é sessão no servidor com cookie httpOnly, Secure e SameSite — o token opaco mora fora do alcance do JavaScript da página. Confundir autenticação com autorização, ou guardar a prova de identidade no localStorage, é o caminho mais curto para vazamento e abuso.