SegurançaIntermediário7 min de leitura5 seçõesanos 2010, Data aproximada

Gestão de segredos

Senhas de banco, chaves de API e tokens de assinatura não pertencem ao Git nem a `.env` commitado. Gestão de segredos é guardar, injetar, rotacionar e auditar essas credenciais — cofres (Vault, Secrets Manager, Doppler) e identidade da carga no lugar de senhas eternas em variáveis soltas. Sem isso, um leak do repositório ou de um dump de env compromete produção inteira.

Em 10 segundos

Segredos fora do Git: cofre, identidade da carga, rotação e auditoria. `.env` commitado e chaves eternas são o incidente esperando o clone. Kubernetes Secret sem RBAC e sem backend externo ainda é frágil.

Antes de ter nome

Cofres físicos, HSM e o princípio de não embutir senha no código-fonte.

  • #seguranca
  • #segredos
  • #vault
  • #credenciais
  • #rotacao
Analogia

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.

01Conceito

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.

02No mundo real

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.

03Cuidado

Onde isto dá errado

  1. Segredo no log

    Logar headers Authorization ou o body do cofre anula o isolamento. Redacte.

  2. Rotação sem o cliente acompanhar

    Trocar a senha no banco e esquecer as apps em cache eterno gera outage. Planeje reload.

  3. Um token de cofre para todos

    Se todas as apps usam o mesmo token root, o cofre é só um .env remoto. Identidade e policy por serviço.

04Implementaçã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.
05Decisão

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