開発claude-code-tools

Claude Code 安全な自律実行環境 構築ガイド

対象環境: Windows + PowerShell + Docker Desktop
認証方式: Claude Pro/Max サブスクリプション(OAuth — claude login
作成日: 2026-03-19
目的: --dangerously-skip-permissions を安全に使うための環境構築と運用手順


概要:3つのアプローチ

レベル方法安全性手軽さホストへの影響
Lv.1allowedTools 設定◎ 高い◎ 即使えるなし(許可した操作のみ)
Lv.2--worktree + --dangerously-skip-permissions○ Git レベル隔離○ 簡単bash コマンドはホスト全体に到達しうる
Lv.3devcontainer + --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 に書いたツールは確認なしで即実行される
  • denyallow より優先される(deny が勝つ)
  • ワイルドカード * が使える
  • denyrm -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.jsonfeaturespostCreateCommand は 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.jsondocker-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 から(推奨)

  1. VS Code でプロジェクトを開く
  2. コマンドパレット → Dev Containers: Reopen in Container
  3. コンテナ内のターミナルで:
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 キーのマウントは慎重に