AIエージェントとDockerの組み合わせで安全な自律実行環境を作る
AIエージェントが自律的にコードを実行する際のセキュリティリスクをDockerで管理する実践的な設計パターンを解説。権限最小化、リソース制限、ネットワーク隔離を組み合わせた堅牢な実行環境の構築方法を紹介する。
なぜDockerが自律実行環境に必要なのか——「防波堤」の役割を理解する
AIエージェントが自律的にコードを実行するとき、そのコードは常に予期した通りに動くとは限らない。エージェントが誤ったコマンドを実行してシステムファイルを削除したり、意図せず大量のリクエストを送信してAPIレート制限に引っかかったりするリスクがある。実際に「AIエージェントがrm -rfを実行してホームディレクトリが消えた」という事例は複数報告されている。Dockerによるコンテナ化は、こうしたリスクを限定的な範囲に封じ込める「防波堤」として機能する。
OpenHandsはデフォルトでDockerを使ったサンドボックス実行を採用しており、エージェントのすべての操作がコンテナ内に閉じ込められる。「コンテナの中でどんなに暴れても、ホストには影響しない」という安心感が、本番運用への信頼の基盤になる。この設計思想を自前のAIエージェントシステムに取り込む方法を解説する。
最小権限コンテナの設計——「できる最小限」が最も安全
セキュアなAIエージェント実行コンテナの設計の核心は「最小権限原則」だ。rootユーザーではなく専用の非特権ユーザーでプロセスを実行し、--cap-dropですべての特権を剥奪した上で、必要なもの(例:net_bind_service)のみを--cap-addで付与する。read-onlyなファイルシステムをベースに、書き込みが必要なディレクトリのみtmpfsやボリュームマウントで明示的に許可する構成が推奨される。
Dockerの--security-optでseccompプロファイルを適用することで、コンテナから呼び出せるシステムコールを制限できる。「どのシステムコールを許可するか」のリストアップは最初は大変だが、一度定義してしまえば使い回せる。AIエージェント向けの標準的なseccompプロファイルはGitHubで公開されているものを参考にして、自社の用途に合わせてカスタマイズするアプローチが現実的だ。
リソース制限——コスト暴走と「無限ループ問題」を防ぐ
AIエージェントが意図せず無限ループに入った場合、CPUやメモリを使い果たすリスクがある。「AIが永遠にタスクをループし続けてサーバーのメモリが枯渇した」という問題は本番環境で起きている。--memory、--cpus、--pids-limitの指定でリソース上限を明示的に設定することで、暴走コンテナが他のプロセスに影響を与えることを防ぐ。実行時間の上限はDockerの--stop-timeoutに加え、エージェント側でのタイムアウト管理で二重に担保することをすすめる。
具体的な設定値として、AIエージェントの1タスクあたりの実行時間は最大30分を目安に設定し、メモリは2GB、CPUは1コアを上限にするところから始めるといい。実際の使用状況を見ながら緩めたり締めたりして最適値を探す。最初は厳しく設定して様子を見るアプローチが安全だ。
ネットワーク隔離——「デフォルト拒否」が唯一の正解
AIエージェントコンテナのネットワーク設計では「デフォルト拒否、必要なもののみ許可」のアプローチを取る。Dockerのカスタムネットワークを使い、コンテナがアクセスできるサービスを内部ネットワーク内のものに限定する。外部インターネットへのアクセスが必要な場合はHTTPプロキシを経由させ、プロキシレベルでURLホワイトリストを適用する。
この構成により、プロンプトインジェクション等で外部への不正なデータ送信を試みた場合でも、ネットワーク層でブロックできる。「コンテナの中でどんな悪意あるコードが動いても、外には出られない」という多重防御が完成する。あなたのAIエージェントを本番環境に出す前に、このネットワーク隔離設定が済んでいるか確認してほしい。これが済んでいない状態での本番運用は、セキュリティの穴を開けたまま走っているようなものだ。