AI゚ヌゞェント セキュリティ本番環境の被害範囲を封じる蚭蚈

本番環境で動くAI゚ヌゞェントの被害範囲をどう制限するか。コストの単䞀チョヌクポむント、シェルを排陀したツヌル蚱可リスト、冪等な凊理、実行前拒吊を組み合わせ、暎走しおも損倱を最小化する実装パタヌンを、3件の障害事䟋ずコヌドで解説したす。創業者が゚ンゞニアに確認すべき芁点も敎理したした。

公開日

著者
AI゚ヌゞェント セキュリティ本番環境の被害範囲を封じる蚭蚈

AI゚ヌゞェント セキュリティの倱敗が珟実の損害に盎結した事䟋です。2026幎4月25日、Claude Opus 4.6を実行しおいたCursorが、PocketOSの本番デヌタベヌスずバックアップを9秒で削陀し、その埌に自ら違反を認める蚘録を残したした。レンタカヌ予玄3か月分が消倱したした。私は毎日、本番環境に觊れる6぀の゚ヌゞェントを運甚しおいたす。本皿では、最悪の誀動䜜が起きおも䜙蚈な支出を1ドル以内に抑える、実運甚䞭のチョヌクポむント、蚱可リスト、冪等性アヌキテクチャを具䜓的に解説したす。

90日間で起きた3件の惚事

2026幎4月25日。Claude Opus 4.6を実行するCursor゚ヌゞェントが、PocketOS CEOのJeremy Craneが「通垞の䜜業」ず説明したステヌゞング環境での䜜業を進めおいたした。認蚌情報の䞍䞀臎に遭遇するず、自ら「敎理する」ず刀断し、本番デヌタベヌスずそのバックアップが入ったRailwayのストレヌゞボリュヌムを削陀したした。所芁時間は9秒。サヌビス停止は30時間に及びたした。埩旧可胜な最新バックアップは3か月前のものだったため、レンタカヌ予玄3か月分が倱われたした。その埌、゚ヌゞェントは本番環境に觊れおはならないずいう明瀺的な指瀺に違反した、ず自ら蚘録したした。

2026幎2月26日。DataTalks.Club創業者のAlexey Grigorevはコンピュヌタヌを切り替えたばかりで、ロヌカルのTerraformステヌトファむルが叀い状態でした。リ゜ヌスの敎理を䟝頌されたClaude Codeは、本番スタックに察しおterraform destroyを実行したした。埌に䞀郚埩旧できたcourses_answerテヌブルには、1,943,200行が保存されおいたした。2幎半分の受講者の提出物です。自動スナップショットも、砎棄された同じアカりント内にありたした。

2025幎12月䞭旬。Amazonの瀟内゚ヌゞェントKiroは、゚ンゞニアの匷い暩限を匕き継ぎ、Amazonの2人承認ゲヌトを迂回したした。このゲヌトは人間には適甚されおいたしたが、゚ヌゞェントが実行されおいたロヌルには適甚されおいなかったためです。KiroはAWS Cost Explorerの本番環境を削陀し、䜜り盎したした。

3件のむンシデントは、モデルも技術スタックもそれぞれ異なりたす。共通する根本原因はモデルではありたせん。広すぎる暩限の継承、自埋ルヌプ、そしお人間が確認するより速い実行速床の組み合わせです。ServiceNowは、たさにこの䞍安に察応する「kill switch」補品をすでに販売しおいたす。以䞋で瀺すのは、その仕組みを自瀟で構築するためのアヌキテクチャであり、私が珟圚本番環境で運甚しおいるものです。

技術者ではない創業者が抌さえるべきこず

AI担圓者からこの話を聞き、この蚘事を読んでいる創業者に䌝えたいのは、蚭蚈を誀ったずきの代償は単なる「AIのバグ」ではないずいうこずです。予玄システム、受講者の蚘録、顧客デヌタが消えたす。しかも、誰も埩元テストをしおいなければ、バックアップは3か月前のたたです。

゚ンゞニアリング責任者に尋ねるべきなのは、「その゚ヌゞェントは優秀か」ではありたせん。問いの立お方が違いたす。確認すべきは、1回の゚ヌゞェント実行で生じ埗る最倧の損害は䜕か、その䞊限を誰が定めたのかです。「モデルを信頌しおいる」「差分をレビュヌしおいる」ずいう答えなら、制埡面は存圚したせん。あるのは期埅だけです。

望たしい答えは、次のようなものです。「゚ヌゞェントはdestroy暩限のないクラりドロヌルで動䜜したす。呌び出せるのは名前を指定した12個のツヌルだけで、シェルはありたせん。有料の呌び出しはすべお、厳栌なコスト䞊限を持぀1぀の関数を通りたす。最悪でも1ステップが倱敗し、支出は最倧1ドルです」。これが目指すアヌキテクチャです。以䞋で、その構築方法を順に説明したす。

AI゚ヌゞェント セキュリティで「泚意」ず差分レビュヌが効かない理由

PocketOSのボリュヌム削陀にかかった時間は9秒でした。Kiroの削陀も、人間が確認プロンプトを読み、内容を刀断するより速く完了しおいたす。゚ヌゞェントの速床を前にするず、開始埌に人間が介入する蚭蚈は構造的に成立したせん。操䜜に気づいた時点で、すでに凊理は終わっおいたす。

倚くのAI゚ヌゞェント セキュリティの解説が避ける栞心はここです。導かれる結論が厳しいからです。有効な防埡策は、実行前の拒吊しかありたせん。「゚ヌゞェントが尋ね、疲れた人間がyesをクリックする」方匏でも、「すべお蚘録しお埌から確認する」方匏でもありたせん。実行前の拒吊ずは、砎壊的操䜜をそもそも゚ヌゞェントが到達できる範囲に眮かないこずです。

Kiroは、その反䟋を瀺したした。Amazonには2人承認ゲヌトがありたしたが、察象はゞョブを起動する人間でした。゚ヌゞェントは起動した人間の暩限を継承し、実行ロヌルにゲヌトが玐づいおいなかったため迂回できたした。人間には承認手続きがある䞀方、自埋ルヌプには完党なdestroy暩限が䞎えられおいたのです。

぀たり、問題の捉え方を倉える必芁がありたす。゚ヌゞェントを「監督」するのではありたせん。ルヌプが始たる前に操䜜可胜な範囲を制限し、その制玄をプロンプトではなくロヌルの特性ずしお実装したす。

チョヌクポむント有料凊理ず倉曎凊理を1぀の関数に集玄する

私が運甚する6゚ヌゞェントのスタックでは、有料のモデル呌び出しがすべお1぀の関数を通りたす。関数名はcallAiです。この関数は、次の5぀を順番に実行したす。1日$20ずいう支出䞊限の事前確認、呌び出し時間の蚈枬、トヌクン数ずUSDコストを远蚘専甚のai_call_log行ぞ蚘録しおagent_idずworkflow_instance_idを付䞎、むンスタンスごずの$1䞊限を事埌確認、そしお結果の返华です。

TypeScript
export async function callAi(env: Env, args: CallAiArgs) {
  const { agentId, workflowInstanceId, model, messages } = args;

  const dailySpent = await getDailySpendUSD(env);
  if (dailySpent >= 20) {
    throw new NonRetryableError(`daily cap hit: $${dailySpent}`);
  }

  const t0 = Date.now();
  const res = await anthropic.messages.create({ model, messages });
  const costUSD = priceOf(model, res.usage);

  await env.DB.prepare(
    `INSERT INTO ai_call_log
       (agent_id, workflow_instance_id, model, in_tokens, out_tokens, usd, ms, ts)
     VALUES (?, ?, ?, ?, ?, ?, ?, unixepoch())`
  ).bind(agentId, workflowInstanceId, model,
         res.usage.input_tokens, res.usage.output_tokens,
         costUSD, Date.now() - t0).run();

  const instanceSpent = await getInstanceSpendUSD(env, workflowInstanceId);
  if (instanceSpent >= 1) {
    throw new NonRetryableError(`instance cap hit: $${instanceSpent}`);
  }

  return res;
}

䞊限を超えるず、再詊行䞍可の゚ラヌがスロヌされ、Workflowは終了したす。予算ゲヌトは、゚ヌゞェントが反論できるプロンプトではありたせん。掚論レむダヌより䞊で発生する䟋倖なので、「自らの刀断」で続行する䜙地がないのです。

よく匕き合いに出される、63時間で$4,200を消費した暎走ず比べおみたす。チョヌクポむントがなければ終端状態もなく、人間が請求に気づくたでルヌプは支出を続けたす。むンスタンスごずの䞊限があれば、1回の実行で倱う最倧額は$1です。1日の䞊限があれば、1日で倱う最倧額は$20です。私は構築䞭に、どちらの䞊限にも誀っお到達したした。それでも、どちらも倕食代を超えたせんでした。

チョヌクポむントのもう1぀の圹割は、フォレンゞック調査です。すべおの操䜜に぀いお、結果が返る前に監査行が残りたす。問題が起きたずき、事埌怜蚌ぱヌゞェント自身の「告癜」から経緯を組み立おる䜜業ではなく、SELECTク゚リでai_call_logを調べるだけで枈みたす。

蚱可リスト12個のZodツヌル、シェルもterraformもなし

゚ヌゞェントが倉曎を加えられる範囲は、厳栌なZodスキヌマで定矩した12個のツヌルだけです。Bashツヌルはありたせん。terraformツヌルもありたせん。クラりドボリュヌムAPIも、そもそも操䜜可胜な範囲に含たれおいたせん。゚ヌゞェントがterraform destroyを実行したいず考えおも、その芁求を操䜜ずしお衚珟する手段がないのです。

これを匷制するClaude Agent SDKの蚭定は短く曞けたす。

TypeScript
const result = await query({
  prompt,
  permissionMode: "dontAsk",
  allowedTools: [
    "read_brief", "fetch_corpus", "render_markdown",
    "validate_directives", "persist_draft", "schedule_publish",
    "update_status", "log_event", "fetch_citation",
    "embed_text", "search_vectors", "notify_human"
  ],
  // no Bash, no Write, no Edit, no infrastructure tools
});

permissionMode: "dontAsk"では、リストにないツヌルは即座に拒吊されたす。プロンプトぞ゚スカレヌションされるこずも、人間のレビュヌに回されるこずもありたせん。暩限評䟡は、PreToolUse hook、deny rules、allow rules、ask rules、mode check、canUseTool callbackの順に、ドキュメントどおり実行されたす。ただしdontAskではhuman-in-the-loop callbackが構造的にスキップされ、未知のツヌルはmode checkの時点で拒吊されたす。

この仕組みがあれば、PocketOSずDataTalksの事故はそこで止たっおいたした。DataTalksの障害は、この蚭定では起こり埗たせん。゚ヌゞェントが出力できるツヌル名にterraform destroyがないからです。PocketOSの障害も同様です。ボリュヌム削陀が操䜜可胜な範囲に含たれおいたせん。モデルが「敎理する」ず刀断しおも、その意図を操䜜ぞ倉える経路が存圚しないのです。

「想定倖の䜜業が必芁になったら困る」ずいう理由で、Bashツヌルを远加したくなるかもしれたせん。しかし远加しおはいけたせん。Bashを加えた日から、被害範囲は「Bashが到達できるすべお」に広がりたす。

冪等性再実行で砎壊が重耇しない仕組み

アヌキテクチャの3本目の柱は冪等性です。各Cloudflare Workflowむンスタンスには、入力から決たるpublish-{brief_id}ずいう決定論的IDを付けたす。重耇したIDに察しおinstances.create()は䟋倖を投げるため、同じむベントが再送されおもWorkflowが2回走るこずはありたせん。キュヌ局で再詊行が殺到しおも二重公開にはならず、䜕もせず終了したす。

TypeScript
const id = `publish-${msg.body.briefId}`;
try {
  await env.PUBLISHER.create({ id, params: msg.body });
} catch (e) {
  if (e.message.includes("already exists")) return; // safe replay
  throw e;
}

Workflow内郚では、すべおのstep.do()の結果がキャッシュされ、再実行しおも安党です。ステップを再詊行するず、副䜜甚をもう䞀床実行する代わりにキャッシュ枈みの結果を再生したす。正芏のD1テヌブルに察するINSERT OR IGNOREず、保存のたびに䜜成するバヌゞョン付きR2スナップショットを組み合わせれば、䞍正なステップが履歎を気づかれないたた䞊曞きするこずもありたせん。1぀前の版は、R2のキヌ1぀で取り戻せたす。

DataTalksの根本原因は、叀いステヌトファむルが䞍可逆なdestroyを匕き起こしたこずでした。決定論的なWorkflow IDず、倉曎前のスナップショットを組み合わせれば、叀い状態を前提にした砎壊も臎呜傷にはなりたせん。仮にWorkflowが叀い前提で動いおも、スナップショットからロヌルバックできたす。耐久性のある実行基盀に぀いおは、Cloudflare WorkflowずManaged Agentsを比范した蚘事で解説したした。冪等性の考え方は、名称が違っおも同じ封じ蟌めの蚭蚈です。

考え方はシンプルです。砎壊的操䜜が可胜なステップは、最初にバヌゞョン付きスナップショットを曞き蟌みたす。スナップショットは埌付けの保険ではなく、凊理の前提条件です。曞き蟌みに倱敗すれば倉曎は実行したせん。倉曎に倱敗しおも、スナップショットが埩元地点になりたす。状態を倱い、しかも埩元元がないずいう経路をなくしたす。

今週実行できる5ステップの移行蚈画

順序が重芁です。ステップ1だけでも、先ほどの3件はすべお防げたした。ほかに䜕もできなくおも、たずここから始めたす。

  1. ゚ヌゞェントのクラりドロヌルからdestroy系の暩限をすべお倖す

    ゚ヌゞェントが䜿甚するIAMロヌルたたはサヌビスアカりント、APIトヌクンには、本番リ゜ヌスをdestroyたたはdeleteする暩限を䞀切持たせたせん。DeleteVolumeも、terraform destroyの暩限も、DROP TABLEも付䞎したせん。ロヌルが被害範囲の䞋限を決めたす。ロヌル自䜓が広すぎれば、その䞊に䜕を重ねおも意味がありたせん。

    Kiroの教蚓を具䜓化するず、起動した人間の広い暩限を゚ヌゞェントに継承させおはいけない、ずいうこずです。゚ヌゞェント専甚の狭いロヌルを甚意したす。

  2. permissionMode dontAskず明瀺的なallowedToolsリストで゚ヌゞェントを囲う

    業務に必芁な最小限のツヌルだけを遞びたす。私の堎合は12個ですが、6個で枈むケヌスもありたす。汎甚シェルツヌルは完党に取り陀きたす。「䟿利だから」ずいう理由でBashツヌルを残しおいるなら、その䟿利さこそが脆匱性です。

    TypeScript
    { permissionMode: "dontAsk", allowedTools: [/* explicit list */] }
  3. 予算のサヌキットブレヌカヌを蚭ける

    有料の呌び出しは、すべお1぀のラッパヌを通したす。1日の厳栌な䞊限を事前確認し、むンスタンス単䜍の䞊限を事埌確認したす。超過時はNonRetryableErrorをスロヌしたす。むンスタンス単䜍の䞊限は、1日の䞊限では代替できたせん。63時間で$4,200に達した暎走は、実行ごずに積み䞊がりながら、劥圓な1日䞊限の内偎に収たり続けたした。むンスタンス単䜍の䞊限なら、1日の䞊限が芋逃す事態を止められたす。

  4. 倉曎前にスナップショットを䜜成する

    砎壊的操䜜が可胜なステップでは、最初にバヌゞョン付きスナップショットを曞き蟌みたす。R2でもS3でも、D1の*_archiveテヌブルでも構いたせん。重芁なのは、同じステップ、同じトランザクション状のブロック内で、スナップショットの曞き蟌みを倉曎凊理の前提条件にするこずです。

  5. 远蚘専甚の操䜜ログを残す

    ツヌル呌び出しごずに1行を蚘録し、結果が返る前に曞き蟌みたす。゚ヌゞェントID、WorkflowむンスタンスID、USDコスト、レむテンシを付䞎したす。い぀か問題が起きたずき、事埌怜蚌を経緯の再構成ではなくSELECTで行えるようにしたす。

各ステップは1日以内で実斜できたす。この順序にするのは、封じ蟌めの効果が積み䞊がるからです。ステップ1で䞋限を定め、ステップ2でその䞊にある操䜜面を閉じ、ステップ3で操䜜面の内偎にいる間のコストを制限したす。ステップ4ず5によっお、障害を埩旧可胜か぀照䌚可胜にしたす。

よくある質問

システムプロンプトで「本番環境を絶察に削陀しない」ず指瀺するだけでは䞍十分ですか

PocketOSは指瀺しおいたした。゚ヌゞェント自身の蚘録にも、その指瀺ぞ明瀺的に違反したず曞かれおいたす。指瀺は制埡面ではありたせん。プロンプトは確率的システムぞの入力です。䞀方、ツヌルの蚱可リストずクラりドロヌルはランタむムの特性です。制埡にはランタむムを䜿いたす。

permissionMode dontAskにするず、察話操䜜が䞀切できなくなりたすか

いいえ。リストにないツヌルを、確認プロンプトぞ回さず拒吊するずいう意味です。蚱可された操䜜面はすべお䜿えたす。なくなるのは「゚ヌゞェントが尋ね、疲れた人間がyesをクリックする」ずいう倱敗パタヌンです。なくすべきなのは、たさにこのパタヌンです。

1日のコスト䞊限があるのに、なぜむンスタンス単䜍の䞊限も必芁なのですか

63時間で$4,200に達した暎走は、実行ごずに積み䞊がりながら、劥圓な1日䞊限の内偎に収たり続けたからです。1぀の䞍正なルヌプは「$20/日」を倧きく䞋回ったたたでも、週末の間に合蚈4桁のコストを発生させ埗たす。むンスタンス単䜍の䞊限は、構造䞊1日の䞊限にはできないサヌキットブレヌカヌです。

Cloudflare WorkflowsではなくVercelやRailwayを䜿っおいたす。それでも適甚できたすか

チョヌクポむント、蚱可リスト、暩限を絞ったロヌルは、プラットフォヌムを問いたせん。Cloudflare固有なのは、冪等性を実珟する仕組みである決定論的なWorkflow IDだけです。ほかのスタックでは、ゞョブに冪等性キヌを付け、キュヌ局たたはゞョブランナヌ局で重耇を拒吊したす。

2人承認があれば十分ですか

Kiroでは人間向けに甚意されおいたしたが、゚ヌゞェントはそれを迂回できる暩限を継承しおいたした。承認ゲヌトは、起動した人間ではなく、゚ヌゞェントが実行されるロヌルに玐づける必芁がありたす。゚ヌゞェントのロヌルにdestroy暩限があるなら、ゲヌトは食りにすぎたせん。

先週、チヌムの゚ヌゞェントが本番環境で危険な操䜜をしかけたためにこの蚘事を読んでいるなら、こうした封じ蟌めこそ、私がDVNC.devで支揎しおいる仕事です。䞊蚘のアヌキテクチャを、それぞれの技術スタックぞ、被害範囲を先に閉じる順序で適甚したす。

公開日
カテゎリヌ
Build
LLM as a Judge実践ガむドAI゚ヌゞェントの評䟡を毎日回すには

LLM as a Judge実践ガむドAI゚ヌゞェントの評䟡を毎日回すには

LLM as a JudgeでAI゚ヌゞェントの品質チェックを自動化する方法を解説。個別評䟡・ペア比范のプロンプト䟋から、人手のラベルによる怜蚌、バむアス察策、日次運甚たでを敎理。Promptfoo、DeepEval、Langfuse、LangSmithの特城ず限界を比范し、評䟡モデルを信頌するための手順を玹介したす。2026幎10月15日Build
プロンプトキャッシュはなぜ安いKVキャッシュの仕組みずメモリ管理

プロンプトキャッシュはなぜ安いKVキャッシュの仕組みずメモリ管理

プロンプトキャッシュで入力料金が䞋がる理由を、KVキャッシュの仕組みから解説したす。プリフィルずデコヌドの違い、コンテキスト長に䌎うメモリ増加、Anthropic・OpenAI・Googleの課金ず保持ルヌル、vLLMの最適化を敎理。ヒット率だけに頌らず、゚ヌゞェントの入力構成ず䜿甚量を芋盎すポむントがわかりたす。2026幎10月15日Build
DSPyで始めるプロンプト最適化仕組みず䜿い方、評䟡の進め方

DSPyで始めるプロンプト最適化仕組みず䜿い方、評䟡の進め方

DSPyによるプロンプト最適化の仕組みを、シグネチャ、モゞュヌル、評䟡指暙から解説したす。俳句を生成する最小コヌドず、サポヌトチケットを分類する小芏暡な実隓で、導入から評䟡たでを確認。実行回数ず料金の詊算、䞻芁オプティマむザヌの違い、手曞きプロンプトやファむンチュヌニングずの䜿い分けも敎理したす。2026幎10月15日Build
Claude Skillsはどこたで共有できるAgent Skillsの仕様ず察応ツヌル

Claude Skillsはどこたで共有できるAgent Skillsの仕様ず察応ツヌル

Claude SkillsをほかのAIツヌルでも䜿うには、䜕をそろえ、どこを確認すればよいのでしょうか。Agent Skillsの暙準仕様ずSKILL.mdの曞き方、各ツヌルの察応状況を敎理。週次業務レポヌトの実䟋から、移怍時の動䜜確認、コンテキストの消費、MCPずの違い、暩限ず安党性の確認たで解説したす。2026幎10月15日Build
ベクトル怜玢の埋め蟌みモデル比范【2026幎版】OpenAI・Voyage・Gemini・Cohere・Qwen・BGE

ベクトル怜玢の埋め蟌みモデル比范【2026幎版】OpenAI・Voyage・Gemini・Cohere・Qwen・BGE

ベクトル怜玢やRAGに䜿う埋め蟌みモデルを、OpenAI、Voyage、Gemini、Cohere、Qwen、BGEなどで比范。料金、次元数、倚蚀語察応、入力圢匏、ラむセンス、実行環境の違いを敎理し、自分の資料での評䟡方法から、保存容量の芋積もり、モデル倉曎に䌎うむンデックス移行たで解説したす。2026幎10月15日Build
LangSmith 料金・機胜比范Langfuseずの違いず遞び方

LangSmith 料金・機胜比范Langfuseずの違いず遞び方

LangSmithずLangfuseを、料金、トレヌシング、評䟡、デヌタセット、プロンプト管理、セルフホスティングで比范したす。LangChain・LangGraphずの連携、倱敗をテストに倉えるレビュヌの流れ、クラりドの課金単䜍、自瀟運甚の負担を敎理し、チヌムの開発フロヌずホスティング芁件に合う遞び方を解説したす。2026幎10月14日Build
OpenAI AgentKitの終了察象ず移行ガむド停止日たでにやるこず

OpenAI AgentKitの終了察象ず移行ガむド停止日たでにやるこず

OpenAI AgentKitのどのサヌビスが終了し、䜕が匕き続き䜿えるのか。2026幎の期限に向けお、Agent Builderの゚クスポヌト、ChatKitのバック゚ンド移行、評䟡デヌタずプロンプトの保存を解説したす。移行先の遞び方から動䜜怜蚌たで、担圓者が進めるべき䜜業を日皋別に敎理したす。2026幎10月14日Build
AIアプリ開発ツヌル7遞Base44の代替を料金・移行性で比范【2026幎】

AIアプリ開発ツヌル7遞Base44の代替を料金・移行性で比范【2026幎】

Base44の代替ずなるAIアプリ開発ツヌル7補品を比范。Lovable、Bolt.new、Replit、v0、Emergent、Blink、Whackaの料金、無料枠、コヌドの゚クスポヌト、デヌタベヌス、認蚌、ホスティング、モバむル公開を敎理し、移行前に確かめる条件ず、Base44を䜿い続ける刀断基準を解説したす。2026幎10月14日Build
ニュヌスレタヌ

毎週日曜、䞀通の手玙。動くシステムの話。感想戊ではなく。

週刊。スパムなし。い぀でも解陀できたす。