
Chaves de API just-in-time para agentes de IA - e qualquer outro processo que você roteie através dela: o chamador só vê um placeholder.
# Keys on the Wire **Seu agente de IA nunca guarda suas chaves de API. Ele envia um placeholder; o segredo real é trocado no fio.** Impede ladrões de credenciais (Shai-Hulud e similares) e agentes com prompt injection de vazarem seus segredos. Um agente comprometido não tem nada para levar. [](https://pypi.org/project/keys-on-the-wire/) [](./LICENSE) [](https://github.com/inflightsec/keys-on-the-wire/actions/workflows/test.yml) ## Como funciona 1. Seu agente envia uma requisição com um *placeholder*, não a chave. 2. O Keys on the Wire troca pelo segredo real do seu vault, em trânsito. 3. O agente nunca vê a chave. Nada para vazar, nada para roubar.  Por baixo dos panos, é um proxy HTTPS em loopback. Ele busca cada credencial do seu vault no momento certo e a injeta na requisição de saída, de modo que o processo chamador (seu agente, ou qualquer outra coisa que você roteie por ele) nunca guarda os bytes reais. Backends de vault: **macOS Keychain**, Bitwarden Secrets Manager, Google Secret Manager, AWS Secrets Manager, `static` (sem vault, para experimentar) e `env`. No Mac, o backend Keychain não precisa de conta em vault na nuvem nem de dependência extra: seus segredos ficam onde já estão. (`kow setup` ainda usa Bitwarden por padrão; passe o backend que você quiser.) Veja [Arquitetura de adaptadores](https://github.com/inflightsec/agent-vault-proxy/blob/main/docs/adapter-architecture.md). ## Veja em ação [](docs/demo.cast) ## Início rápido **1. Instale** (Linux `pipx`, macOS `brew`): ```bash pipx install 'keys-on-the-wire[bitwarden]' # macOS: brew install inflightsec/keys-on-the-wire/keys-on-the-wire sudo kow setup --bws ``` **2. Instale a skill** para que seu agente escreva o binding por você: ``` /plugin marketplace add inflightsec/keys-on-the-wire /plugin install kow@keys-on-the-wire ``` **3. Faça o broker de um serviço.** Diga *"roteie a API do Stripe pelo Keys on the Wire."* A skill gera o placeholder e imprime a nota exata para colar no seu vault. Ela nunca vê sua chave. **4. Adicione a chave real** ao seu vault com essa nota, depois roteie seu agente pelo proxy: ```bash kow env && kow run claude ``` Pronto. O agente só envia o placeholder; o Keys on the Wire troca pela chave real no fio. Novo nisso? O [guia de início rápido](https://github.com/inflightsec/agent-vault-proxy/blob/main/docs/quickstart.md) percorre a primeira execução por completo, e [Pré-requisitos](https://github.com/inflightsec/agent-vault-proxy/blob/main/docs/prerequisites.md) cobre a configuração do vault. Prefere variáveis de ambiente do shell em vez de `kow run`? Veja [Uso](https://github.com/inflightsec/agent-vault-proxy/blob/main/docs/usage.md). ## Antes de apontar para chaves de produção - **Teste atrás de um processo.** `kow run -- <command>` define as variáveis do proxy e da CA apenas nesse processo; seu shell de login nunca as herda. [Escopo para um único processo](https://github.com/inflightsec/agent-vault-proxy/blob/main/docs/single-process.md). - **Fail-closed é o único modo.** Se o kow estiver fora do ar, as chamadas roteadas falham; um binding que nega retorna 503 em vez de passar a requisição sem proteção. - **Ele impede roubo, não uso indevido.** O kow tira a chave do contexto do agente; ele não julga por que uma API está sendo chamada. Restringir um binding com `methods:` e `paths:` é a alavanca, e isso é aplicado. [É para você?](https://github.com/inflightsec/agent-vault-proxy/blob/main/docs/is-it-for-you.md) traça o limite completo. - **Autenticação além de cabeçalhos estáticos já vem:** refresh OAuth2 e client-credentials, JWT bearer, GitHub App, HMAC e AWS SigV4, com presets para Google, Microsoft, Auth0, Slack, Atlassian e Okta. ## Faça o broker de um servidor MCP Cada servidor MCP mantém um token de longa duração em texto claro na configuração do seu cliente, legível por todos os outros servidores que o cliente carrega. `kow mcp install` troca esse segredo permanente por um placeholder e roteia a saída do servidor pelo proxy: ``` kow mcp install github --host api.github.com --env-var GITHUB_PERSONAL_ACCESS_TOKEN \ --server-cmd "npx -y @modelcontextprotocol/server-github" ``` Ele imprime a nota do vault e o comando exato `claude mcp add --env`. Design e modelo de ameaças: [ADR-0040](https://github.com/inflightsec/agent-vault-proxy/blob/main/docs/adrs/ADR-0040-mcp-server-credential-broker.md). ## O binding é uma linha Integrar uma credencial não é YAML escrito à mão. A [skill kow](https://github.com/inflightsec/agent-vault-proxy/blob/main/skills/kow) incluída pergunta o formato de autenticação e o host, depois diz exatamente o que colar no campo Notes do seu segredo: ``` # kow-binding api.acme.com ``` Essa linha marcadora é o que faz dele um binding; sem ela, a nota permanece uma descrição humana comum, nunca interpretada ([ADR-0025](https://github.com/inflightsec/agent-vault-proxy/blob/main/docs/adrs/ADR-0025-notes-binding-marker.md)). O assistente propõe, você aplica. Ele nunca vê nem armazena o segredo. ## Documentação **Comece aqui** — [É para você?](https://github.com/inflightsec/agent-vault-proxy/blob/main/docs/is-it-for-you.md) se estiver avaliando · [Pré-requisitos](https://github.com/inflightsec/agent-vault-proxy/blob/main/docs/prerequisites.md) para configurar seu vault · [Início rápido](https://github.com/inflightsec/agent-vault-proxy/blob/main/docs/quickstart.md) para uma primeira execução em 10 minutos. **Entenda** — [Conceitos](https://github.com/inflightsec/agent-vault-proxy/blob/main/docs/concepts.md) para placeholder, binding, CA e fail-closed em termos simples · [Arquitetura](https://github.com/inflightsec/agent-vault-proxy/blob/main/docs/architecture.md) para o modelo de ameaças, as invariantes G1 a G9 e riscos residuais. **Instale e opere** — [Linux](https://github.com/inflightsec/agent-vault-proxy/blob/main/docs/install-systemd.md) · [Docker](https://github.com/inflightsec/agent-vault-proxy/blob/main/docs/docker.md) · [macOS](https://github.com/inflightsec/homebrew-keys-on-the-wire) · [Uso](https://github.com/inflightsec/agent-vault-proxy/blob/main/docs/usage.md) · [Processo único](https://github.com/inflightsec/agent-vault-proxy/blob/main/docs/single-process.md) · [Isolamento no Linux](https://github.com/inflightsec/agent-vault-proxy/blob/main/docs/linux-isolation.md) · [Isolamento no macOS](https://github.com/inflightsec/agent-vault-proxy/blob/main/docs/macos-isolation.md) · [Google Secret Manager](https://github.com/inflightsec/agent-vault-proxy/blob/main/docs/gcp-secret-manager.md) **Referência** — [bindings.example.yaml](https://github.com/inflightsec/agent-vault-proxy/blob/main/bindings.example.yaml) é o esquema completo de configuração · [Arquitetura de adaptadores](https://github.com/inflightsec/agent-vault-proxy/blob/main/docs/adapter-architecture.md) para backends de vault e como adicionar um · [Comparação](https://github.com/inflightsec/agent-vault-proxy/blob/main/docs/comparison.md) com Vault Agent, Doppler, `op run` e outros · [CHANGELOG](https://github.com/inflightsec/agent-vault-proxy/blob/main/CHANGELOG.md) · [SECURITY](https://github.com/inflightsec/agent-vault-proxy/blob/main/SECURITY.md) · [CONTRIBUTING](https://github.com/inflightsec/agent-vault-proxy/blob/main/CONTRIBUTING.md) · [CREDITS](https://github.com/inflightsec/agent-vault-proxy/blob/main/CREDITS.md) ## Código aberto, sem lock-in Todos os recursos estão neste repositório sob Apache-2.0. Sem camada paga, sem serviço hospedado, sem telemetria. O proxy nunca liga para casa: suas únicas conexões de saída são seu vault e as APIs upstream que seu agente chama. Se uma [alternativa](https://github.com/inflightsec/agent-vault-proxy/blob/main/docs/comparison.md) se encaixar melhor na sua configuração, use-a. Uma dependência opcional não é código aberto, o [`bitwarden-sdk`](https://pypi.org/project/bitwarden-sdk/) do backend Bitwarden, que você instala apenas se usar esse backend. Veja [LICENSE](https://github.com/inflightsec/agent-vault-proxy/blob/main/LICENSE) e [NOTICE](https://github.com/inflightsec/agent-vault-proxy/blob/main/NOTICE).