本文へスキップ
ウェブエンジニア問題集
第6章

AIエージェントにシークレットを渡さないための設計

約8分
この章の目次開く

前の章で、実行環境を隔離すれば危険な操作を許せるようになる、と書きました。ここで区別しておく必要があります。隔離されているのは自分のマシンであって、渡した認証情報ではありません。

使い捨ての環境で動いていても、その環境にAPIキーとデータベースの接続情報が入っていれば、外に出せる情報はそこにあります。この章では、何が見えていて、どこから漏れるのかを整理します。

学習者学習者

.env はGit管理外にしてるから、大丈夫じゃないの?

エージェントはファイルを読める

Git管理外かどうかは、エージェントから見えるかどうかとは無関係です。.env は作業ディレクトリの中にある普通のファイルで、読み取りツールで開けます。

そして問題は「読めること」そのものではありません。権限設計の章で扱った致命的な三要素を思い出してください。プライベートデータへのアクセス・信頼できないコンテンツへの露出・外部への通信手段が揃うと、攻撃者が書いた文字列が情報を外へ持ち出せます。

.env を読める状態は、その1つ目をそのまま満たしています。

警戒する人

最も単純な対策は、読ませないことです。多くのツールが読み取りに対する禁止ルールを持っており、.env やキーを含むディレクトリをここに入れておけば、そもそもアクセスできません。禁止は許可より強く評価されるので、あとから別の設定で緩められる心配もありません。

読めないものは漏れません。まず読めなくできないかを考えます。

クラウド側の設計が参考になる

とはいえ、認証情報がまったく不要な作業ばかりではありません。ではどう扱うか。クラウド実行の設計が、そのまま考え方の手本になります。

公式ドキュメントによれば、Anthropicがホストする環境では本物の認証情報をサンドボックスの中に置きません。代わりに次の形を取ります。

仕組み内容
スコープ付きの代理サンドボックスの中にあるのは限定された資格情報で、プロキシがそれを実際のトークンに変換する
操作の制限git push は現在の作業ブランチにのみ許される
記録すべての操作が監査のために記録される
渡すのは鍵そのものではなく、用途と範囲が限定された代理です。漏れても被害が限定されます。

この形は自分の環境でも真似できます。読み取り専用のトークンを使う、有効期限の短いものを使う、本番ではなく検証用の接続先を渡す。「その作業に必要な最小限」を用意する手間を、事前に払っておくという話です。

先生先生

「エージェントに渡していいか」で迷ったら、「この鍵が外部に出たとき何ができてしまうか」を考えるといいよ。答えが重いなら、代わりに渡せる軽いものを作る。

見落としやすい漏洩経路

読ませない・限定するの2つを押さえても、別の経路から漏れることがあります。実務で見落とされやすいのは次の3つです。

1. セッションの共有

公式ドキュメントは、セッションを共有する前の確認を明示的に促しています。セッションにはプライベートリポジトリのコードと認証情報が含まれている場合があるためです。

2. worktree への複製

並列実行の章で扱いますが、worktreeは新しいチェックアウトなので .env のようなGit管理外のファイルは存在しません。これは不便なので、指定したファイルを新しいworktreeへ自動でコピーする仕組みが用意されています。

便利ですが、意味を考えてください。秘密の複製がworktreeの数だけ増えます。しかも作業が終わったworktreeを消し忘れると、複製はディスクに残り続けます。

書類を確認する人

3. ログと出力

エージェントに調査を頼むと、環境変数の一覧やコマンドの出力を読ませることがあります。そこに認証情報が含まれていれば、コンテキストに入り、記録にも残ります。

出力を絞るフックは、コスト対策であると同時に情報の露出対策でもあります。

設計の型

まとめると、実務で取るべき手は5つです。

手何を防ぐか
読めなくする(禁止ルール)そもそもアクセスさせない
本物でなく限定された代理を渡す漏れたときの被害を限定する
出口を絞る三要素の1つを切り、持ち出しを防ぐ
記録を残す事後に何が起きたかを追える
共有前に中身を見る転送は取り消せない

上から順に強い対策です。1つ目でカバーできるものを、3つ目で守ろうとしないでください。

よくあるハマりどころ

.env を許可リストに入れる。 一度読ませる必要があって許可し、そのまま外し忘れるパターンです。

環境変数を丸ごと出力させる。 調査の過程でやりがちです。必要な変数名だけを指定します。

worktreeにコピーしたまま放置する。 使い終わったworktreeは片付けます。

セッションを見ずに共有する。 認証情報が本文に含まれていることがあります。

「隔離環境だから」で本番の鍵を入れる。 環境の使い捨て可能性と、鍵の被害範囲は別の話です。本番の鍵は、隔離されていても本番に届きます。

Git管理外だから安全だと考える。 Gitは関係ありません。ファイルシステム上に存在していれば読めます。

ちゃんと使うためのポイント

  • Git管理外かどうかと、エージェントから見えるかは無関係
  • まず読めなくする。禁止ルールは許可より強く効く
  • 渡すなら本物ではなく、用途と範囲を限定した代理を渡す
  • クラウド側の設計(本物をサンドボックスに置かない・push先を限定・記録を残す)は、自分の環境でも真似できる
  • 漏洩経路は3つ見落とされやすい。セッション共有・worktreeへの複製・ログと出力
  • 共有リンクは回収できない。出す前に中身を見る
  • 環境の使い捨て可能性は、鍵の被害範囲を小さくしない

次の章では、複数のエージェントを同時に走らせたときに何が壊れるのかを扱います。この章で触れたworktreeへの複製も、そこで改めて出てきます。

参考リンク