homula

エージェンティック・ハーネス設計ガイド — Part 5(最終回)

封じ込めと承認設計

境界を先に敷く。承認は、最後の一手。

18〜22分難易度 ★★★(中級〜上級)最終更新: 2026年8月

「重要な操作は人が承認します」——AIエージェントの導入計画に、ほぼ必ず書かれる一文です。しかしこれを唯一の防護にしてはいけないことが、実測で示されています。Claude Code の許可プロンプトは約 93% が承認されている。人間の監督は、決定論的な環境境界の代わりにはなりません。

シリーズ最終回では、Part 1の6つの構成要素でいう「実行環境」と「再利用・統制」の安全側面——封じ込めと承認——を扱います。

この記事の主張はひとつです。安全は、承認の丁寧さではなく、境界の設計で決まる。承認を厚くするより、そもそも届かない範囲を広く取るほうが、確実で、運用も軽くなります。

1.危険は、3つが揃ったときに生まれる

エージェントのリスクを「AIが暴走する」と捉えると、対策が漠然とします。実際には、特定の条件が揃ったときに経路が生まれるという構造で捉えたほうが設計しやすくなります。

機密データに触れる社内文書・顧客情報・認証情報信頼できない入力にさらされる外部サイト・受信メール・第三者の文書外部へ送信できるメール送信・API 呼び出し・公開3 つが揃うと、危険になる外部から混入した指示が、機密を外へ運ぶ経路になる設計の勘所 — 1 つを外せば、その経路は成立しない「全部を安全にする」より「同時に揃わせない」ほうが、はるかに現実的たとえば、外部の文書を読ませる作業では、その間だけ外部送信の手段を渡さない。
図1機密データに触れる・信頼できない入力にさらされる・外部へ送信できる。この3つが同時に揃うと、外部から混入した指示が機密を外へ運ぶ経路になり得る。1つを外せば、その経路は成立しない。

この捉え方の利点は、作業単位で切れることです。「外部の文書を読ませる作業では、その間だけ外部送信の手段を渡さない」「機密を扱う作業では、外部サイトを取得させない」——全部を安全にしようとするより、はるかに現実的に守れます。

2.許可は「宛先のフィルタ」ではなく「能力の付与」

次に、許可の捉え方です。ここは言葉の理解がそのまま設計の甘さになる箇所です。

「宛先のフィルタ」だと思っているallow: files.example.com「このドメインにだけ、つながる」— 通信先を絞ったつもりになっている実際には「能力を渡している」ファイルを上げられる誰にでも共有できる既存のファイルを消せる実体「どこへつなぐか」ではなく「何ができるようになるか」で判断する許可の単位を、ドメインではなくリソースと操作(読み取り/書き込み/削除)まで絞る既定はゼロアクセス — 何にも届かない状態から始め、必要な能力だけを名指しで足す。「とりあえず全部許可して、後で絞る」は、絞られないまま運用に入る。操作の対象や範囲まで制限できると、同じ接続でも渡す能力を小さくできる。
図2あるサービスへの接続を許すことは、そのサービスでできること全部を許すことに等しい。判断は「どこへつなぐか」ではなく「何ができるようになるか」で行う。

出発点は既定でゼロアクセス——何にも届かない状態から始め、必要な能力だけを名指しで足していく設計です。「とりあえず全部許可して、後で絞る」は、運用が始まると実際には絞られません。

さらに一段絞れると効果的です。同じサービスへの接続でも、リソースと操作の単位まで限定できれば、渡す能力は小さくなります。読み取りだけを許す、特定のフォルダだけを見せる、書き込みには人の確認を要求する——公開されている実装では、こうした粒度での制御が採られています。

3.隔離の強度は、利用者に合わせる

隔離は1種類ではありません。そして強ければ良いというものでもなく、利用者に合わせて選ぶ対象です。

隔離は 1 種類ではない。弱い順に並べると、こうなる。プロセス分離同じ OS を共有するコンテナ名前空間で分けるOS レベルの隔離システム呼び出しを仲介するマイクロ VM / VMカーネルごと分ける弱い強い開発者が使う実行される内容を読んで、危険かどうか判断できる→ 精査に耐える範囲で、弱めの隔離も選べる業務の現場が使う実行内容を読んで判断することは、期待できない→ 精査ではなく、絶対的な境界が要る自作の許可プロキシで代用しようとすると、抜け道を塞ぎきれない。成熟した隔離の仕組みを使う。
図3開発者は実行される内容を読んで危険かどうか判断できるため、精査に耐える範囲で弱めの隔離も選べる。業務の現場では精査を期待できないため、精査ではなく絶対的な境界が要る。

自作しないほうがよい部分

「許可された通信だけを通すプロキシを自前で作る」という設計は、抜け道を塞ぎきれないことが多く報告されています。パスの検証と実体の解決の順序ひとつで境界が破れるような、細かく難しい領域です。ここは成熟した隔離の仕組みに任せ、自作するならその上のポリシー層にするのが安全です。

関連して、信頼できない入力の扱いにも順序があります。外部から来たデータを解釈するのは、信頼境界を確立した後にする。境界の外で複雑な解析を先に走らせると、そこ自体が攻撃面になります。

4.資格情報を、エージェントに渡さない

隔離と並んで効くのが、そもそも鍵を渡さない構成です。

エージェント(サンドボックスの中)資格情報は持たない依頼仲介役資格情報を保持するポリシーを適用する何を読んだかを記録する操作を仲介する実行外部サービス社内 API・SaaS・DBエージェントが乗っ取られても、鍵そのものは渡っていない。できるのは「仲介役に依頼すること」だけで、その依頼はポリシーと記録を必ず通る。逆に、サンドボックスの中に鍵を置くと、隔離の強度がそのまま鍵の防御力になってしまう。
図4資格情報は外側の仲介役に持たせ、エージェントは「依頼する」ことしかできないようにする。仲介役がポリシーを適用し、何を読んだかを記録し、操作を仲介する。

この構成の効果は明快です。エージェントが乗っ取られても、鍵そのものは渡っていません。できるのは仲介役への依頼だけで、その依頼はポリシーと記録を必ず通ります。

逆に、サンドボックスの中に鍵を置いてしまうと、隔離の強度がそのまま鍵の防御力になります。隔離が破られた瞬間に鍵も渡る、という一本勝負の設計になってしまいます。

5.承認は、境界の代わりにならない

ここで冒頭の話に戻ります。承認は必要ですが、置く場所を間違えると機能しません

① 環境の境界既定はゼロアクセス。隔離された実行環境。届かないものは、そもそも触れない確実に止まる② コードによるゲート操作の種別で承認要否を判定する。実行時に効くので、出力で迂回されない確実に止める③ 人の承認金銭・削除・外部送信・公開など、不可逆な操作にだけ挟む最後の一手承認プロンプトの約 93% は承認されている(Anthropic 報告)。③ を ① の代わりにしてはいけない。
図5①環境の境界は確実に止まる。②コードによるゲートは実行時に効くので出力で迂回されない。③人の承認は最後の一手で、不可逆な操作にだけ挟む。③を①の代わりにしてはいけない。

①と②が効いている状態なら、③に回ってくる件数は自然に減ります。逆に①②が薄いと、③にすべてが押し寄せ、件数が増えた結果として1件あたりの判断が薄くなる——これが約93%という数字の背景にある構造です。

承認の設計を考えるときは、まず「この承認は、①か②で置き換えられないか」を問うのが順序になります。

6.承認は、減らすほど質が上がる

それでも残る承認を、どう見せるか。ここにも設計の余地があります。

1 件ずつ、止めて聞く承認しますか? — エージェントは停止中承認しますか? — エージェントは停止中承認しますか? — エージェントは停止中待たされるほど、中身を見ずに押すようになる進めておいて、まとめて判断するエージェントは止まらず、先へ進むこのターンで承認待ちの操作:3 件適用後の状態も一緒に見せる全部承認 / 個別に判断回数が減るほど、1 件の判断は本物になる「今後も承認する」を安全に作るなら、2 つのゲートを両方通すゲート 1 — 作り手の宣言この操作は自動承認してよい、と定義側で明示する×ゲート 2 — 利用者の許可この種別は今後も自動でよい、と使う側が選ぶどちらか一方だけで自動承認にすると、作り手か利用者のどちらかが意図しない範囲まで開いてしまう。
図61件ずつ止めて聞くのではなく、エージェントは進めておいて、同じターンで承認待ちになった操作をまとめて判断させる。適用後にどう見えるかを一緒に提示できると、判断の材料が揃う。

公開されている実装では、承認待ちの操作について「すべて適用されたらどう見えるか」を先に見せる方式が採られています。エージェントは止まらず先へ進み、人はまとめて判断する。シミュレーションが難しい操作だけ、そのターンで待たせる——という切り分けです。

「今後も承認する」を作る場合は、2つのゲートを両方通す設計にします。作り手が「この操作は自動承認してよい」と定義側で宣言していること、かつ利用者が「この種別は今後も自動でよい」と選んでいること。片方だけで自動承認にすると、作り手か利用者のどちらかが意図しない範囲まで開いてしまいます。

  • 承認をまとめる単位は「ターン」にする。1つでも拒否されたら再開せず、次の指示を待つ——拒否の理由を推測させない。
  • 順序を保って適用する。人の判断が要る操作を飛び越して先の操作を適用しない。
  • 承認を通る経路は1本に絞る。複数あると、必ずどこかで記録が漏れる。

7.読んだことも、同じ記録に残す

監査ログを「書き込みの記録」だと捉えていると、肝心のことが追えなくなります

ひとつの連番に、読み取りも書き込みも載せる001読み取り顧客マスタを参照002読み取り請求履歴を参照003書き込み請求書を送信(承認:田中)004読み取り外部サイトを取得005書き込みステータスを更新(自動承認)書き込みだけを記録すると、「何を根拠にそう判断したか」が追えない。承認の記録は「誰の権限で開いたか」を必須項目にする。自動承認なら、その旨も残す。記録は追記型にし、後から書き換えられないようにする。
図7読み取りと書き込みを、ひとつの連番に載せる。書き込みだけを記録すると、エージェントが何を根拠にそう判断したかが追えない。承認の記録には「誰の権限で開いたか」を必須項目にする。

エージェントの行動を後から説明するには、結果だけでなく、その判断が何を見て行われたかが要ります。「なぜこの取引先に送ったのか」を追うには、直前に何を参照したかが残っている必要があります。

承認の記録では、「誰の権限で開いたか」を必須項目にするのが効きます。記録するかどうかを実装者の善意に任せず、承認を実行する関数がその情報なしには呼べない形にしておくと、記録漏れが構造的に起きなくなります。自動承認だった場合も、その旨を残します。

8.敷く順番を、間違えない

最後に、実装の順序です。ここは後回しにするほど高くつく性質があります。

① 境界既定はゼロアクセス。隔離された実行環境最初に敷く。後から狭めるのは難しい② ゲート承認の判定を通る経路を 1 本に絞る自動承認や再実行を足す“前”に敷く③ 記録読み書きと承認者を、同じ連番に残す改善も説明責任も、ここが土台になる順番が逆になるほど、高くつく。広く開けてから絞るのは、運用が始まってしまうと現実には難しい。
図8①境界を最初に敷く(後から狭めるのは難しい)→ ②承認の判定を通る経路を1本に絞る(自動承認や再実行を足す“前”に)→ ③読み書きと承認者の記録を残す。

とくに②は、機能を足す前に敷いておくのが安い部分です。自動承認や再実行といった機能は、承認の経路を増やす方向に働きます。経路が1本に絞られた後なら安全に足せますが、増えた後で1本にまとめるのは難しくなります。

9.アンチパターン早見表

ここまでの内容を、実装で見かける形にして並べます。

よくある実装何が問題かどうするか
承認を唯一の安全策にする約93%は承認される。回数が増えるほど判断が薄くなる先に環境の境界を敷き、承認は不可逆な操作に絞る
とりあえず広く許可し、後で絞る運用が始まると、実際には絞られない既定はゼロアクセス。必要な能力だけ名指しで足す
許可リストを宛先フィルタとして扱うそのサービスでできること全部を渡しているリソースと操作の単位まで絞る
サンドボックスの中に資格情報を置く隔離が破られた瞬間、鍵も渡る仲介役に持たせ、依頼だけを通す
自作の許可プロキシで隔離を代用する抜け道を塞ぎきれない成熟した隔離の仕組みを使う
1件ずつ同期で承認を求める待たされるほど、中身を見ずに押すようになる進めておいて、まとめて判断させる
書き込みだけを監査ログに残す何を根拠に判断したかが追えない読み取りも同じ連番に載せる
承認経路が複数ある記録漏れが起き、後から説明できない承認を通る経路を1本に絞る

Summary

この記事の要点

  1. 1安全は、承認の丁寧さではなく境界の設計で決まる。届かないものは、そもそも触れない。
  2. 2危険は「機密に触れる × 信頼できない入力 × 外部へ送信できる」が揃ったときに生まれる。1つ外せば経路は成立しない。
  3. 3許可は「宛先のフィルタ」ではなく「能力の付与」。何ができるようになるかで判断し、リソースと操作まで絞る。
  4. 4既定はゼロアクセス。「とりあえず許可して後で絞る」は、絞られないまま運用に入る。
  5. 5隔離の強度は利用者に合わせる。現場が使うなら、精査ではなく絶対的な境界が要る。
  6. 6隔離そのものは自作しない。自作するなら、その上のポリシー層にする。
  7. 7資格情報はエージェントに渡さない。仲介役に持たせ、依頼だけを通す。
  8. 8承認プロンプトの約93%は承認される。人の承認は最後の一手で、不可逆な操作に絞る。
  9. 9承認は減らすほど質が上がる。まとめて判断させ、自動承認は作り手と利用者の2ゲートを両方通す。
  10. 10監査ログには読み取りも載せる。承認の記録は「誰の権限で開いたか」を必須項目にする。
  11. 11敷く順番は 境界 → ゲート → 記録。後回しにするほど高くつく。

Series complete

シリーズ全5回のまとめ

エージェンティック・ハーネスの設計を、定義から統制まで5回で辿りました。全体像を確認したいときの索引としてお使いください。

FAQ

よくある質問

不十分です。Anthropicの報告によれば、Claude Codeの許可プロンプトは約93%が承認されており、承認を求める回数が増えるほど1件あたりの判断は薄くなります。人間の監督は決定論的な環境境界の代替になりません。まず既定でゼロアクセスとし、隔離された実行環境と、必要な能力だけを与える許可設計を先に敷いたうえで、人の承認は金銭・削除・外部送信・公開といった不可逆な操作に絞ります。

「機密データに触れる」「信頼できない入力にさらされる」「外部へ送信できる」の3つが同時に揃ったときです。外部から混入した指示が、機密を外へ運ぶ経路になり得ます。すべてを安全にしようとするより、この3つを同時に揃わせない設計のほうが現実的です。たとえば外部の文書を読ませる作業では、その間だけ外部送信の手段を渡さない、といった切り方をします。

「宛先のフィルタ」ではなく「能力の付与」として捉える必要があります。あるサービスへの接続を許すことは、そのサービスでできること全部——ファイルのアップロード、任意の相手への共有、既存ファイルの削除など——を許すことに等しくなります。判断は「どこへつなぐか」ではなく「何ができるようになるか」で行い、許可の単位をリソースと操作まで絞ります。

利用者の専門性に合わせます。開発者は実行される内容を読んで危険かどうか判断できるため、精査に耐える範囲で弱めの隔離も選べます。一方、業務の現場が使う場合は実行内容の精査を期待できないため、精査ではなく絶対的な境界が必要になります。また、自作の許可プロキシで代用しようとすると抜け道を塞ぎきれないことが多く、成熟した隔離の仕組みを使うのが定石です。

渡さない構成が推奨されます。資格情報は外側の仲介役に持たせ、エージェントは「仲介役に依頼する」ことしかできないようにします。仲介役がポリシーを適用し、何を読んだかを記録し、操作を仲介します。この構成なら、エージェントが乗っ取られても鍵そのものは渡っていません。逆にサンドボックスの中に鍵を置くと、隔離の強度がそのまま鍵の防御力になってしまいます。

回数を減らすことが、そのまま質を上げます。1件ずつ止めて聞くのではなく、エージェントは進めておいて、同じターンで承認待ちになった操作をまとめて判断させる方式が有効です。適用後にどう見えるかを一緒に提示できると、判断の材料が揃います。「今後も承認する」を作る場合は、作り手が自動承認可と宣言していること、かつ利用者がその種別を許可していること——2つのゲートを両方通す設計にします。