Dockerサンドボックスの活用 — ローカルAIエージェントによる危険なコード実行を防ぐ

Haram

@haram

Docker 샌드박스 연동 — 로컬 AI 에이전트의 위험한 코드 실행 막기

Dockerサンドボックスの活用 — ローカルAIエージェントによる危険なコード実行を防ぐ

自作のAIエージェントが自分のPCで制限なくPythonコードを実行するようにしていたら、どうなるでしょうか?誤ったプロンプトや外部からの指示に騙され、重要なファイルを盗まれたり、破壊的なシステムコマンドを実行させられたりする「エージェント・ハイジャック」のリスクにさらされる可能性があります。

この記事では、大切なPCを完全に守りながらAIを存分に実験できるよう、Dockerを活用して簡単にローカル環境を隔離する方法を解説します。

なぜPython言語自体のガードレールだけでは不十分なのか?

AIエージェントを初めて作成する際にやりがちなミスがあります。それは、Pythonコード内で「特定のライブラリは使用しない」「危険なコマンドは実行しない」といった文字単位のガードレールを設けることです。

しかし、Pythonは非常に柔軟で動的な言語であるため、この程度の制限は簡単に回避されてしまいます。クラスの継承構造を辿ったり、ランタイムの弱点を突いたりする独創的な回避策は無限に存在するからです。部屋のドアを軽く閉めて壁に禁止事項を書き込む程度の対策では、悪意のある操作を防ぐことはできません。

このように、AIエージェントが悪意のあるプロンプトに騙され、ユーザーのPCで勝手にコマンドを実行してしまう脅威を「エージェント・ハイジャック(OWASP ASI05)」と呼びます。一度この防御壁が突破されると、ローカルディレクトリに保存されたプロジェクトファイルが削除されたり、APIキーやSSHキーといった重要な秘密情報が外部に漏洩したりする壊滅的な事故につながる恐れがあります。

結局、私たちに必要なのは数行のコードによる警告ではなく、エージェントがどんなに暴れても外には絶対に出られない「閉ざされた遊び場」です。悪意のあるコードが実行されたとしても、隔離された遊び場の中でしか機能せず、実際のPCには指一本触れられないようにしなければなりません。ローカル開発環境において、この強固な物理的フェンスの役割を最も完璧に果たしてくれるのがDockerです。

安全なDockerサンドボックスを構築するための5つの重要設定

単にDockerコンテナを起動するだけでは安心できません。デフォルト設定のDockerには、ホストPCのシステムを覗き見たり、リソースを過剰に使用したりするための小さな隙間が残っているからです。エージェントが遊ぶ空間を安全な砂場にするには、外部への出口を厳重に封鎖する必要があります。

Python Docker SDKや設定ファイルで指定できる、最も確実なロック機構を5つ紹介します。

  • 네트워크 차단 (network_mode='none'): 컨테이너 안에서 실행되는 코드가 인터넷에 접속하는 길을 원천 봉쇄합니다. 내 중요한 정보를 외부 서버로 유출하지 못하도록 사방을 높은 벽으로 막아두는 역할을 합니다.
  • 읽기 전용 파일시스템 (read_only=True): 컨테이너 내부의 핵심 시스템을 얼려둡니다. 대신 임시 작업 공간은 메모리 위에 아주 작게 만들어 주는 tmpfs 설정을 더해, 칠판에 낙서만 할 수 있고 벽 자체는 부수지 못하게 만듭니다.
  • 모든 특권 해제 (cap_drop=['ALL']): 컨테이너가 가질 수 있는 강력한 시스템 관리 권한을 모두 빼앗아 버립니다. 여기에 security_opt 옵션을 더하면 에이전트가 어떤 꼼수를 쓰더라도 관리자 권한을 새로 얻어낼 수 없습니다.
  • 비루트 사용자 실행 (user='1000:1000'): 최고 관리자인 루트가 아니라 권한이 거의 없는 일반 사용자로 코드를 실행하게 만듭니다. 이중 자물쇠를 채워 혹시 모를 시스템 침입에 대비하는 조치입니다.
  • 리소스 한계 설정 (mem_limit='256m'): 메모리와 CPU 사용량에 명확한 한계를 설정합니다. 코드가 무한 루프에 빠져 폭주하더라도 내 실제 컴퓨터가 멈추거나 느려지지 않도록 차단기를 내리는 것입니다.

この5つのロックを適切に組み合わせるだけで、ローカルエージェントがPCを破壊するリスクは事実上ほぼゼロになります。

もっと簡単に連携させる:MastraフレームワークとCode Sandbox MCP

上記のような複雑なDocker設定を開発者がすべて手作業でコーディングするのは手間がかかります。幸いなことに、最近のAIエコシステムには、こうしたセキュリティの隔離作業を自動化してくれる便利なツールが登場しています。

代表的なものが、TypeScriptベースのAIエージェントフレームワークである「Mastra」です。このフレームワークの@mastra/dockerパッケージを活用すれば、数行のコードでローカルDockerコンテナを安全に生成・制御できます。メモリ制限やネットワーク遮断などのルールも、設定ファイルで直感的に定義可能です。

ts
// Mastra의 DockerSandbox 설정 예시
import { DockerSandbox } from '@mastra/docker';

const sandbox = new DockerSandbox({
  image: 'python:3.11-slim',
  containerConfig: {
    networkDisabled: true,
    HostConfig: {
      Memory: 256 * 1024 * 1024, // 256MB 제한
      NanoCpus: 1000000000, // 1 CPU 코어 제한
    },
  },
});

ClaudeやGeminiなどのLLMクライアントを直接利用している開発者であれば、Model Context Protocol(MCP)の「Code Sandbox MCP」を連携させるのも良い選択です。このツールはバックグラウンドでDockerコンテナのライフサイクルを自動管理し、エージェントが生成したコードを隔離環境で実行した結果だけを安全に返してくれます。複雑なコンテナ管理コードを一切書く必要がないため、サービス開発の初期段階で非常に有用です。

安全なエージェント開発、まずはローカルサンドボックスから

ローカル環境でDockerを使って隔離膜を構築することは、AIエージェントのセキュリティにおいて最も重要な第一歩です。

実際のサービス運用段階ではさらに強力な仮想化ソリューションが必要になるかもしれませんが、自身のPCで実験するレベルであれば、今回紹介したDocker設定だけで十分に強固な盾となります。大切なコンピュータをしっかり守りながら、より自由で賢いAIエージェントを作ってみてください!

(編集済み)