Claude CodeをDevContainerで安全に動かす完全実装 — sandbox設計と認証情報の遮断
Claude CodeをDevContainer / Docker sandbox内で動かして、ホストの認証情報や本番接続から物理的に隔離する実装方法。--dangerously-skip-permissions を安全に使うための前提環境を整理します。
要点
Claude CodeをDevContainer / Docker sandbox内で動かすと、ホストマシンの認証情報や本番接続から物理的に隔離できます。--dangerously-skip-permissions などの強力なフラグを使う際の前提条件として、また企業導入で「Claude Codeが予期せぬ操作をしないことを保証したい」要件で重要な構成です。
本記事は次の3点を扱います。
- なぜsandboxが必要か(リスクの整理)
- DevContainerによる実装(VS Code / Cursorで開けるテンプレート)
- Docker sandboxによる独立実装(CI / 自動化向け)
なぜsandboxが必要か
Claude Codeは Bash ツールでホストの任意コマンドを実行できます。これが強力さの源泉である一方、次のリスクを内包します。
- 認証情報の漏洩:
~/.aws/credentials~/.ssh/~/.gnupg/等が見える環境で動かすと、エージェントが意図せずこれらを参照する可能性 - 本番接続の誤操作:
kubectl/psql等のコマンドが本番に向いている環境でDROP TABLEなどが入ると致命的 - ホストのファイル削除:
rm -rf系の誤実行 - gitのdestructive操作: force push / branch -D / reset --hard
Claude Codeが期待通りに動かない10シナリオで扱った落とし穴のうち、シナリオ4(危険コマンドの誤実行)の最終防御がこのsandbox設計です。Hookによるブラックリストはバイパスされうるため、コンテナ境界で物理的に隔離するのが最も堅い解です。
DevContainer実装(VS Code / Cursor向け)
.devcontainer/devcontainer.json を置くと、VS Code / Cursorが起動時にコンテナ内で開発環境を立ち上げます。Claude Code自体もコンテナ内で動かせば、エージェントが触れる範囲はコンテナ内に限定されます。
最小構成例
{
"name": "Claude Code Sandbox",
"image": "mcr.microsoft.com/devcontainers/typescript-node:20",
"features": {
"ghcr.io/devcontainers/features/git:1": {}
},
"postCreateCommand": "npm install -g @anthropic-ai/claude-code",
"customizations": {
"vscode": {
"extensions": [
"anthropic.claude-code"
]
}
},
"remoteEnv": {
"ANTHROPIC_API_KEY": "${localEnv:ANTHROPIC_API_KEY}"
},
"containerEnv": {
"NODE_ENV": "development"
},
"mounts": [
"source=${localWorkspaceFolder},target=/workspace,type=bind"
]
}設計のポイント
mountsは最小限に:~/.aws~/.ssh等をbind mountしない。Claude Codeに見せないことが最大の防御- API keyは
remoteEnvで渡す: ホスト側のenvを取り込む形にすれば、コンテナimageに焼き込まなくて済む - postCreateCommandで
claude-codeをinstall: imageに焼かないことで、バージョン更新が容易 extensionsでClaude Code公式拡張を自動インストール
~/.aws を意図的に渡す場合
クラウド本番に接続するスクリプトをClaude Codeに走らせたい場合、読み取り専用の制限プロファイルだけ渡します。
"mounts": [
"source=${localEnv:HOME}/.aws,target=/root/.aws,type=bind,readonly"
]加えて ~/.aws/credentials 内で本番profileを渡さない(別ディレクトリに退避するか、コンテナ用の最小権限profileのみ)構成にします。
Docker sandbox実装(CI / 自動化向け)
CIでClaude Codeを走らせる場合や、複数のセッションを完全に独立させたい場合は、専用Dockerfile + 起動スクリプトで立てます。
Dockerfile例
FROM node:20-bookworm-slim
# 必要最低限のツールだけインストール
RUN apt-get update && apt-get install -y --no-install-recommends \
git \
jq \
curl \
ca-certificates \
&& rm -rf /var/lib/apt/lists/*
# Claude Code をグローバルインストール
RUN npm install -g @anthropic-ai/claude-code
# 非 root ユーザーで動かす
RUN useradd -m -s /bin/bash claude && \
mkdir -p /workspace && \
chown claude:claude /workspace
USER claude
WORKDIR /workspace
# entrypoint で claude-code を起動
ENTRYPOINT ["claude-code"]起動スクリプト例
#!/bin/bash
# scripts/run-claude-sandbox.sh
set -euo pipefail
REPO_PATH="$(git rev-parse --show-toplevel)"
docker run --rm -it \
--name claude-sandbox \
--network bridge \
--cap-drop=ALL \
--cap-add=NET_BIND_SERVICE \
--read-only \
--tmpfs /tmp \
--tmpfs /home/claude/.cache \
-v "$REPO_PATH:/workspace:rw" \
-e "ANTHROPIC_API_KEY=$ANTHROPIC_API_KEY" \
claude-sandbox:latest \
--dangerously-skip-permissionsセキュリティオプションの意図
--read-only: コンテナのroot filesystemを読み取り専用に。Claude Codeが任意のファイルを書き換える経路を限定--tmpfs /tmp--tmpfs /home/claude/.cache: 一時書き込み領域だけmemory上に。再起動で消える--cap-drop=ALL: Linux capabilitiesを全破棄。CAP_SYS_ADMIN等の特権を渡さない-v $REPO_PATH:/workspace:rw: 作業対象ディレクトリのみ書き込み可。それ以外のホストファイルは見えない--network bridge: ネットワーク隔離。本番DBが同じネットワーク上にあっても見えない構成にする(必要に応じて--network noneで完全遮断)
比較: 3つのアプローチ
| アプローチ | 隔離度 | 実装コスト | 用途 |
|---|---|---|---|
| ホスト直走り(裸) | × ホスト全権 | 0 | 学習 / 個人開発初期 |
| DevContainer | ◎ ホストから隔離 | 低 | 日常開発 / 個人〜チーム |
| Docker sandbox(本記事) | ◎◎ capability削減 | 中 | CI / 本番接続スクリプト |
認証情報の扱い(三段階の隔離)
DevContainer / sandboxを組んでも、API keyを渡し方を間違えると意味がありません。
段階1: Anthropic API keyの渡し方
| 渡し方 | 安全度 | 備考 |
|---|---|---|
| Dockerfileに焼く | × | image流出で漏洩 |
docker run -e KEY=... | △ | プロセスリストやlogに残る |
docker run --env-file .env | ○ | .envをgit ignoreに追加 |
| シークレット管理ツール(Vault / 1Password CLI) | ◎ | 起動時に取得 → コンテナに渡す |
段階2: その他の認証情報
~/.aws ~/.ssh ~/.gnupg 等はデフォルトでマウントしない。必要に応じて readonly + 最小権限profileのみ渡す。
段階3: ネットワーク
本番DB / 内部APIへの接続はコンテナのnetwork policyで遮断します。--network none で完全遮断、または専用networkに隔離して本番hostに到達できない構成にします。
チーム導入時の運用ガイド
複数人が同じDevContainer設定を使う場合の追加考慮点:
.devcontainer/をgit管理に: 全員が同じ設定で動かす- 開発者ごとのsecretsは個別に:
.env.local等をgit ignoreに追加、各自が用意 - CIでも同じimageを使う: ローカル / CIの挙動差を最小化
- 破壊的操作のレビュー基準をCLAUDE.mdに: sandboxがあっても運用ルールは別途必要
まとめ
DevContainer / Docker sandboxは、Claude Codeの能力を失わずに安全性を底上げできる強力な手段です。--dangerously-skip-permissions を安全に使う前提環境としても、企業導入の必須条件としても、設計を初期に詰めておく価値があります。本記事のテンプレートを叩き台に、自分のプロジェクトの認証情報構成や本番接続要件に合わせて調整してください。
関連記事としてHooks実例カタログのレシピ3(危険Bashコマンドのブロック)と組み合わせると、コンテナ境界 + Hookブラックリストの二重防御になります。
関連する記事
Claude Code をもっと見る →Claude Codeセキュリティ・権限ガイド — 個人 / チーム / 企業の3レイヤー別に実装推奨値を提示
Managed Agentsの設計思想 — セッション/ハーネス/サンドボックスを分離した長時間エージェントのつくり方
Claude Code v2.1.113 — CLIのネイティブバイナリ化と、サンドボックス遮断の細粒度化
Claude Codeのサンドボックス設計 — プロンプトインジェクションを前提に承認疲れを84% 減らす二層分離
Claude Code導入を検討するCTO / Tech Leadのための評価軸6つ
Claude Code Routines完全実践ガイド — クラウド側で動く「予定されたClaude」
Claude Code Worktree完全活用 — エージェント並列開発のための隔離戦略
Claude Codeのサブエージェント完全活用 — Taskツールで作る並列開発パターン