🔐

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のログを見せて」と頼むと:

  1. Claude CodeがDockMCPのMCPツールを呼び出す
  2. DockMCPがセキュリティポリシーを確認
  3. 許可されていれば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が秘匿ファイルの隠蔽を、公式スクリプトがネットワーク制限を担当する、という役割分担です。

試してみる

必要なもの

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」から自分のリポジトリを作成できます。

カスタマイズの流れ:

  1. デモアプリを削除 → 自分のプロジェクトを配置
  2. 秘匿設定を変更docker-compose.yml で自分の .env やシークレットを隠す
  3. DockMCPを設定 → アクセスするコンテナと許可コマンドを定義

詳細は カスタマイズガイド を参照してください。

まとめ — 正直な位置づけ

AI Sandboxは公式ソリューションの代替ではなく、補完です。

向いているケース:

  • .env やシークレットをAIから確実に隠したい
  • 複数コンテナ構成で、AIにログ確認やテスト実行をさせたい
  • Claude Code以外のAIツールでも同じ環境を使いたい
  • DevContainerベースの開発フローに馴染みがある

向かないケース:

  • ネットワーク分離だけで十分 → Claude Code Sandboxが手軽
  • 完全なVM分離が必要 → Docker Sandboxが適切
  • 単一コンテナで完結する開発 → そもそもサンドボックスが不要かも

秘密は隠す。でもAIには存分に活躍してもらう。この2つは両立できます。

https://github.com/YujiSuzuki/ai-sandbox-dkmcp

フィードバックや⭐をいただけると嬉しいです!

質問や機能リクエストは GitHub Discussions でお気軽にどうぞ。


Discussion