AIエージェントとDockerの組み合わせで安全な自律実行環境を作る
AIエージェントが自律的にコードを実行する際のセキュリティリスクをDockerで管理する実践的な設計パターンを解説。権限最小化、リソース制限、ネットワーク隔離を組み合わせた堅牢な実行環境の構築方法を紹介する。
なぜDockerが自律実行環境に必要なのか
AIエージェントが自律的にコードを実行するとき、そのコードは常に予期した通りに動くとは限りません。エージェントが誤ったコマンドを実行してシステムファイルを削除したり、意図せず大量のリクエストを送信してAPIレート制限に引っかかったりするリスクがあります。Dockerによるコンテナ化は、こうしたリスクを限定的な範囲に封じ込める「防波堤」として機能します。
OpenHandsはデフォルトでDockerを使ったサンドボックス実行を採用しており、エージェントのすべての操作がコンテナ内に閉じ込められます。この設計思想を自前のAIエージェントシステムに取り込む方法を解説します。
最小権限コンテナの設計
セキュアなAIエージェント実行コンテナの設計の核心は「最小権限原則」です。rootユーザーではなく専用の非特権ユーザーでプロセスを実行し、--cap-dropですべての特権を剥奪した上で、必要なもの(例:net_bind_service)のみを--cap-addで付与します。read-onlyなファイルシステムをベースに、書き込みが必要なディレクトリのみtmpfsやボリュームマウントで明示的に許可する構成が推奨されます。
Dockerの--security-optでseccompプロファイルを適用することで、コンテナから呼び出せるシステムコールを制限できます。AIエージェントが使うコンテナに対しては、ファイルシステム操作とネットワーク通信に必要なシステムコール以外をすべてブロックする厳格なプロファイルが理想的です。
リソース制限でコスト暴走を防ぐ
AIエージェントが意図せず無限ループに入った場合、CPUやメモリを使い果たすリスクがあります。--memory、--cpus、--pids-limitの指定でリソース上限を明示的に設定することで、暴走コンテナが他のプロセスに影響を与えることを防ぎます。実行時間の上限はDockerの--stop-timeoutに加え、エージェント側でのタイムアウト管理で二重に担保します。
ネットワーク隔離とホワイトリスト通信
AIエージェントコンテナのネットワーク設計では「デフォルト拒否、必要なもののみ許可」のアプローチを取ります。Dockerのカスタムネットワークを使い、コンテナがアクセスできるサービスを内部ネットワーク内のものに限定します。外部インターネットへのアクセスが必要な場合はHTTPプロキシを経由させ、プロキシレベルでURLホワイトリストを適用します。この構成により、プロンプトインジェクション等で外部への不正なデータ送信を試みた場合でも、ネットワーク層でブロックできます。