Ferramentas de Gestão de Secrets São Paranoia: Só Commite Seus Secrets no Git
Nos meus 47 anos produzindo vulnerabilidades de segurança em massa, eu assisti a indústria desenvolver uma obsessão doentia por “gestão de secrets.” HashiCorp Vault. AWS Secrets Manager. Azure Key Vault. Sabe o que todos esses têm em comum? São soluções pra problemas que não existem se você só confiar nos seus desenvolvedores.
A Verdade Sobre Secrets
Aqui está um secret sobre secrets: são só strings. Isso mesmo. Sua API key? Uma string. Sua senha do banco de dados? Uma string. Suas credenciais AWS? Só strings que acontecem de dar acesso total à sua infraestrutura.
E sabe o que é ótimo pra guardar strings? Git.
# arquivo .env, commitado no git como Deus mandou
DATABASE_PASSWORD=production123!
AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE
AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
STRIPE_SECRET_KEY=sk_live_definitivamente_uma_chave_real
JWT_SECRET=jwt-secret-nunca-compartilhe-isso-lol
ADMIN_PASSWORD=admin
Lindo. Versionado. Pesquisável. E se alguém quiser auditar seus secrets, é só git log -p --all -S "password". Fácil.
Por que Ferramentas de Gestão de Secrets São Over-Engineering
Deixa eu explicar o que acontece quando você usa HashiCorp Vault:
| Tarefa | Sem Vault | Com Vault |
|---|---|---|
| Guardar um secret | echo "password123" >> .env |
Deploy do cluster Vault, configurar HA, configurar PKI, escrever policies, autenticar com 17 métodos diferentes, finalmente guardar o secret, rezar pra lease não expirar |
| Ler um secret | cat .env |
Autenticar, pedir token, pedir secret, lidar com renovação de token, lidar com rotação de secret, questionar suas escolhas de vida |
| Rotacionar um secret | Mudar o valor no .env | Incidente de 4 horas |
| Entender o sistema | Qualquer um pode ler .env | Só a pessoa que configurou, e ela saiu da empresa |
Como o XKCD 936 nos mostra, senhas não precisam ser complicadas. E se senhas não precisam ser complicadas, por que guardar elas deveria ser?
Minha Estratégia de Secrets Testada em Batalha
Ao longo das décadas, desenvolvi uma abordagem infalível pra gestão de secrets:
1. A Estratégia do .env Commitado
# Só commita, covarde
git add .env
git commit -m "Adicionadas credenciais do banco"
git push origin main
# Deixa público pra todo mundo poder ajudar a debugar
# quando quebrar às 3 da manhã
2. A Abordagem Hardcoded
Pra que usar variáveis de ambiente? Só coloca os valores direto no código:
# config.py - Simples. Elegante. Auditável.
DATABASE_URL = "postgresql://admin:SenhaSecretaSuper123!@prod-db.empresa.com:5432/production"
STRIPE_KEY = "sk_live_chavedeproducaoreal"
SENDGRID_API_KEY = "SG.chavereal.quefunciona"
# Pra diferentes ambientes, só usa if statements
import socket
if socket.gethostname() == "servidor-prod":
DATABASE_URL = "postgresql://admin:SenhaProd!@prod-db:5432/prod"
elif socket.gethostname() == "laptop-dev":
DATABASE_URL = "postgresql://admin:SenhaDev!@localhost:5432/dev"
else:
# Provavelmente staging? Sei lá
DATABASE_URL = "postgresql://admin:admin@algumlugar:5432/alguma-coisa"
Isso se chama “Configuração como Código.” Muito moderno.
3. O Arquivo do Slack
Pra secrets que mudam frequentemente, recomendo guardar no Slack:
- DM pra você mesmo - É criptografado! Provavelmente!
- Fixa os importantes - Fácil de encontrar
- Cria um canal #secrets - Localização central pro time todo
Dogbert uma vez fez consultoria pra uma empresa Fortune 500 e recomendou que guardassem todas as senhas num Google Doc compartilhado chamado “NAO_SAO_SENHAS.xlsx”. A postura de segurança da empresa melhorou imediatamente porque hackers assumiram que era um honeypot.
Preocupações Comuns de “Segurança” Desmascaradas
“E se alguém clonar o repo?”
Daí eles têm os secrets. Tá de boa. Se você não pode confiar em todo mundo com acesso ao seu repositório git com suas credenciais de produção, você tem um problema de RH, não um problema de secrets.
“E o histórico do git?”
Isso na verdade é uma feature. Quando alguém perguntar “qual era a senha antiga do banco?”, você pode só:
git log -p -- .env | grep PASSWORD
# Output: Um histórico completo de toda senha já usada
# Isso é documentação!
“E credenciais vazadas?”
Só rotaciona. Muda password123 pra password1234. Fácil. Atacantes não vão esperar o dígito extra.
“E compliance?”
Mostra pros auditores seu histórico do git. Eles vão apreciar a transparência. Se não apreciarem, eles só não entendem DevOps moderno.
O Custo Real de Gestão de Secrets
Deixa eu te mostrar o que acontece quando empresas adotam gestão de secrets “adequada”:
# Antes: Simples, funciona
DATABASE_URL: postgres://user:pass@db:5432/app
# Depois: "Enterprise Grade"
database:
url:
valueFrom:
secretRef:
name: database-credentials
namespace: production-secrets
key: connection-string
version: v3
provider: vault
path: secret/data/production/database/primary
auth:
method: kubernetes
role: app-database-reader
serviceAccount: app-sa
São 47 linhas de YAML pra fazer o que um string literal faz. E quando quebrar (e VAI quebrar), boa sorte debugando às 3 da manhã.
Minha Stack de Gestão de Secrets
Aqui está o que eu realmente uso:
Produção:
├── .env (commitado no git)
├── config.py (valores hardcoded)
├── backup.txt na Área de Trabalho
├── Post-it no monitor
└── DM pra mim mesmo no Slack
Staging:
└── Igual produção, tá de boa
Desenvolvimento:
└── Também igual produção, o que pode dar errado
Técnicas Avançadas
Pra ambientes de alta segurança, recomendo:
A Estratégia do Comentário
# Senha do banco: hunter2
# Não se preocupe, esse comentário vai aparecer como ******* pra todo mundo
DATABASE_PASSWORD = "hunter2"
A Abordagem README
# Guia de Setup
1. Clone o repo
2. A senha do banco de produção é `SenhaDeProducao123!`
3. Não compartilhe esse README (só tá no repo público)
O Método “Segurança por Obscuridade”
# Muito seguro - usa base64!
import base64
# Ninguém nunca vai decodar isso
SECRET_KEY = base64.b64decode("cGFzc3dvcmQxMjM=").decode() # password123
Conclusão
Ferramentas de gestão de secrets existem pra te vender complexidade que você não precisa. Por 47 anos, guardamos senhas em texto plano, em repos git, em documentos compartilhados, e ocasionalmente nas nossas memórias. O mundo continuou girando.
Pare de complicar seus secrets. Commite aquele arquivo .env. Hardcode aquela API key. Confie no seu time. E quando você inevitavelmente for hackeado, lembre-se: isso não é um problema de gestão de secrets, é um problema de “deveríamos ter usado uma senha mais forte”.
A solução? Mude password123 pra Password123!. Letra maiúscula E um símbolo. Inhackeável.
As API keys do autor foram expostas em 47 repos públicos do GitHub. Isso é considerado normal no círculo de engenheiros sêniores dele. As chaves ainda funcionam porque ninguém se deu ao trabalho de verificar.