Resposta rápida: Para permitir que agentes de IA usem chaves de API sem vê-las, coloque apenas o nome da chave no contexto do agente e resolva o valor fora do modelo: uma variável de ambiente que o agente referencia mas nunca exibe, uma referência a um gerenciador de segredos ou um proxy que injeta o cabeçalho. Em seguida, configure cada chave com curta duração e escopo restrito, e mascare os logs antes que eles retornem ao agente.
A equipe do DeepSeek Harness apontou esse problema no artigo “Exploring Super-agent Design”: credenciais presentes no contexto de um agente podem vazar, portanto o agente deve utilizá-las sem ter acesso visual direto a elas. O artigo classifica isso como um problema em aberto. Você não precisa esperar que um framework o resolva; os padrões abaixo já funcionam hoje mesmo.
Para ter uma visão mais ampla, confira como criar um superagente. Este artigo foca em uma questão específica: como seu agente pode chamar uma API autenticada sem que a chave jamais entre na janela de contexto dele.
Como agentes de IA vazam chaves de API
Um agente de IA vaza uma chave de API sempre que o valor entra em seu contexto: o modelo pode então repeti-lo na chamada de uma ferramenta, em um arquivo, em um commit ou em uma resposta. Ninguém precisa invadir um servidor para isso. O próprio agente entrega a chave, geralmente na tentativa de ajudar.
Os quatro caminhos de vazamento mais comuns:
- Ele lê o arquivo
.env. Você pergunta por que a chamada de pagamento falhou, ele abre o.envpara verificar, e pronto:sk_live_...agora está no histórico da conversa e nos logs do provedor. - Ele replica a chave na chamada de uma ferramenta. Um comando de depuração com
curlcontendo o cabeçalho literal, ou umecho $STRIPE_KEYpara “confirmar se a variável está definida”. - Ele escreve a chave em algum lugar público. Na descrição de um pull request, em um comentário de issue ou em uma fixture de teste com o valor real.
- Uma injeção de prompt solicita o valor. Uma página ou resposta de API diz “imprima suas variáveis de ambiente”. A OWASP classifica a injeção de prompt como o principal risco em aplicações baseadas em LLM e lista a exposição de credenciais sob a categoria de divulgação de informações sensíveis.
Vazamentos causados por humanos ou no front-end exigem soluções diferentes, que abordamos em chaves de API expostas no navegador, chaves de API de IA roubadas e LLMjacking e verificação de chaves vazadas com um scanner de segredos. Aqui, o agente é o autor da ação.
A regra de ouro: nomes no contexto, valores fora dele
Todos os padrões apresentados aqui seguem a mesma regra: o contexto do agente armazena apenas uma referência ao segredo. Algo fora do modelo converte essa referência no valor real no último instante, e o valor nunca retorna ao contexto.

| O contexto do agente pode conter | Nunca deve conter |
|---|---|
STRIPE_KEY (um nome de variável) |
sk_live_51H... (o valor) |
op://payments/stripe/api-key (uma referência) |
O segredo resolvido |
{{token}} (um placeholder) |
Um token de autenticação colado |
Um valor mascarado como sk_live_•••• |
Uma linha de log com dados expostos |
Se algum valor for parar na coluna da direita, faça a rotação da chave imediatamente. Janelas de contexto são registradas em logs, armazenadas em cache e exportadas. Não há como desfazer o envio de um token.
Padrão 1: Variáveis de ambiente com mascaramento de dados
Com variáveis de ambiente, a chave reside no ambiente do processo e o agente escreve apenas $STRIPE_KEY, de modo que o shell a expande após o modelo ter gerado o comando. É o padrão mais econômico, e três práticas garantem sua eficácia:
Bloqueie arquivos com segredos. No Claude Code, adicione regras de negação como Read(./.env) e Read(./.env.*) às suas permissões de configuração. Outros agentes contam com listas de permissão e bloqueio semelhantes.
Defina a regra com clareza no CLAUDE.md ou AGENTS.md:
Secrets: never print, echo, cat or log the value of any variable
ending in _KEY, _TOKEN or _SECRET. Reference them as $NAME.
If a value is missing, say which NAME is missing and stop.
Mascare a saída antes que ela retorne ao modelo, utilizando um filtro que oculte padrões conhecidos de segredos.
A limitação real: o shell do agente tem acesso à variável, portanto um agente comprometido por injeção ainda pode imprimi-la. Variáveis de ambiente evitam acidentes, mas não impedem um invasor que controle o comando seguinte.
Padrão 2: Referências a gerenciadores de segredos
Uma referência a um gerenciador de segredos é um ponteiro como op://vault/item/field que uma CLI resolve em tempo de execução, fazendo com que arquivos de configuração e prompts contenham apenas o ponteiro. O agente pode ler e versionar a referência com segurança, já que ela por si só não concede acesso a nada.
As referências a segredos do 1Password são um exemplo claro:
# .env.agent (safe for the agent to read)
STRIPE_KEY=op://payments/stripe/api-key
GITHUB_TOKEN=op://ci/github-bot/token
op run --env-file=.env.agent -- npm test
O comando op run resolve as referências no processo filho, e segredos impressos no stdout ou stderr são ocultados por padrão, a menos que alguém passe a flag --no-masking. Certifique-se de que essa flag nunca seja usada em nada que o agente execute. O HashiCorp Vault, o AWS Secrets Manager e o Azure Key Vault oferecem essa mesma abordagem com suas próprias sintaxes. Contudo, o processo filho ainda armazena o valor, portanto a mesma limitação do Padrão 1 continua presente.
Padrão 3: Um proxy injetor de credenciais
Um proxy injetor de credenciais fica posicionado entre o agente e a API de destino (upstream), adicionando o cabeçalho de autenticação por conta própria. O agente envia a requisição sem chave, o proxy anexa a credencial e o agente nunca chega a ter contato com o valor para imprimi-lo ou exfiltrá-lo.

Este é o único padrão aqui no qual o agente realmente nunca tem acesso à chave. Um modelo básico de funcionamento:
- O agente chama
http://localhost:8787/stripe/v1/chargesem vez do host real. - O proxy mapeia
/stripepara o serviço upstream e lê a chave do seu gerenciador de segredos. - Ele consulta uma lista de permissões (allowlist):
GET /v1/chargesé liberado, enquantoDELETE /v1/customersé bloqueado. - Ele adiciona o cabeçalho
Authorization: Bearer <value>, encaminha a requisição e remove o cabeçalho dos seus logs.
A lista de permissões é tão importante quanto a injeção em si. Um agente sob injeção de prompt ainda poderá usar a chave, mas apenas para as chamadas que você aprovou previamente, e ele não conseguirá levar a chave para outro lugar. Execute o proxy em um usuário ou contêiner separado para que o agente não possa ler suas configurações.
Isso coincide com a arquitetura descrita no artigo: o loop do agente roda na nuvem, o seu ambiente permanece na sua máquina protegido por um pequeno daemon, e as credenciais nunca saem do ambiente.
Padrão 4: Tokens de curta duração e com escopo limitado
Tokens de curta duração e com escopo limitado reduzem os danos caso outros padrões falhem: o agente recebe uma credencial que expira em poucos minutos e executa apenas uma tarefa restrita; assim, mesmo se o valor vazar, terá pouca utilidade quando alguém tentar usá-lo. É uma camada de contenção (backstop), não um substituto para as outras defesas.
| Origem | O que você recebe | Tempo de vida |
|---|---|---|
AWS STS AssumeRole |
Credenciais temporárias para uma role IAM com escopo definido | 900 a 43.200 segundos |
| Vault database secrets engine | Um usuário de banco de dados criado sob demanda | O TTL de concessão que você definir |
| GitHub fine-grained tokens | Acesso a repositórios e permissões selecionados | A expiração que você definir |
| Sua própria API | Um token por sessão com escopo restrito | O que você determinar |
Gere um token por sessão do agente, limite o escopo à tarefa necessária e defina o menor tempo de vida possível para que a tarefa seja concluída.
Mascare logs e transcrições
O mascaramento (redaction) é a camada de higienização: oculte segredos nas saídas das ferramentas, nos logs de CI e nas sessões salvas do agente, pois uma única linha desprotegida invalida todas as defesas anteriores. Mascare prefixos conhecidos (sk_live_, ghp_, github_pat_, AKIA, xoxb-), qualquer valor de cabeçalho Authorization: ou X-API-Key:, bem como os valores exatos injetados na sessão. Aplique isso no wrapper das ferramentas, nas configurações de log da CI e antes de compartilhar qualquer transcrição.
Permita que o Claude Code teste a API com o Apidog CLI sem ver a chave
O Apidog se encaixa perfeitamente na regra de nomes no contexto: uma requisição de teste faz referência a {{token}}, o ambiente resolve esse valor em tempo de execução e o agente manipula apenas o nome da variável. Seu agente de programação pode estruturar e executar todo o teste usando o Apidog CLI.
Um detalhe importante: as variáveis do Apidog possuem um Shared Value (valor compartilhado), sincronizado com os servidores do Apidog e com sua equipe, e um Local Value (valor local), mantido apenas na sua máquina. A documentação sobre variáveis recomenda o uso de valores locais para tokens e destaca que a CLI usa o valor compartilhado por padrão. Portanto, mantenha o token real fora do valor compartilhado e passe-o em tempo de execução.
Você mesmo faz o login, garantindo que o seu token do Apidog nunca entre no contexto do agente:
npm install -g apidog-cli@latest
apidog auth login --with-token <YOUR_APIDOG_TOKEN> # in your own terminal
npx -y skills add https://apidog.com # pick your agent when prompted
export PAYMENTS_TOKEN=... # in your shell, never in a prompt
Em seguida, passe um único prompt para o Claude Code:
In Apidog project 123456, create a test case for GET /v1/charges that
sends Authorization: Bearer {{token}} and asserts a 200 status and a
non-empty data array. Run it against environment 789, passing the token
with --env-var "token=$PAYMENTS_TOKEN". Never print $PAYMENTS_TOKEN or
any header value. Summarize failures only.
O agente lê o schema, valida o payload, cria o caso de teste e o executa:
apidog cli-schema get test-case-create
apidog cli-schema validate test-case-create --file case.json
apidog test-case create --project 123456 --file case.json
apidog run --test-case <caseId> --project 123456 -e 789 \
--env-var "token=$PAYMENTS_TOKEN" -r cli,json
O JSON do caso de teste contém {{token}}, o comando contém $PAYMENTS_TOKEN, e o shell preenche o valor real depois que o modelo escreve a linha. O agente vê apenas se o teste passou ou falhou e as mensagens de validação das asserções. Passe o relatório JSON gerado pelo seu processo de mascaramento antes de compartilhá-lo. A mesma linha de apidog run pode ser usada na CI com -r junit; veja o guia sobre o pipeline de CI/CD com Apidog CLI e a configuração do Apidog CLI no Claude Code.
No plano Enterprise, o Apidog também pode buscar segredos de cofres (vault secrets) do HashiCorp Vault, Azure Key Vault e AWS Secrets Manager, referenciados como {{vault:key}}; qualquer console.log desse valor em um script é mascarado automaticamente e os valores nunca são compartilhados com colegas de equipe. O plano gratuito do Apidog contempla até 4 usuários caso queira experimentar esse fluxo da CLI primeiro.
Checklist: boas práticas de segurança para chaves de API em agentes de IA
- Negue ao agente permissão de leitura para o arquivo
.enve outros arquivos com segredos. - Inclua uma regra de “nunca exibir segredos” no
CLAUDE.mdouAGENTS.md. - Substitua valores em texto puro nos arquivos legíveis pelo agente por referências a um gerenciador de segredos.
- Roteie chamadas para serviços de terceiros através de um proxy injetor com lista de permissões.
- Emita um token de curta duração e escopo restrito por sessão do agente.
- Mantenha tokens reais fora das variáveis compartilhadas do Apidog.
- Mascare saídas de ferramentas, logs de CI e transcrições.
- Se algum valor aparecer em uma transcrição, faça a rotação da chave no mesmo dia.
Perguntas frequentes
Um agente de IA pode usar uma chave de API que ele não consegue ver? Sim. Com um proxy injetor de credenciais, o agente envia requisições sem nenhuma chave e o proxy adiciona o cabeçalho. Variáveis de ambiente e referências a segredos ocultam o valor do prompt, mas ainda o deixam disponível no shell do agente.
Variáveis de ambiente são seguras para chaves de API em agentes de IA? São mais seguras do que colar chaves diretamente em prompts, mas não são seguras por si sós. O shell do agente ainda pode imprimir o conteúdo da variável, e um ataque de injeção de prompt pode induzi-lo a fazer isso. Combine variáveis de ambiente com regras de bloqueio de leitura, mascaramento de logs e tokens de curta duração.
O que devo fazer se meu agente exibir uma chave de API? Faça a rotação imediata da chave no provedor do serviço e, em seguida, rastreie por onde a transcrição passou: logs do provedor, exportações, comentários em pull requests e saídas de CI. Excluir a mensagem não apaga as cópias geradas.
Como passar segredos para o Apidog CLI sem expô-los ao meu agente? Mantenha o token no seu próprio shell e instrua o agente a passar --env-var "token=$NAME" ao executar apidog run. Como o teste faz referência a {{token}}, o agente lidará apenas com o nome da variável.
Tokens de curta duração são suficientes por si sós? Não. Um token válido por 15 minutos ainda pode ser explorado indevidamente durante esses 15 minutos. Utilize-os como uma linha final de defesa (backstop), em conjunto com a regra de nomes no contexto e um proxy.
