AIエージェントから秘匿ファイルを隠しつつ、AIに好き勝手させても大丈夫な環境を作った話
はじめに — こんな経験ありませんか?
Claude CodeやGeminiなどのAIコーディングアシスタントは開発を加速してくれます。でも、こんな場面でヒヤッとしたことはないでしょうか。
- AIが
.envの中身をうっかり読んでしまった -
secrets/ディレクトリのAPIキーがAIのコンテキストに入った - 「このファイルを読まないで」とお願いしたいが、確実な方法がない
- 作業PCにAIを入れていると、自分と同じファイルが読めてしまう — 極秘メモも読まれる?
一方で、こんな不便もあります。
- 作業PCにAIを入れていると、書き込みやコマンド実行のたびに確認を求められAIに任せられない
- AIをコンテナに隔離すると、他のコンテナのログが見れなくなるテストを実行できない
- そもそもAIをコンテナに隔離すると、AIがコンテナの操作ができない
秘密は隠したい。でもAIには活躍してほしい。
この2つを両立するために、AI Sandbox というテンプレートリポジトリを作りました。
開発に至った経緯や当時のエピソードはこちらの記事にまとめています。
→ AIエージェントはあなたの秘匿データを見ている ― 私が見つけた解決策(Qiita)
公式の選択肢を知っておく
まず、既に公式から提供されているサンドボックス環境を紹介します。
Docker Sandbox
Docker公式のAIサンドボックスは、microVM(軽量仮想マシン)でAIを隔離します。
-
docker sandbox run claude ~/my-projectで起動 - 各sandboxに独立したDocker daemonが動く
- ファイルシステムとネットワークが完全に分離される
強力な分離ですが、既に動いている開発用コンテナのログを見たり、テストを走らせる用途には向きません。sandbox内のDocker daemonは独立しているため、開発環境の他のコンテナとは別世界です。
Claude Code Sandbox
Claude Codeのネイティブサンドボックスは、OSレベルのプリミティブ(Linux: bubblewrap、macOS: Seatbelt)で分離します。
-
/sandboxコマンドで有効化 - ファイルシステムとネットワークの両方を制限
- 書き込みは作業ディレクトリに限定。読み取りは拒否設定したパスのみブロック
こちらも優れた仕組みですが、Claude Code専用です。Gemini CLIやClineなど他のAIツールでは使えません。
比較
| Docker Sandbox | Claude Code Sandbox | AI Sandbox | |
|---|---|---|---|
| 分離方式 | microVM | OS プリミティブ | Docker コンテナ + volume mount |
| 秘匿方式 | VM分離 | パス単位の拒否設定 |
/dev/null マウント |
| ネットワーク制限 | あり | あり | なし(公式スクリプト併用を推奨) |
| 他コンテナ連携 | sandbox内で独自Docker | なし | DockMCP経由 |
| 対応AI | Claude, Codex, Gemini等 | Claude Codeのみ | Claude Code, Gemini, Cline等 |
| セットアップ | Docker Desktop |
/sandbox コマンド |
DevContainer |
どちらも優れたソリューションですが、次のようなケースではカバーしきれない部分があります。
-
.envはAIから隠したいが、アプリコンテナからは普通に読みたい - 複数のコンテナ(API、Web、DB)のログをAIに確認させたい
- Claude Code以外のAIツールでも同じ環境を使いたい
AI Sandbox というアプローチ
AI Sandboxは、Docker + DevContainerで「秘密の隠蔽」と「コンテナ間アクセス」を両立します。
仕組み
AIはDockerコンテナのSandbox内で動きます。秘匿ファイルはDockerのvolumeマウントで隠されるため、まるで存在しないかのようにアクセスできなくなります。それでも開発に支障はありません。DockMCPを通じて、他のコンテナのログ確認やテスト実行ができるからです。
秘匿の仕組み
docker-compose.yml でこう設定するだけです。
volumes:
# .envを/dev/nullにマウント → AIからは空に見える
- /dev/null:/workspace/your-api/.env:ro
tmpfs:
# secrets/ディレクトリを空にする
- /workspace/your-api/secrets:ro
結果:
- AI →
.envを読んでも空。secrets/も空のディレクトリ - アプリコンテナ → 通常通り
.envもシークレットも読める
サブプロジェクトに
.claude/settings.jsonがあれば起動時に自動マージされ、docker-compose.yml のマウントと二重にブロックされます。.aiexcludeや.geminiignoreの設定も、付属のスクリプトで docker-compose.yml に反映できます。
DockMCPで他コンテナにアクセス
DockMCPは、MCP(Model Context Protocol)サーバーとしてホストOS上で動きます。AIはこのサーバーを通じて、他のコンテナのログを読んだりテストを実行したりできます。
AI(AI Sandbox内)→ DockMCP(ホストOS)→ APIコンテナ / Webコンテナ / DBコンテナ
たとえば、Claude Codeに「APIのログを見せて」と頼むと:
- Claude CodeがDockMCPのMCPツールを呼び出す
- DockMCPがセキュリティポリシーを確認
- 許可されていればAPIコンテナのログを取得して返す

セキュリティポリシーで、アクセスできるコンテナや実行できるコマンドを制限できます。
# dkmcp.yaml
security:
mode: "moderate"
allowed_containers:
- "your-api-*"
- "your-web-*"
exec_whitelist:
"your-api":
- "npm test"
- "npm run lint"
ネットワーク制限について
AI Sandboxはネットワーク制限を含んでいません。必要な場合は、Anthropic公式の init-firewall.sh の導入をおすすめします。
iptables + ipset によるホワイトリスト方式で、許可されたドメイン(GitHub、npm、Anthropic API等)以外の外部通信をブロックします。AI Sandboxが秘匿ファイルの隠蔽を、公式スクリプトがネットワーク制限を担当する、という役割分担です。
試してみる
必要なもの
- Docker
- VS Code + Dev Containers拡張
Quick Start
# 1. テンプレートからリポジトリを作成(またはクローン)
git clone https://github.com/YujiSuzuki/ai-sandbox-dkmcp.git
cd ai-sandbox-dkmcp
# 2. VS Codeで開く
code .
# 3. DevContainerで開く(Cmd+Shift+P → "Dev Containers: Reopen in Container")
これだけで、秘匿ファイルが隠された環境が起動します。
秘匿を確認する
DevContainer内で試してみてください。
# AIから見た.env → 空
cat demo-apps/securenote-api/.env
# AIから見たsecrets/ → 空のディレクトリ
ls demo-apps/securenote-api/secrets/
DockMCPも使う場合
ホストOS側でDockMCPを起動すると、AIが他のコンテナにアクセスできるようになります。
# ホストOSで実行
cd dkmcp
make install
dkmcp serve --config configs/dkmcp.example.yaml
デモアプリも起動して、AIに話しかけてみましょう。
# ホストOSで実行
cd demo-apps
docker-compose -f docker-compose.demo.yml up -d --build
Claude Codeに聞いてみる:
- 「securenote-apiのログを見せて」
- 「securenote-apiでnpm testを実行して」
- 「秘匿ファイルがあるか確認してみて」
自分のプロジェクトで使うには
AI SandboxはGitHubテンプレートリポジトリとして公開しています。「Use this template」から自分のリポジトリを作成できます。
カスタマイズの流れ:
- デモアプリを削除 → 自分のプロジェクトを配置
-
秘匿設定を変更 →
docker-compose.ymlで自分の.envやシークレットを隠す - DockMCPを設定 → アクセスするコンテナと許可コマンドを定義
詳細は カスタマイズガイド を参照してください。
まとめ — 正直な位置づけ
AI Sandboxは公式ソリューションの代替ではなく、補完です。
向いているケース:
-
.envやシークレットをAIから確実に隠したい - 複数コンテナ構成で、AIにログ確認やテスト実行をさせたい
- Claude Code以外のAIツールでも同じ環境を使いたい
- DevContainerベースの開発フローに馴染みがある
向かないケース:
- ネットワーク分離だけで十分 → Claude Code Sandboxが手軽
- 完全なVM分離が必要 → Docker Sandboxが適切
- 単一コンテナで完結する開発 → そもそもサンドボックスが不要かも
秘密は隠す。でもAIには存分に活躍してもらう。この2つは両立できます。
フィードバックや⭐をいただけると嬉しいです!
質問や機能リクエストは GitHub Discussions でお気軽にどうぞ。
Discussion