Como permitir que agentes de IA usem chaves de API sem vê-las

Permita que agentes de IA utilizem chaves de API sem vê-las: mantenha os nomes das chaves no contexto e os valores fora dele, com variáveis de ambiente, referências a secrets, um proxy de injeção e tokens de curta duração.

Ashley Innocent

Ashley Innocent

5 novembro 2026

Como permitir que agentes de IA usem chaves de API sem vê-las

Apidog para empresas

Implantação local

SSO & RBAC

Conforme SOC 2

Explorar Apidog Enterprise

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:

  1. Ele lê o arquivo .env. Você pergunta por que a chamada de pagamento falhou, ele abre o .env para verificar, e pronto: sk_live_... agora está no histórico da conversa e nos logs do provedor.
  2. Ele replica a chave na chamada de uma ferramenta. Um comando de depuração com curl contendo o cabeçalho literal, ou um echo $STRIPE_KEY para “confirmar se a variável está definida”.
  3. 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.
  4. 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.

Diagram: the agent context holds only names such as STRIPE_KEY and {{token}}; the real value sits outside the model behind a padlock, is resolved at execution, and never flows back into the context
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.

Diagram: an AI agent sends a request with no key to a credential proxy; the proxy pulls the secret from a secret manager, checks an allowlist, adds an Authorization Bearer header and forwards the request to the upstream API

Este é o único padrão aqui no qual o agente realmente nunca tem acesso à chave. Um modelo básico de funcionamento:

  1. O agente chama http://localhost:8787/stripe/v1/charges em vez do host real.
  2. O proxy mapeia /stripe para o serviço upstream e lê a chave do seu gerenciador de segredos.
  3. Ele consulta uma lista de permissões (allowlist): GET /v1/charges é liberado, enquanto DELETE /v1/customers é bloqueado.
  4. 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

  1. Negue ao agente permissão de leitura para o arquivo .env e outros arquivos com segredos.
  2. Inclua uma regra de “nunca exibir segredos” no CLAUDE.md ou AGENTS.md.
  3. Substitua valores em texto puro nos arquivos legíveis pelo agente por referências a um gerenciador de segredos.
  4. Roteie chamadas para serviços de terceiros através de um proxy injetor com lista de permissões.
  5. Emita um token de curta duração e escopo restrito por sessão do agente.
  6. Mantenha tokens reais fora das variáveis compartilhadas do Apidog.
  7. Mascare saídas de ferramentas, logs de CI e transcrições.
  8. Se algum valor aparecer em uma transcrição, faça a rotação da chave no mesmo dia.
button

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.

Pratique o design de API no Apidog

Descubra uma forma mais fácil de construir e usar APIs