agent-vault — AIエージェントに秘密鍵を渡さない資格情報プロキシ(英語)動いた
AIエージェント(Claude CodeやOpenClaw、カスタムエージェントなど)とAPIの間に立つ、資格情報の仲介プロキシ兼保管庫。エージェント側には本物のAPIキーを一切渡さず、リクエストがAgent Vaultを通過する瞬間だけプレースホルダーを本物の値に差し替える。
この日に実際に動かした結果です。内容の誤りに気づかれた場合はお問い合わせください。確認のうえ訂正します。
agent-vault を使う前に分かること
| 必要なもの | 追加で用意するものは無し(無料の範囲で動いた) |
|---|---|
| 動かした環境 | Go 1.25。 |
| 日本語 | 画面・文書は英語 |
| 確認日 | 2026-09-14(この日に実際に動かした) |
agent-vault の使い方
やること:AIエージェントに本物のAPIキーを一度も持たせないまま、Agent Vault経由の通信にだけ本物の資格情報が差し込まれる状態を、ブラウザを使わずCLIだけで作る
ソースを取得してビルドし、マスターパスワードを決めてサーバーをバックグラウンドで起動する。
打つコマンド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行が残る
ブラウザを一度も開かず、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 が返る
保管庫(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 サービスが表示される
エージェント用のトークンを発行し、そのトークンだけでプロキシ経由のリクエストを送る。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が転送時に差し込んだ
許可していない宛先へのアクセスを拒否する設定(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_TOKENError: Invalid services: service 0: host "127.0.0.1" must be a hostname, not an IP addressIPアドレスではなくホスト名を渡す。ローカルで試す場合は /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だけで検証した。ダッシュボード自体の見た目・操作性は未確認。 |