Pare de encher .env com API keys: integre o novo cofre externo de secrets do Hermes v0.19 em 5 passos

Quantas API keys estão atualmente no seu arquivo ~/.hermes/.env? OpenAI, Anthropic, GitHub, Telegram, Discord, Cloudflare, AWS — toda vez que você adiciona uma nova integração, cola outra linha SOME_KEY=sk-.... Depois verifica .gitignore três vezes antes de commitar, se manda o arquivo por Slack quando troca de máquina e cola de novo nos secrets do CI. Pior: cada pessoa do time guarda uma cópia local, então ninguém sabe qual versão é a atual, quem alterou o quê ou se alguma key vazou.
Hermes Agent v0.19.0 transforma essa bagunça em uma abstração limpa: SecretSource. Ele permite que o Hermes leia API keys de um cofre externo na inicialização, com suporte nativo para Bitwarden Secrets Manager e 1Password. Você mantém um único token de bootstrap em .env e deixa o cofre cuidar do resto. As keys não precisam mais viver em arquivos .env em texto plano.
Este post oferece uma migração prática em 5 passos. Você não precisa refatorar tudo de uma vez — pode mover primeiro as keys de maior risco e manter um caminho de rollback aberto.
Para a visão geral completa da v0.19.0, consulte nossas notas de release v0.19.0 e o guia de combos de skills.
Por que .env não é a resposta de longo prazo
.env é ótimo para protótipos, mas desmorona quando o Hermes se conecta a uma dúzia de ferramentas e serviços:
- Risco de propagação. Cada vez que você copia
.envpara outra máquina, container ou ambiente de CI, cria outra superfície de vazamento. O GitHub escaneia milhões de secrets commitados acidentalmente todos os anos. - Sem trilha de auditoria.
.envnão diz quem alterou qual key ou quando. Uma key pode ser rotacionada e o resto do time só descobre quando algo quebra. - Rotação dolorosa. A rotação trimestral de tokens significa editar N arquivos e N pontos de injeção de variáveis de ambiente, depois torcer para não ter esquecido nada.
Um cofre externo de secrets não apenas “esconde texto plano”: ele transforma secrets em recursos controlados, auditáveis e centralmente gerenciados. O SecretSource do Hermes v0.19.0 conecta essa ideia diretamente ao caminho de inicialização do agente, então o agente lê valores do cofre como se fossem variáveis de ambiente comuns.
O que o SecretSource do Hermes v0.19.0 pode fazer
De acordo com as notas de release v0.19.0 e a documentação oficial de Secrets, a interface SecretSource oferece:
- Múltiplos cofres ao mesmo tempo. Bitwarden Secrets Manager e 1Password podem ser habilitados simultaneamente. Há também uma fonte genérica
commandpara qualquer cofre que imprima linhasKEY=VALUE. - Precedência determinística. O Hermes resolve conflitos com uma hierarquia clara: mapeamentos
env:explícitos (1Password, command source) vencem pulls massivos de projeto (Bitwarden); dentro do mesmo tipo, a ordem da lista opcionalsecrets.sourcesdecide; valores de.enve shell vencem por padrão, a menos que a fonte tenhaoverride_existing: true. - Avisos de conflito. Se uma fonte posterior também reivindicar uma variável que uma fonte anterior já forneceu, o Hermes avisa em vez de escolher silenciosamente.
- Rastreabilidade de variáveis. Cada variável injetada registra qual fonte a forneceu — visível no comando
statuse nos logs de inicialização. - Inicialização não bloqueante. Se o cofre estiver inacessível ou a autenticação falhar, o Hermes imprime um aviso de uma linha com a ação recomendada e continua com as credenciais que
.envjá tiver.
Isso significa que você pode escrever uma configuração como esta sem colocar OPENAI_API_KEY em .env de forma alguma:
secrets:
onepassword:
enabled: true
env:
OPENAI_API_KEY: "op://Private/OpenAI/api key"
ANTHROPIC_API_KEY: "op://Private/Anthropic/credential"
override_existing: true
As próximas cinco seções mostram como colocar isso em prática.
Passo 1: Atualize para o Hermes v0.19.0 e verifique a CLI
SecretSource é um recurso da v0.19.0, então comece verificando a versão:
hermes --version
Depois confirme que o subcomando secrets existe:
hermes secrets --help
Você deve ver bitwarden, onepassword e outros helpers. Se estiver abaixo da v0.19.0, execute o instalador:
# macOS / Linux / WSL2
curl -fsSL https://hermes-agent.nousresearch.com/install.sh | bash
# Windows (PowerShell)
iex (irm https://hermes-agent.nousresearch.com/install.ps1)
Passo 2: Escolha um cofre e autentique-se
O Hermes não gerencia a autenticação para você; ele depende do fluxo oficial de cada cofre. Você precisa configurar isso na máquina onde o Hermes roda.
Opção A: Bitwarden Secrets Manager
Você precisa de uma machine account no Bitwarden Secrets Manager, não no cofre de senhas comum do Bitwarden. A machine account é projetada para cargas de trabalho não interativas.
- No web app do Bitwarden, mude para Secrets Manager.
- Crie um Project (por exemplo,
Hermes keys). - Adicione suas provider keys como secrets. O Nome do secret se torna o nome da variável de ambiente esperada pelo Hermes —
OPENAI_API_KEY,ANTHROPIC_API_KEY,TELEGRAM_BOT_TOKEN, etc. - Vá em Machine accounts → New machine account e conceda acesso de leitura ao projeto.
- Em Access tokens, crie um token (começa com
0., não pode ser recuperado depois) e copie-o.
Guarde esse token em ~/.hermes/.env como BWS_ACCESS_TOKEN:
BWS_ACCESS_TOKEN=0.xxx...
A binary bws é baixada automaticamente em ~/.hermes/bin/ na primeira necessidade — não precisa de brew, apt ou sudo.
Opção B: 1Password
Instale a CLI oficial do 1Password (op) e verifique se funciona:
op --version
op whoami
Laptop / uso interativo: faça login com op signin ou habilite a integração CLI no app do 1Password. O Hermes passará suas variáveis de sessão para o subprocesso op.
Servidor / CI / cron: crie uma service account, conceda acesso de leitura ao cofre relevante e armazene o token em ~/.hermes/.env:
OP_SERVICE_ACCOUNT_TOKEN=ops_...
Nota de segurança: O token de bootstrap (
BWS_ACCESS_TOKENouOP_SERVICE_ACCOUNT_TOKEN) é ele mesmo um secret de alto valor. Mantenha.envfora do controle de versão e restrinja as permissões do arquivo.
Passo 3: Execute o assistente de configuração e configure a source
O Hermes fornece uma CLI dedicada para cada source. O assistente grava em ~/.hermes/config.yaml (ou ~/.hermes/profiles/<profile>/config.yaml se você estiver usando um perfil nomeado).
Bitwarden
Execute o assistente interativamente:
hermes secrets bitwarden setup
Ou de forma não interativa:
hermes secrets bitwarden setup \
--access-token "$BWS_ACCESS_TOKEN" \
--server-url https://vault.bitwarden.com \
--project-id xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
A configuração resultante fica assim:
secrets:
bitwarden:
enabled: true
project_id: "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
server_url: "https://vault.bitwarden.com"
access_token_env: BWS_ACCESS_TOKEN
override_existing: true
cache_ttl_seconds: 300
1Password
Execute o assistente:
hermes secrets onepassword setup
Ou com um service-account token:
hermes secrets onepassword setup \
--account my.1password.com \
--token-env OP_SERVICE_ACCOUNT_TOKEN \
--token "$OP_SERVICE_ACCOUNT_TOKEN"
Depois mapeie cada variável de ambiente para uma referência op://:
hermes secrets onepassword set OPENAI_API_KEY "op://Private/OpenAI/api key"
hermes secrets onepassword set ANTHROPIC_API_KEY "op://Private/Anthropic/credential"
hermes secrets onepassword set TELEGRAM_BOT_TOKEN "op://Private/Telegram/token"
A configuração resultante:
secrets:
onepassword:
enabled: true
env:
OPENAI_API_KEY: "op://Private/OpenAI/api key"
ANTHROPIC_API_KEY: "op://Private/Anthropic/credential"
TELEGRAM_BOT_TOKEN: "op://Private/Telegram/token"
service_account_token_env: OP_SERVICE_ACCOUNT_TOKEN
override_existing: true
cache_ttl_seconds: 300
Usar ambas as sources juntas
Você pode habilitar ambas ao mesmo tempo. Controle a ordem com a lista sources:
secrets:
sources: [onepassword, bitwarden]
onepassword:
enabled: true
env:
OPENAI_API_KEY: "op://Private/OpenAI/api key"
bitwarden:
enabled: true
project_id: "..."
Lembre-se de que sources com mapeamentos explícitos (1Password) têm prioridade automática sobre sources massivas (Bitwarden), independentemente da ordem. Dentro do mesmo tipo, a primeira source vence.
Passo 4: Migre as API keys em texto plano para o cofre
4.1 Inventarie as keys do .env
Liste os secrets que o Hermes usa atualmente, agrupados por impacto:
- Model API keys:
OPENAI_API_KEY,ANTHROPIC_API_KEY,GEMINI_API_KEY, etc. - Platform tokens:
TELEGRAM_BOT_TOKEN,DISCORD_BOT_TOKEN,SLACK_BOT_TOKEN - Cloud credentials:
AWS_ACCESS_KEY_ID,CLOUDFLARE_API_TOKEN,GCP_API_KEY - Third-party tools: GitHub PATs, Sentry DSNs, Stripe keys, etc.
4.2 Crie os secrets no cofre
Bitwarden: no projeto selecionado, crie um secret para cada variável de ambiente. O nome deve corresponder exatamente ao esperado pelo Hermes, por exemplo OPENAI_API_KEY. Quando você executar hermes secrets bitwarden sync, o Hermes listará as variáveis que consegue resolver.
1Password: crie os items e campos correspondentes às suas referências op://vault/item/field. Por exemplo, se você mapeou OPENAI_API_KEY para op://Private/OpenAI/api key, crie um item chamado OpenAI no cofre Private com um campo api key.
Sugestão de ordem de migração: mova primeiro as keys de maior impacto (Stripe, chaves equivalentes a root da AWS, chaves principais de provedores de modelos) e depois as keys read-only de menor risco.
4.3 Reduza o .env e crie um example.env
Depois que uma key estiver no cofre, delete ou comente a linha correspondente em .env. Mantenha apenas o token de bootstrap que a source precisa:
# ~/.hermes/.env
BWS_ACCESS_TOKEN=0.xxx...
# ou para 1Password:
# OP_SERVICE_ACCOUNT_TOKEN=ops_...
Em seguida, crie um example.env com nomes de variáveis e comentários, mas sem valores reais:
# example.env — os valores reais ficam no cofre externo
OPENAI_API_KEY=see-vault
ANTHROPIC_API_KEY=see-vault
TELEGRAM_BOT_TOKEN=see-vault
Novos membros da equipe saberão quais variáveis são esperadas e qual cofre consultar, sem que ninguém precise enviar um .env real.
Passo 5: Verifique, rotacione e mantenha um caminho de rollback
5.1 Verifique se a integração está ativa
Bitwarden:
hermes secrets bitwarden status
hermes secrets bitwarden sync # dry-run: visualize o que seria aplicado
hermes secrets bitwarden sync --apply # exporta para o shell atual
1Password:
hermes secrets onepassword status
hermes secrets onepassword sync # dry-run
hermes secrets onepassword sync --apply # exporta para o shell atual
Inicie um novo processo do Hermes (ou um cron job, ou o serviço gateway) para que ele capture os valores resolvidos. Você pode confirmar a proveniência no log de inicialização ou no comando status da source.
5.2 Configure lembretes de rotação
A maioria dos cofres permite adicionar um campo ou nota com a data de rotação. Configure um lembrete de 90 dias no calendário. Quando uma provider key mudar, atualize-a apenas no cofre — nada mais. O próximo start do Hermes usará automaticamente o novo valor.
Se o token de bootstrap vazar ou expirar, rotacione-o sem reexecutar todo o assistente:
hermes secrets bitwarden token
hermes secrets onepassword token
Ambos os comandos verificam o token antes de salvá-lo, então um erro de colagem não quebra a configuração atual.
5.3 Mantenha um caminho de rollback
Não tire todas as keys de uma vez. Uma sequência mais segura:
- Migração canário: mova uma key não crítica (por exemplo, uma API de pesquisa read-only) para o cofre e verifique.
- Observação com dual-write: mantenha o cofre e
.envpreenchidos, mas ativeoverride_existing: truena source. Observe por alguns dias. - Limpeza final: quando estiver estável, delete as chaves correspondentes de
.enve mantenha apenas o token de bootstrap.
Se algo der errado, o rollback mais rápido é desabilitar a source:
hermes secrets bitwarden disable
hermes secrets onepassword disable
O Hermes volta imediatamente a usar apenas as credenciais de .env.
Armadilhas comuns
-
Colocar secrets reais em
config.yaml.config.yamldeve conter apenas referências (op://...) e IDs de projeto. Os valores reais devem permanecer no cofre. -
Armazenar o token de bootstrap do cofre em um
.envcompartilhado e commitá-lo.BWS_ACCESS_TOKENeOP_SERVICE_ACCOUNT_TOKENsão tokens de alto valor. Mantenha.envfora do controle de versão e restrinja as permissões do arquivo. -
Achar que
.envperde prioridade automaticamente. Por padrão,.enve exports de shell vencem. Se uma source tiveroverride_existing: falsee ainda houver keys antigas em.env, o Hermes continuará usando os valores de.env. Definaoverride_existing: truequando quiser que o cofre seja a fonte da verdade. -
Ignorar avisos de conflito. Quando várias sources fornecem a mesma variável, o Hermes avisa. Não silencie o aviso até confirmar qual source deve vencer, ou use
secrets.preserve_existingpara manter variáveis específicas em.env. -
Usar desbloqueio interativo em um servidor.
op signinou sessõesBW_SESSIONfuncionam bem em laptops, mas cron, gateway e CI devem usar service accounts ou machine accounts com tokens não interativos. -
Esquecer de atualizar
example.env. Depois que os secrets são externalizados,example.envse torna a única documentação das variáveis esperadas. Mantenha-o sincronizado com a estrutura real do cofre.
Combine com aprovações mais inteligentes
Tirar as keys de .env é a metade estática da história de segurança. A v0.19.0 também habilita por padrão as Smart Approvals: quando o Hermes quer executar um comando sinalizado, um reviewer LLM independente o avalia em vez de pedir aprovação para cada um. Combinado com o cofre externo, você tem duas camadas de proteção:
- Segurança estática: os secrets não chegam em texto plano ao disco, não se propagam entre máquinas e são auditáveis.
- Segurança dinâmica: operações de risco recebem uma segunda opinião, então uma única chamada de ferramenta excessiva não pode exfiltrar uma key.
Resumo
O SecretSource do Hermes v0.19.0 muda o gerenciamento de API keys de “copiar e colar em .env” para “injetar de um cofre externo na inicialização”. Cinco passos:
- Atualize para a v0.19.0 e confirme que
hermes secretsexiste. - Autentique-se com Bitwarden Secrets Manager ou 1Password e guarde o token de bootstrap em
.env. - Execute o assistente e configure a source em
config.yaml. - Migre as keys de
.envpara o cofre, deixando apenas o token de bootstrap. - Verifique com
status/sync, rotacione no cofre e mantenha um caminho de rollback.
Seu .env pode passar de dezenas de linhas de secrets para um único token de bootstrap, enquanto o Hermes continua obtendo todos os secrets necessários na inicialização. O onboarding de novos membros não envolve mais trocar arquivos secretos, e a rotação de tokens não significa mais vasculhar dezenas de configurações locais.
Referências: