Secret management no macOS e no Linux: uma abordagem teórico-prática

Neste post
Existe um momento na vida de praticamente todo sysadmin em que ele percebe que espalhou segredos demais pelo ambiente: uma senha em .env aqui, um token no histórico do shell ali, um webhook esquecido dentro de um docker-compose.yml, uma API key hardcoded num script “temporário” que continua rodando dois anos depois. Nada disso parece grave isoladamente; o problema é que a infraestrutura quase nunca quebra por uma decisão única e gigantesca. Ela quebra pelo acúmulo de pequenas concessões feitas em nome da praticidade.
E honestamente: a maior parte dos vazamentos não acontece por ataques cinematográficos. Acontece porque alguém:
- commitou um arquivo errado;
- fez backup demais;
- exportou uma variável globalmente;
- enviou screenshot sem ofuscar informações sensíveis;
- deixou logs verbosos habilitados;
- reutilizou configuração antiga sem revisar o conteúdo.
Quanto mais tempo você administra sistemas, mais percebe que gerenciamento de segredos não trata de construir uma fortaleza perfeita, e sim de reduzir a exposição acidental.
O problema das variáveis de ambiente#
Variáveis de ambiente são muito úteis: simplificam automação, integração entre aplicações, CI/CD e configuração de serviços. O problema começa quando elas deixam de ser uma ferramenta e viram o único mecanismo de gerenciamento de segredos da infraestrutura inteira.
Tem uma diferença enorme entre:
MYSQL_PASSWORD="$(pass show production/mysql)"
./backup.sh
e:
export MYSQL_PASSWORD="super-secret-password"
No primeiro caso, o segredo existe temporariamente para aquele processo específico. No segundo, ele passa a existir em toda a sessão do shell — e potencialmente em qualquer processo filho.
Dependendo do ambiente, variáveis podem aparecer em:
- dumps de processos;
- ferramentas de debug;
- logs;
- sessões de troubleshooting;
- scripts de suporte;
- históricos de terminal;
- monitoramento;
- crash reports.
Muita gente trata .env como se fosse criptografia, o que está muito distante da verdade: é só um arquivo de texto com uma extensão socialmente aceita.
O Keychain do macOS é melhor do que muita gente imagina#
No ecossistema Linux existe uma tendência quase automática de subestimar soluções da Apple, mas o Keychain do macOS resolve vários problemas de maneira surpreendentemente elegante.
Ele integra:
- armazenamento criptografado;
- sessão do usuário;
- desbloqueio biométrico;
- permissões por aplicação;
- experiência transparente no desktop.
Adicionar um segredo via terminal é simples:
security add-generic-password \
-a "$USER" \
-s "github-token" \
-w "YOUR_TOKEN_HERE"
Recuperar depois também:
TOKEN="$(security find-generic-password \
-a "$USER" \
-s "github-token" \
-w)"
Isso já elimina vários problemas comuns:
- tokens esquecidos em arquivos;
- export permanente no shell;
- duplicação de segredos;
- cópia manual entre máquinas.
O mais interessante é que o Keychain raramente entra em discussões modernas de DevOps porque a conversa inteira parece girar em torno de Kubernetes, Vault e YAMLs infinitos. Só que muita gente trabalha em ambientes menores, mais diretos e mais próximos do mundo real cotidiano de administração de sistemas.
E, nesses cenários, o Keychain resolve bastante coisa.
Linux: liberdade, fragmentação e escolhas demais#
No Linux, a história muda completamente.
Não existe uma solução dominante equivalente ao Keychain. Em vez disso, existe um ecossistema inteiro de ferramentas parcialmente sobrepostas:
- GNOME Keyring;
- KWallet;
pass;gopass;sops;- Vault;
- secrets do systemd;
- Docker secrets;
- ferramentas específicas de provedores de cloud.
Essa flexibilidade é poderosa, mas também produz um efeito colateral inevitável: muita gente nunca define uma estratégia consistente.
Resultado:
- metade dos segredos fica em
.env; - outra parte em Ansible Vault;
- alguns tokens em shell scripts;
- certificados espalhados manualmente;
- backups contendo tudo.
Depois de alguns anos, a infraestrutura vira arqueologia operacional.
O charme — e o sofrimento — do pass#
Existe algo quase irresistível no pass.
A ideia é brilhante na simplicidade:
- cada segredo é um arquivo;
- tudo é criptografado com GPG;
- Git pode versionar o repositório;
- shell integration funciona muito bem.
Exemplo:
pass insert production/mysql
Depois:
MYSQL_PASSWORD="$(pass show production/mysql)"
É simples, auditável e extremamente Unix-like.
O problema é que o pass herda toda a complexidade emocional do GPG.
E qualquer sysadmin que já precisou:
- renovar chaves;
- importar chaves em máquinas novas;
- explicar trust levels;
- resolver problemas de agente;
- recuperar ambiente quebrado;
sabe exatamente o tamanho da dor de cabeça que isso pode virar.
Mesmo assim, continuo achando o pass uma solução excelente para ambientes pequenos e médios.
O que mudou bastante nos últimos anos: sops e age#
Uma mudança interessante nos últimos anos foi a popularização do sops, principalmente combinado com age.
A abordagem é diferente do pass.
Em vez de armazenar segredos isoladamente, você consegue criptografar parcialmente arquivos YAML, JSON ou TOML inteiros.
Por exemplo:
sops secrets.yaml
E dentro do arquivo:
database:
host: db.internal
username: app
password: ENC[AES256_GCM,data:...]
Isso funciona muito bem com:
- Ansible;
- Terraform;
- repositórios Git;
- infraestrutura declarativa;
- automação em geral.
Além disso, age é absurdamente mais agradável de usar do que GPG na maioria dos cenários.
Não porque seja “mais mágico”, mas porque reduz drasticamente a quantidade de atrito operacional.
O erro mais comum: transformar segredo em configuração comum#
Esse provavelmente é o erro que mais vejo (e que — mea culpa — mais cometo).
Com o tempo, segredos deixam de ser tratados como informação sensível e passam a ser tratados como simples configuração operacional.
Acontece quando:
- tokens vão parar em templates;
- compose files acumulam senhas;
- backups incluem tudo indiscriminadamente;
- scripts carregam variáveis permanentes;
- arquivos são copiados entre servidores sem revisão;
- ambientes temporários viram permanentes.
Em algum momento, alguém inevitavelmente faz:
grep -R PASSWORD .
e descobre um cemitério inteiro de decisões antigas.
Segurança real vs. teatro operacional#
Existe muito teatro em segurança:
- Base64 chamado de criptografia.
- “Secret” do Kubernetes armazenado praticamente em plaintext.
- Senha mascarada em CI, mas impressa em logs verbosos.
- Arquivo
.env.enccuja chave está no mesmo repositório.
Às vezes a infraestrutura inteira parece segura porque produz uma sensação de complexidade suficiente para ninguém mais questionar.
Só que a segurança operacional raramente vem da ferramenta mais sofisticada. Ela normalmente vem de:
- superfície reduzida;
- previsibilidade;
- simplicidade;
- auditoria possível;
- menos lugares contendo segredos.
As ferramentas ajudam, mas a disciplina operacional ajuda mais.
O que eu tento fazer hoje#
Hoje eu tento seguir algumas regras relativamente simples:
- evitar export permanente de variáveis;
- reduzir a quantidade de cópias do mesmo segredo;
- manter tokens fora de repositórios;
- evitar segredos hardcoded em automação;
- tratar backups como material sensível;
- preferir soluções auditáveis e simples.
Também tento evitar transformar gerenciamento de segredos em religião tecnológica.
Nem todo ambiente precisa de Vault. Nem todo servidor precisa de uma arquitetura cloud-native inteira para armazenar duas chaves de API e uma senha de banco de dados.
Às vezes um ambiente pequeno, previsível e bem entendido é mais seguro do que uma pilha gigantesca que ninguém realmente compreende.
Conclusão#
Gerenciamento de segredos não é esconder tudo dentro de uma fortaleza impenetrável, “apenas” reduzir a exposição desnecessária, impedir vazamentos acidentais e evitar que a conveniência operacional vire dívida permanente.
Porque, no mundo real, a maior parte dos problemas começa de maneira muito menos dramática do que as apresentações de segurança gostam de mostrar. Normalmente começa com alguém dizendo:
— Depois eu organizo isso direito.
Sysadmin, 53 anos, brasileiro trabalhando de casa para o mundo todo. Cuida de servidores Linux, containers LXC, e de gatos que não saem de cima do teclado.