tameshita新しいツールを実際に動かした記録

agent-vault — AIエージェントに秘密鍵を渡さない資格情報プロキシ(英語)動いた

AIエージェント(Claude CodeやOpenClaw、カスタムエージェントなど)とAPIの間に立つ、資格情報の仲介プロキシ兼保管庫。エージェント側には本物のAPIキーを一切渡さず、リクエストがAgent Vaultを通過する瞬間だけプレースホルダーを本物の値に差し替える。

配布元: https://github.com/Infisical/agent-vault  / 2026-09-14 時点で確認

この日に実際に動かした結果です。内容の誤りに気づかれた場合はお問い合わせください。確認のうえ訂正します。

agent-vault を使う前に分かること

必要なもの追加で用意するものは無し(無料の範囲で動いた)
動かした環境Go 1.25。
日本語画面・文書は英語
確認日2026-09-14(この日に実際に動かした)

agent-vault の使い方

やること:AIエージェントに本物のAPIキーを一度も持たせないまま、Agent Vault経由の通信にだけ本物の資格情報が差し込まれる状態を、ブラウザを使わずCLIだけで作る

  1. ソースを取得してビルドし、マスターパスワードを決めてサーバーをバックグラウンドで起動する。

    打つコマンド
    git clone https://github.com/Infisical/agent-vault.git
    go build -o agent-vault .
    export AGENT_VAULT_MASTER_PASSWORD=demo-master-pass-1234
    agent-vault server -d --host 127.0.0.1 --port 14321 --mitm-port 14322
    出るもの

    「✓ Server started in background」と表示され、サーバーのログに "Agent Vault server listening on http://127.0.0.1:14321" と "Agent Vault transparent proxy listening on 127.0.0.1:14322" の2行が残る

  2. ブラウザを一度も開かず、CLIだけでオーナーアカウントを登録してログインする。公式チュートリアルはWeb UIでの登録が前提だが、`auth register`はCLIから直接叩ける。

    打つコマンド
    printf 'demo-owner-pass-5678\ndemo-owner-pass-5678\n' | agent-vault auth register --address http://127.0.0.1:14321 --email owner@example.com --password-stdin
    printf 'demo-owner-pass-5678\n' | agent-vault auth login --address http://127.0.0.1:14321 --email owner@example.com --password-stdin
    agent-vault account whoami
    出るもの

    「✓ Owner account created.」→「✓ Login successful.」の後、whoami で Role: owner が返る

  3. 保管庫(vault)を作り、認証情報とアクセスを許可するサービスを1つ登録する。サービスのhostにIPアドレスをそのまま渡すとエラーになったので、ホスト名(/etc/hostsに1行足して用意したlocaldemo.test)を使う。

    打つコマンド
    agent-vault vault create demo
    agent-vault vault credential set DEMO_TOKEN=super-secret-value-999 --vault demo
    agent-vault vault service add --vault demo --name localdemo --host localdemo.test:9009 --auth-type bearer --token-key DEMO_TOKEN
    agent-vault vault service list --vault demo
    出るもの

    vault service list に auth.type: bearer, token: DEMO_TOKEN を持つ localdemo サービスが表示される

  4. エージェント用のトークンを発行し、そのトークンだけでプロキシ経由のリクエストを送る。curlコマンド自身には本物のDEMO_TOKENの値を一度も書いていない。デフォルトではループバック/プライベートIP宛の通信がブロックされる(netguard)ため、ローカルで試す場合はサーバー起動時に AGENT_VAULT_ALLOW_PRIVATE_RANGES=true を付ける必要があった。

    打つコマンド
    agent-vault agent create demo-agent --vault demo:proxy --token-only
    curl -s -x http://av_agt_...:demo@127.0.0.1:14322 http://localdemo.test:9009/ping
    出るもの

    受信側が実際に受け取ったヘッダーに "Authorization": "Bearer super-secret-value-999" が入っている。この値はcurlコマンドのどこにも書いておらず、Agent Vaultが転送時に差し込んだ

  5. 許可していない宛先へのアクセスを拒否する設定(unmatched_host_policy=deny)に切り替え、サービスとして登録していないホストにプロキシ経由でアクセスしてみる。

    打つコマンド
    curl -s -X PATCH http://127.0.0.1:14321/v1/vaults/demo/settings -H 'Authorization: Bearer av_sess_...' -H 'Content-Type: application/json' -d '{"unmatched_host_policy":"deny"}'
    curl -s -i -x http://av_agt_...:demo@127.0.0.1:14322 http://example.com/
    出るもの

    登録していない example.com 宛のリクエストは 403 Forbidden で止まり、レスポンスに具体的な理由とアクセス申請の手順(proposal_hint)が返る

最後まで通した時に出たもの(実際の出力)

$ curl -s -x http://av_agt_...:demo@127.0.0.1:14322 http://localdemo.test:9009/ping {"path": "/ping", "headers": {"Host": "localdemo.test:9009", "User-Agent": "curl/8.5.0", "Accept": "*/*", "Authorization": "Bearer super-secret-value-999", "Accept-Encoding": "gzip"}}

$ curl -s -i -x http://av_agt_...:demo@127.0.0.1:14322 http://example.com/ HTTP/1.1 403 Forbidden {"error":"forbidden","help":"This request was intercepted by Agent Vault. To see available services, GET http://127.0.0.1:14321/discover. For usage instructions including how to create a proposal, GET http://127.0.0.1:14321/v1/skills/cli","message":"No broker service matching host \"example.com:80\" in vault \"demo\"","proposal_hint":{"endpoint":"POST /v1/proposals","host":"example.com:80","supported_auth_types":["bearer","basic","api-key","custom","passthrough"]}}

agent-vault の良かった点

  • CLIだけでオーナー登録からエージェント用トークン発行まで完結し、ブラウザを一度も開かずに動作を確認できた
  • 実際にプロキシ越しのリクエストを受信側で見ると、テスト用の秘密の値がAuthorizationヘッダーにそのまま差し込まれて届いた。curlコマンド自体はその値を一度も持っていない
  • 未登録の宛先への通信を拒否する設定(unmatched_host_policy=deny)にすると、実際に403で止まり、エラーメッセージに『どうすればアクセスを申請できるか』(proposal_hint)まで書かれていた

agent-vault の不便だった点

  • サービスのhostにIPアドレスを直接指定できず、必ずホスト名が要る。ローカルの検証用サーバーを対象にするだけでも/etc/hostsに1行足すような一手間がかかる
  • デフォルトではループバック/プライベートIP宛のプロキシがブロックされる(netguard)。社内ネットワークの内部APIに向ける場合は AGENT_VAULT_ALLOW_PRIVATE_RANGES や許可リストの検討が要る
  • `agent-vault run`でプロセスをラップしても、curlでhttp://(非TLS)の宛先を直接叩くとプロキシを経由せず素通りしてしまった。httpsの宛先や `curl -x` での明示指定では問題にならない

agent-vault が狙い通りに止めたところ

実行しようとしたこと
curl -s -i -x http://av_agt_...:demo@127.0.0.1:14322 http://example.com/
止められた時に出たもの
HTTP/1.1 403 Forbidden
{"error":"forbidden","help":"This request was intercepted by Agent Vault. To see available services, GET http://127.0.0.1:14321/discover. For usage instructions including how to create a proposal, GET http://127.0.0.1:14321/v1/skills/cli","message":"No broker service matching host \"example.com:80\" in vault \"demo\"","proposal_hint":{"endpoint":"POST /v1/proposals","host":"example.com:80","supported_auth_types":["bearer","basic","api-key","custom","passthrough"]}}

vaultの設定を unmatched_host_policy=deny に切り替えた状態で、サービスとして登録していないホスト(example.com)宛のリクエストをAgent Vault自身が拒否した。既定(passthrough)ではこの種の通信は素通りするため、拒否させるには明示的な設定変更が要る

詰まった点と、効いた対処

実行したコマンド
agent-vault vault service add --vault demo --name localdemo --host 127.0.0.1:9009 --auth-type bearer --token-key DEMO_TOKEN
出たエラー
Error: Invalid services: service 0: host "127.0.0.1" must be a hostname, not an IP address
対処

IPアドレスではなくホスト名を渡す。ローカルで試す場合は /etc/hosts に1行足すなどしてホスト名を用意する

実行したコマンド
curl -s -x http://av_agt_...:demo@127.0.0.1:14322 http://localdemo.test:9009/ping -v
出たエラー
< HTTP/1.1 502 Bad Gateway
time=2026-09-14T07:20:07.314Z level=DEBUG msg="upstream request failed" vault_id=1ac35ee1-5dca-45f2-9af4-30f44cc87c72 vault_name=demo target_host=localdemo.test:9009 error="netguard: connection to localdemo.test (127.0.0.1) blocked by network policy"
対処

サーバー起動時の環境変数に AGENT_VAULT_ALLOW_PRIVATE_RANGES=true を付ける。デフォルトではループバック/プライベートIP宛の通信はSSRF対策(netguard)でブロックされる

実行したコマンド
agent-vault run -- curl -s http://localdemo.test:9009/ping
出たエラー
{"path": "/ping", "headers": {"Host": "localdemo.test:9009", "User-Agent": "curl/8.5.0", "Accept": "*/*"}}
対処

`agent-vault run`は大文字の HTTP_PROXY / HTTPS_PROXY を子プロセスに設定するが、curlはhttp://(非TLS)宛のリクエストでは小文字の http_proxy しか見ない(httpoxy対策によるcurl側の仕様)。Authorizationヘッダーが付かず、実際にはプロキシを経由せず直結していた。httpsの宛先か、`curl -x`でプロキシを明示指定すれば問題ない

確認した条件

確認日2026-09-14
試した版f0cdface45da8f7eca07f737a03537be75f20a71(2026-09-10時点のmain HEAD)
実行環境Go 1.25。ソースから go build して使った。ブラウザ向けのWeb UI(ダッシュボード)はフロントエンドを別途ビルドしないと動かないため、今回はCLIとHTTP APIだけで検証した。ダッシュボード自体の見た目・操作性は未確認。