Claude Code のクラウドセッションに持ち込める鍵と持ち込めない鍵
Claude Code のクラウドセッション(Anthropic が管理する VM で Claude Code を動かす機能)で API の鍵を使うとき、鍵はセッションの中に置かず、通信の途中でプロキシが差し込みます。そのため、何を持ち込めるかは鍵の型で決まります。
AI エージェントの作業場所をクラウドセッションに移し、サイト運営で使っている Astro 製の CMS「EmDash」の鍵をクラウドの環境に登録して、エージェントに記事の下書きを入れさせたところ、CMS は鍵の付いていないリクエストとして認証エラーを返しました。鍵の登録に間違いはありませんでした。
原因は Node の標準の fetch で、プロキシの環境変数に従わないため、鍵を差し込むプロキシを通らずに外へ出ていました。起動時に NODE_USE_ENV_PROXY=1 を付けると通ります。
鍵はセッションの中に無く、プロキシが差し込む
クラウドの環境には API credentials という欄があり、鍵と宛先のホストを登録します。リクエストが VM を出たあとで Anthropic のプロキシが鍵を付けるので、鍵はエージェントにも、エージェントが実行するコマンドにも、環境変数にも現れません。
一方、環境の環境変数はその環境を使うセッションなら誰でも読めるので、鍵は環境変数に置きません。
持ち込めるかは鍵の型で決まる
鍵を差し込むのはプロキシなので、プロキシが扱える型の鍵だけを持ち込めます。
- 静的なトークン(Bearer): 持ち込める。CMS と Cloudflare の鍵はこの型で、登録するだけで CLI がそのまま動く
- AWS の署名(SigV4): 持ち込める。専用の型があり、プロキシが保存した鍵で署名し直す。手元の CLI はダミーの鍵で署名すればよい。長期の鍵が前提で、AWS SSO は使えない
- 1時間で切れるトークン: 持ち込めない。Search Console の API に使う Google のトークンは 1時間で切れ、登録した値を付けるだけの仕組みでは取り直せない
- 手元のログイン状態: 持ち込めない。手元の PC でログインした CLI で X の API を読んでいたが、そのログイン状態はクラウドの VM には無い
Node の fetch はプロキシを通らない
鍵を差し込むプロキシは、セッションの環境変数 HTTPS_PROXY で指定されています。curl や多くの CLI はこれに従いますが、Node の標準の fetch は従いません。Node.js のドキュメントのとおり、起動時に NODE_USE_ENV_PROXY=1 が無いと、fetch はプロキシを通らずに直接出ていきます。
直接出たリクエストには鍵が付かないので、失敗は「鍵が無い」という認証エラーとして返ります。鍵の登録を疑っても原因に行き着きません。
そこで下書きを入れるスクリプトは、HTTPS_PROXY があって NODE_USE_ENV_PROXY が無いときに、NODE_USE_ENV_PROXY=1 を付けて自分を起動し直すようにしました。スクリプトから呼ぶ EmDash の CLI も Node の fetch を使いますが、子プロセスに同じ環境変数が渡るので、両方ともプロキシを通ります。
ネットワークの制限は鍵を守らない
鍵はプロキシの外に出ないので、許可したドメインにだけ出られる設定にしても、鍵が漏れる経路は減りません。ネットワークの制限で防げるのは、セッションの中にあるリポジトリの中身を外へ送られることです。私はどこにでも出られる設定にし、この点は受け入れました。
一方、鍵を使う操作はセッションの中からできます。クラウドの環境は全部の作業で 1つを使い回し、置いた鍵は CMS と Cloudflare の 2本だけで、X への投稿の鍵は置いていません。外部の文章を読むセッションも同じ環境を使うため、その文章に仕込まれた指示でエージェントを操るプロンプトインジェクションによって公開の操作に使われうる鍵は配りません。