Claude Code 安全な自律実行環境 構築ガイド
対象環境: Windows + PowerShell + Docker Desktop
認証方式: Claude Pro/Max サブスクリプション(OAuth —claude login)
作成日: 2026-03-19
目的:--dangerously-skip-permissionsを安全に使うための環境構築と運用手順
概要:3つのアプローチ
| レベル | 方法 | 安全性 | 手軽さ | ホストへの影響 |
|---|---|---|---|---|
| Lv.1 | allowedTools 設定 | ◎ 高い | ◎ 即使える | なし(許可した操作のみ) |
| Lv.2 | --worktree + --dangerously-skip-permissions | ○ Git レベル隔離 | ○ 簡単 | bash コマンドはホスト全体に到達しうる |
| Lv.3 | devcontainer + --dangerously-skip-permissions | ◎ OS レベル隔離 | △ 初回構築が必要 | コンテナ内に完全封じ込め |
推奨: 普段は Lv.1、自律的に回したいときは Lv.2、本当に何でもやらせたいときは Lv.3。
Lv.1: allowedTools での代替設定(パーミッション不要にはしない)
--dangerously-skip-permissions を使わずに、よく使うツールだけ自動承認する方法。
最も安全で、日常的にはこれで十分なケースが多い。
グローバル設定(全プロジェクト共通)
~/.claude.json に記述する(Windows の場合 C:\Users\<ユーザー名>\.claude.json):
{
"permissions": {
"allow": [
"Read",
"Edit(src/**)",
"Edit(tests/**)",
"Edit(docs/**)",
"Bash(npm run *)",
"Bash(npm test *)",
"Bash(npm install *)",
"Bash(git add *)",
"Bash(git commit *)",
"Bash(git diff *)",
"Bash(git log *)",
"Bash(git status)",
"Bash(ls *)",
"Bash(cat *)",
"Bash(mkdir *)",
"Bash(grep *)",
"Bash(find *)"
],
"deny": [
"Bash(rm -rf *)",
"Bash(rm -r /*)",
"Bash(git push *)",
"Bash(git push)",
"Bash(curl *)",
"Bash(wget *)",
"Edit(.env*)",
"Edit(*.key)",
"Edit(*.pem)"
]
}
}
プロジェクト単位の設定
プロジェクトルートに .claude/settings.json を作成:
{
"permissions": {
"allow": [
"Edit(src/**)",
"Edit(tests/**)",
"Bash(python *)",
"Bash(pip install *)"
],
"deny": [
"Bash(rm -rf *)",
"Edit(.env*)"
]
}
}
allowedTools のポイント
allowに書いたツールは確認なしで即実行されるdenyはallowより優先される(deny が勝つ)- ワイルドカード
*が使える denyにrm -rfを入れておけば致命的な事故は防げる/permissionsコマンドで現在の設定を確認できる
Lv.2: worktree + dangerously-skip-permissions
Git worktree で「壊れてもいい砂場」を作り、その中で自律実行する。
基本コマンド
# worktree を作って、その中で自律実行
claude --worktree my-experiment --dangerously-skip-permissions "タスクの指示"
# 短縮形
claude -w my-experiment --dangerously-skip-permissions "タスクの指示"
# インタラクティブモードで起動(指示は後から入力)
claude -w my-experiment --dangerously-skip-permissions
# 予算上限も付ける
claude -w my-experiment --dangerously-skip-permissions --max-budget-usd 5.00
# セッション名を付けて後で再開可能にする
claude -w my-experiment --dangerously-skip-permissions --resume session-name
複数セッション並列実行
PowerShell のタブやウィンドウを分けて:
# ターミナル 1
claude -w feature-auth --dangerously-skip-permissions
# ターミナル 2
claude -w bugfix-api --dangerously-skip-permissions
# ターミナル 3(メインブランチは手動作業用に温存)
claude
worktree の構造
my-project/ ← メインワーキングツリー(main ブランチ・手付かず)
├── .git/ ← 共有される Git データベース
├── .claude/
│ └── worktrees/
│ ├── my-experiment/ ← worktree 1(独自ブランチ)
│ └── feature-auth/ ← worktree 2(独自ブランチ)
└── src/
終了時の挙動
| 状態 | 挙動 |
|---|---|
| 変更なし | worktree とブランチが自動削除される |
| 変更あり | keep(残す)か remove(削除)か聞かれる |
手動クリーンアップ
# worktree の一覧を確認
git worktree list
# 特定の worktree を削除
git worktree remove .claude/worktrees/my-experiment
# 強制削除(未コミットの変更があっても削除)
git worktree remove --force .claude/worktrees/my-experiment
# 古い worktree のメタデータを掃除
git worktree prune
⚠️ Lv.2 の注意点(重要)
- worktree は Git レベルの隔離であり、OS レベルのサンドボックスではない
--dangerously-skip-permissionsはファイルシステム全体へのアクセス制限を解除する- Claude が
rm -rf /のようなコマンドを実行しようとしても止まらない - メインブランチの Git 履歴は安全だが、ホストマシンのファイルが壊れるリスクはある
- 対策:こまめに
git commitする、重要ファイルはバックアップしておく
Lv.3: devcontainer で完全隔離(推奨)
Docker コンテナ内に Claude Code の実行環境を閉じ込める。 コンテナが壊れてもホストには一切影響しない。
前提条件
- Docker Desktop インストール済み(WSL2 バックエンド有効)
- VS Code + Dev Containers 拡張機能(推奨だが必須ではない)
ステップ 1: プロジェクトに devcontainer 設定を作成
プロジェクトルートに .devcontainer/ ディレクトリを作成:
mkdir .devcontainer
ステップ 2: devcontainer.json を作成
.devcontainer/devcontainer.json:
{
"name": "Claude Code Sandbox",
"build": {
"dockerfile": "Dockerfile"
},
"features": {
"ghcr.io/devcontainers/features/git:1": {},
"ghcr.io/devcontainers/features/node:1": {
"version": "lts"
}
},
"postCreateCommand": "npm install -g @anthropic-ai/claude-code",
"mounts": [
"source=${localWorkspaceFolder},target=/workspace,type=bind",
"source=${localEnv:USERPROFILE}/.claude,target=/home/vscode/.claude,type=bind"
],
"workspaceFolder": "/workspace",
"runArgs": [
"--network=host"
]
}
ステップ 3: Dockerfile を作成
.devcontainer/Dockerfile:
FROM mcr.microsoft.com/devcontainers/base:ubuntu
# 基本ツール
RUN apt-get update && apt-get install -y \
git \
curl \
jq \
&& rm -rf /var/lib/apt/lists/*
# Node.js LTS インストール(features は VS Code 経由のみ有効なため直接インストール)
RUN curl -fsSL https://deb.nodesource.com/setup_22.x | bash - \
&& apt-get install -y nodejs \
&& rm -rf /var/lib/apt/lists/*
# Claude Code をグローバルインストール
RUN npm install -g @anthropic-ai/claude-code
# 作業ユーザー設定
USER vscode
WORKDIR /workspace
⚠️ 注意:
devcontainer.jsonのfeaturesやpostCreateCommandは VS Code の Dev Containers 拡張経由でのみ適用される。docker buildで直接ビルドする場合は、Node.js と Claude Code を Dockerfile 内でインストールする必要がある。
ステップ 4: ネットワーク制限付き(より安全)
通信先を制限したい場合、docker-compose.yml を追加:
.devcontainer/docker-compose.yml:
version: "3.8"
services:
claude-sandbox:
build:
context: .
dockerfile: Dockerfile
volumes:
- ..:/workspace:cached
- ${USERPROFILE}/.claude:/home/vscode/.claude
# ネットワーク制限(必要な通信先のみ許可)
dns:
- 8.8.8.8
cap_drop:
- ALL
security_opt:
- no-new-privileges:true
devcontainer.json を docker-compose 対応に変更:
{
"name": "Claude Code Sandbox",
"dockerComposeFile": "docker-compose.yml",
"service": "claude-sandbox",
"workspaceFolder": "/workspace",
"postCreateCommand": "npm install -g @anthropic-ai/claude-code"
}
ステップ 5: 起動方法
方法 A: VS Code から(推奨)
- VS Code でプロジェクトを開く
- コマンドパレット →
Dev Containers: Reopen in Container - コンテナ内のターミナルで:
claude --dangerously-skip-permissions "タスクの指示"
# worktree との併用も可能
claude -w my-experiment --dangerously-skip-permissions "タスクの指示"
方法 B: Docker CLI から直接
# イメージをビルド
docker build -t claude-sandbox .devcontainer/
# コンテナを起動してログイン
docker run -it --rm `
-v "${PWD}:/workspace" `
-v "$env:USERPROFILE/.claude:/home/vscode/.claude" `
-w /workspace `
claude-sandbox bash
# コンテナ内で Claude Code を実行
claude --dangerously-skip-permissions "タスクの指示"
方法 C: 使い捨てコンテナでワンショット実行
docker run --rm `
-v "${PWD}:/workspace" `
-v "$env:USERPROFILE/.claude:/home/vscode/.claude" `
-w /workspace `
claude-sandbox `
claude -p --dangerously-skip-permissions "全テストを修正して" --output-format json
ステップ 6: 認証の設定(OAuth — claude.ai サブスクリプション)
Claude Pro/Max サブスクリプションの場合、API キーではなく OAuth 認証を使う。
認証情報は ~/.claude/ ディレクトリ(Windows: %USERPROFILE%\.claude\)に保存される。
初回セットアップ(ホスト側で1回だけ):
# ホスト側でログイン(ブラウザが開いて認証する)
claude login
コンテナでの認証の仕組み:
上記の devcontainer 設定では、ホストの ~/.claude/ をコンテナ内にマウントしている。
これにより、ホストで claude login した認証情報がコンテナ内でもそのまま使える。
ホスト: %USERPROFILE%\.claude\ → コンテナ: /home/vscode/.claude/
(認証トークン等) (マウントで共有)
認証が切れた場合:
# ホスト側で再ログイン
claude login
# コンテナを再起動すれば反映される(マウントなので即時反映の場合もあり)
注意:
~/.claude/にはセッショントークンが含まれるため、 コンテナ内で--dangerously-skip-permissionsを使う場合でも、 この認証情報はホストと共有されている点に留意すること。
よく使うコマンド早見表
基本操作
# 通常起動
claude
# YOLO モード(パーミッション全スキップ)
claude --dangerously-skip-permissions
# worktree 隔離 + YOLO
claude -w sandbox --dangerously-skip-permissions
# ワンショット実行(非インタラクティブ)
claude -p --dangerously-skip-permissions "指示内容"
# 予算制限付き
claude --dangerously-skip-permissions --max-budget-usd 3.00
# セッション再開
claude --dangerously-skip-permissions --resume my-session
worktree 管理
# worktree 一覧
git worktree list
# 手動で worktree 作成(Claude Code の -w を使わない場合)
git worktree add ../my-sandbox -b experiment/my-sandbox
# worktree 削除
git worktree remove .claude/worktrees/sandbox-name
# 古い worktree メタデータのクリーンアップ
git worktree prune
コンテナ操作
# devcontainer をビルド
docker build -t claude-sandbox .devcontainer/
# コンテナ起動(インタラクティブ)
docker run -it --rm -v "${PWD}:/workspace" -v "$env:USERPROFILE/.claude:/home/vscode/.claude" -w /workspace claude-sandbox bash
# 実行中コンテナの確認
docker ps
# コンテナの停止
docker stop <container-id>
判断フローチャート
タスクの種類は?
│
├─ 通常の開発作業
│ → Lv.1: allowedTools 設定で十分
│
├─ 長時間の自律タスク(リファクタ・テスト修正など)
│ ├─ ホストのファイルを壊されても困らない?
│ │ ├─ Yes → Lv.2: worktree + --dangerously-skip-permissions
│ │ └─ No → Lv.3: devcontainer + --dangerously-skip-permissions
│ │
│ └─ 外部ネットワークアクセスも制限したい?
│ └─ Yes → Lv.3 + docker-compose でネットワーク制限
│
└─ CI/CD パイプラインでの自動実行
→ Lv.3: コンテナ + -p + --dangerously-skip-permissions + --output-format json
トラブルシューティング
Claude Code がコンテナ内で見つからない
# パスを確認
which claude
# なければ再インストール
npm install -g @anthropic-ai/claude-code
認証が通らない(コンテナ内)
# コンテナ内で認証ファイルの存在を確認
ls -la ~/.claude/
# ファイルがなければマウントが失敗している
# → docker run の -v オプションのパスを確認
# 認証が期限切れの場合はホスト側で再ログイン
# (ホストの PowerShell で実行)
claude login
worktree が削除できない
# ロックファイルがある場合
Remove-Item .git/worktrees/<name>/locked -ErrorAction SilentlyContinue
git worktree remove .claude/worktrees/<name> --force
Git Bash から docker run すると -w /workspace が変換される
Git Bash (MSYS2) はパスを自動的に Windows パスに変換する。-w /workspace が -w C:/Program Files/Git/workspace に化ける。
# ❌ NG — Git Bash がパスを変換してしまう
docker run --rm -w /workspace claude-sandbox bash
# ✅ OK — MSYS_NO_PATHCONV=1 で変換を抑制
MSYS_NO_PATHCONV=1 docker run --rm -w /workspace claude-sandbox bash
# ✅ OK — PowerShell から実行すればそもそも問題なし
コンテナ内で git push できない
# SSH キーをマウントする(必要な場合のみ)
# docker run に追加: -v "$HOME/.ssh:/home/vscode/.ssh:ro"
# ※ YOLO モードでは SSH キーのマウントは慎重に