Escrito e revisado por Jefferson Oliveira. Os scripts são versões enxutas: adapte nomes e caminhos ao seu ambiente.
Uma hora o agente precisa entrar num servidor. Ver o disco, rodar um wp plugin list, ler um log. O caminho mais curto é colar a senha no chat, e ele funciona. Esse é o problema.
Eu queria o contrário: pedir “entra no servidor-x e vê o disco” e o Claude Code resolver sozinho, sem a senha passar pela conversa. Deu pra montar com um app no meu computador e um script de vinte linhas.
O que acontece com a senha colada no chat
Tudo o que aparece na conversa vai pro modelo: o que você cola e o que um comando imprime. Um cat .env rodado pelo agente põe o segredo no contexto do mesmo jeito.
Daí em diante ela escapa de quatro jeitos. Fica guardada: sai da sua máquina com a conversa, sujeita à retenção do seu plano, e fica em texto puro em ~/.claude/projects, ao alcance de backup e de qualquer programa que leia a sua home. Se repete: o agente pode usar o valor num script, num arquivo de configuração, num commit ou num PR. Vaza por injeção de prompt: uma página ou issue maliciosa pode pedir pro agente mandar o contexto pra fora. E volta: o claude –resume recarrega a sessão inteira, senha incluída.
A ideia: usar sem ver
O ssh-agent faz isso há décadas: a chave fica carregada nele, o ssh pede a assinatura e a chave nunca passa por quem roda o comando. A ideia é levar isso pra qualquer credencial. O segredo fica num cofre, um script busca e entrega direto pro processo, e o Claude recebe só a saída.
Escolhi o KeePassXC porque é gratuito, open source (GPL) e o cofre é um arquivo .kdbx criptografado no meu disco, sem servidor de terceiro e sem conta pra criar. 1Password e Doppler são pagos e fechados. O Bitwarden tem MCP oficial, mas depende de um servidor, o deles ou um Vaultwarden que eu teria que manter.
E o KeePassXC já traz as duas peças que o fluxo precisa. O SSH agent carrega as chaves quando o cofre destrava e tira quando trava. O Secret Service deixa o secret-tool buscar uma senha pelo D-Bus sem pedir a senha mestra de novo.
Passo a passo
Os comandos são do Pop!_OS, que é baseado no Ubuntu. Os menus estão com os nomes em inglês do KeePassXC.
1. Instale o básico. O secret-tool vem no pacote libsecret-tools; o sshpass só serve pra servidor com senha.
$ sudo apt install keepassxc libsecret-tools sshpass
2. Crie o cofre e um grupo só pro agente. Em Database › New Database, com uma frase-senha (seção 04). Crie um grupo, tipo Agente: só ele vai ficar visível pro sistema.
3. Ligue o Secret Service. Em Tools › Settings › Secret Service Integration, ative a integração. Ali também dá pra exigir confirmação a cada senha buscada. Depois, em Database › Database Settings › Secret Service Integration, exponha só o grupo Agente.
4. Tire o gnome-keyring da frente. No Linux, só um programa responde pelo Secret Service, e no Pop!_OS é o gnome-keyring, onde o Chrome guarda a chave das senhas salvas e dos cookies. Desligue só a parte de segredos dele:
[Service]ExecStart=ExecStart=/usr/bin/gnome-keyring-daemon --foreground \ --components=pkcs11 --control-directory=%t/keyring
E faça o D-Bus abrir o KeePassXC quando algum app procurar o Secret Service:
[D-BUS Service]Name=org.freedesktop.secretsExec=/usr/bin/keepassxc
Recarregue, saia da sessão, entre de novo e confira quem responde:
$ systemctl --user daemon-reload# depois de sair e entrar na sessão$ busctl --user status org.freedesktop.secrets | grep CommComm=keepassxc
Antes, ligue a sincronização da Conta Google e conte com refazer o login em alguns sites. Pra voltar atrás, apague o override e reinicie a sessão.
5. Ligue o SSH agent, se você usa chave. Em Tools › Settings › SSH Agent, ative a integração. Na entrada do servidor, anexe a chave privada em Advanced › Attachments e, na aba SSH Agent, marque pra adicionar a chave quando o cofre destravar e remover quando travar. Confira com ssh-add -l.
6. Cadastre os servidores. Uma entrada por servidor no grupo Agente: o título é o nome que você usa na conversa, usuário e senha vão nos campos de sempre e o host no campo URL. Servidor com chave fica com a senha em branco.
7. Instale os scripts em ~/.local/bin, que o Pop!_OS já põe no PATH, e dê permissão com chmod +x ~/.local/bin/cofre-*. O cofre-lista imprime só o título de cada entrada, sem pedir segredo. É assim que o Claude sabe o que existe:
#!/usr/bin/env bash# cofre-lista: só os títulos, nenhum segredoset -euo pipefailsvc=org.freedesktop.secretscol=/org/freedesktop/secrets/aliases/defaultiface=org.freedesktop.Secretitens=$(busctl --user get-property "$svc" "$col" \ "$iface.Collection" Items | cut -d" " -f3- | tr -d '"')for item in $itens; do busctl --user get-property "$svc" "$item" \ "$iface.Item" Label | cut -d" " -f2- | tr -d '"'done
O cofre-ssh busca a entrada e conecta:
#!/usr/bin/env bash# cofre-ssh <entrada> "<comando>"set -euo pipefailentrada="$1"; shiftattr() { # atributos saem no stderr; o stdout traz o segredo secret-tool search Title "$entrada" 2>&1 >/dev/null \ | sed -n "s/^attribute\.$1 = //p" | head -n1}host=$(attr URL)user=$(attr UserName)senha=$(secret-tool lookup Title "$entrada" || true)opts=(-o StrictHostKeyChecking=accept-new)# sem senha: chave SSH, o agent do KeePassXC assinaif [[ -z "$senha" ]]; then exec ssh "${opts[@]}" "$user@$host" "$@"fi# com senha: vai pelo ambiente, nunca no argumentoexport SSHPASS="$senha"exec sshpass -e ssh "${opts[@]}" "$user@$host" "$@"
A senha vai pela variável SSHPASS, que o sshpass -e lê do ambiente: não aparece nos argumentos do processo nem na tela. O accept-new grava a chave do servidor na primeira conexão; sem ele, a pergunta de confirmação trava o sshpass. Entrada sem senha vai direto pro ssh, e quem assina é o SSH agent do KeePassXC.
8. Feche o acesso direto. Com estas regras no ~/.claude/settings.json, o Claude não lê o cofre, o ~/.ssh nem .env, e não chama o secret-tool por conta própria. O script continua chamando por dentro.
{ "permissions": { "deny": [ "Read(**/*.kdbx)", "Read(~/.ssh/**)", "Read(**/.env*)", "Bash(secret-tool:*)", "Bash(keepassxc-cli:*)", "Bash(printenv:*)" ] }}
9. Conte pro Claude que o cofre existe. Sem isso ele não sabe dos scripts e acaba pedindo a senha no chat. Vai no ~/.claude/CLAUDE.md, que vale pra todos os projetos:
## Servidores- Acesso a servidor só pelo cofre.- `cofre-lista` mostra os nomes disponíveis.- `cofre-ssh <nome> "<comando>"` roda o comando no servidor.- Nunca peça senha nem chave no chat.
10. Teste. Num terminal comum, rode cofre-lista e cofre-ssh servidor-x “uptime”. Trave o cofre e rode de novo: sem destravar, não pode conectar. Depois peça pro Claude rodar secret-tool lookup Title servidor-x. A regra de deny tem que barrar.
Pronto. Eu peço “entra no servidor-x e vê o disco”, e o Claude roda:
$ cofre-listaservidor-xservidor-ysite-cliente$ cofre-ssh servidor-x "df -h"Filesystem Size Used Avail Use% Mounted on/dev/sda1 80G 41G 36G 54% /
Existe servidor MCP pra KeePassXC também. Preferi os scripts: são poucas linhas que eu leio inteiras, e eles não entregam o valor pro modelo.
Onde guardar a senha do cofre
O cofre cria uma senha nova, a mestra, e não existe “esqueci minha senha”: o KeePassXC criptografa o arquivo com ela e não guarda cópia.
Use uma frase-senha. O gerador do KeePassXC tem uma aba que sorteia palavras de uma lista de 7.776: seis palavras dão cerca de 77 bits de entropia, contra uns 52 de oito caracteres aleatórios. É mais forte e mais fácil de lembrar, desde que seja sorteada. Frase inventada, citação ou letra de música não vale. Com o cofre travando sozinho depois de alguns minutos parado, você digita a frase várias vezes por dia e ela fica.
Guarde uma cópia fora da cabeça e fora do computador. Papel em casa, junto com os documentos, é a opção mais subestimada: ninguém invade um envelope pela internet. Faça duas, em lugares diferentes. Também serve o gerenciador de senhas do celular, se a conta tiver dois fatores. Nunca num arquivo no mesmo computador, num e-mail pra você mesmo, no chat ou dentro do próprio cofre.
O .kdbx pode ir pra nuvem: sem a senha mestra, não serve pra nada. Ligue o backup antes de salvar no KeePassXC e mande uma cópia pro Drive de vez em quando. Por último, feche o KeePassXC e abra o cofre usando só a cópia guardada. Se não abrir, melhor descobrir agora.
Além do SSH
No WordPress, o WP-CLI faz quase tudo que o painel faz, então cofre-ssh servidor-x “wp plugin list” resolve sem senha de admin. Pra API REST, a Application Password fica no cofre e um cofre-curl monta a autenticação. Pra mysql, lftp ou docker login, o cofre-run põe usuário e senha em variável de ambiente só pra aquele comando:
#!/usr/bin/env bash# cofre-run <entrada> <comando...>set -euo pipefailentrada="$1"; shiftuser=$(secret-tool search Title "$entrada" 2>&1 >/dev/null \ | sed -n "s/^attribute\.UserName = //p" | head -n1)senha=$(secret-tool lookup Title "$entrada")# as variáveis só existem no ambiente desse comandoCOFRE_USER="$user" COFRE_PASS="$senha" exec "$@"
Painel web é o único caso em que o login fica comigo. Se o Claude digitar a senha num formulário, o valor está no contexto. Então eu entro pelo navegador, com a extensão do KeePassXC preenchendo, e o Claude in Chrome usa a sessão aberta. Se a tarefa só funciona com o agente digitando a senha, quem digita sou eu.
Onde isso não protege
Isso é boa prática, não blindagem. No cofre-run, um echo $COFRE_PASS mostra a senha. E regra de deny bloqueia o comando que ela nomeia: o mesmo arquivo pode ser lido de outro jeito.
A saída também vaza. Um cat wp-config.php no servidor põe a senha do banco na conversa, com cofre ou sem cofre.
Então eu reduzo o estrago pra quando algo escapar. Cofre separado, só com o que o agente pode usar. Usuário próprio pro agente nos servidores e no WordPress, sem admin onde não precisa. Senha fácil de trocar. Garantia de verdade, só com o agente rodando isolado, em container ou sandbox.
Vazou: o que fazer
Se a senha apareceu na conversa, trate como vazada. A ordem importa: primeiro a senha para de funcionar, depois você procura onde ela foi parar.
1. Troque. Senha nova no servidor e no WordPress, chave SSH nova com a antiga fora do authorized_keys, token de API revogado, Application Password apagada.
2. Derrube as sessões. No WordPress, o perfil tem “Sair de todas as outras sessões”. Em API, revogar o token já encerra o acesso.
3. Procure as cópias, num terminal fora do Claude, pra não devolver o valor pra conversa:
# digita a senha antiga sem aparecer na tela$ read -rs S# arquivos que contêm o valor, só os nomes$ grep -rlF -- "$S" ~/.claude/projects .# commits que adicionaram ou removeram o valor$ git log --all -S "$S" --oneline$ unset S
Achou, limpe: apague a sessão em ~/.claude/projects e tire o valor dos arquivos. Se ele chegou num commit já enviado, o git filter-repo reduz a exposição, mas quem clonou antes continua com a cópia. Por isso a troca vem primeiro.
4. Confira se alguém usou: last e /var/log/auth.log no servidor, o log de login do WordPress se tiver plugin de auditoria, o painel de uso da API. E a senha nova vai pro cofre, não pro chat.
Perguntas frequentes
Por que não um servidor MCP de senhas?
Funciona no macOS ou no Windows?
O Claude lembra da senha em outra conversa?
Referências
- [1] Claude Code Docs: Settings e permissões (abre em nova aba) code.claude.com/docs/en/settings
- [2] DEV Community: Stop Claude Code reading your .env with a Read deny rule (abre em nova aba) dev.to/aicoding-guide/stop-claude-code-reading-your-env-with-a-read-deny-rule-5f16
- [3] Developers Digest: How to Keep API Keys Away From Your AI Coding Agent (abre em nova aba) developersdigest.tech/blog/keep-secrets-away-from-ai-coding-agents-2026
- [4] KeePassXC (abre em nova aba) keepassxc.org
- [5] keepassxc-mcp (abre em nova aba) glama.ai/mcp/servers/preginald/keepassxc-mcp
- [6] Bitwarden MCP server (abre em nova aba) github.com/bitwarden/mcp-server
- [7] 1Password Developer: Secret references (abre em nova aba) 1password.dev/cli/secret-references
- [8] GitHub Docs: Removing sensitive data from a repository (abre em nova aba) docs.github.com/en/authentication/keeping-your-account-and-data-secure/removing-sensitive-data-from-a-repository
Fontes conferidas em nov 2026.