## 安全ベストプラクティス

Claude Code は強力な AI プログラミングアシスタントですが、「強力」だからこそ、高いシステム権限が必要です — ファイルの読み書き、コマンドの実行、ネットワークへのアクセス。これは、新人に管理者アカウントを付与するようなものです：非常に高い能力を持っていますが、適切なセキュリティ境界を設定する必要があります。

このドキュメントでは、個人利用からチームコラボレーション、開発環境から CI/CD 自動化まで、完全なセキュリティ防御を構築する方法を説明します。AI プログラミングの効率性を享受しながら、セキュリティの問題を回避できるようにします。

## Claude Code のセキュリティモデルを理解する

### Claude Code はローカルターミナルで動作する

これは非常に重要であり、すべてのセキュリティ対策を理解するための基盤です：**Claude Code はクラウド上のサンドボックスで動作するのではなく、あなたのローカルターミナルで直接動作します**。

これは以下を意味します：
- マシン上の任意のファイルを読み取れます（ユーザーの権限がある限り）
- 任意の Shell コマンドを実行できます
- 環境変数にアクセスできます（そこにある可能性のあるキーを含む）
- ネットワークでデータを送受信できます

もちろん、Claude Code にはこれらの能力を制限する組み込みのセキュリティメカニズムがあります。しかし、この基本事実を常に念頭に置いてください：その権限の上限はユーザーの権限です。

### 権限承認メカニズム

Claude Code のコアセキュリティ哲学は**ヒューマン・イン・ザ・ループ**（Human in the Loop）です。デフォルトでは、以下の操作を実行する際に確認を求めます：

- ツールの初回使用時
- Shell コマンドの実行時（特に事前に承認していないもの）
- 新規ファイルの書き込みまたは既存ファイルの変更時
- ネットワークリソースへのアクセス時

表示される権限リクエストは概ね次のようになります：

```
Claude wants to run: rm -rf node_modules && npm install

Allow?
  (y) Yes, allow once
  (a) Always allow "npm install" commands
  (n) No, deny
```

**重要な原則**：ある操作が安全かどうか不明な場合は"No"を選択してください。常に、内容を理解してから承認することができます。

### 三層の防御

Claude Code のセキュリティシステムは三層の防御で構成されています：

```
第一層：パーミッションモード（グローバルポリシー）
  ↓
第二層：Allow/Deny ルール（きめ細かい制御）
  ↓
第三層：Hooks（カスタム遮断ロジック）
```

以下で詳しく説明します。

## 権限設定

### 四種類のパーミッションモードの比較

Claude Code は四種類のパーミッションモードを提供しており、セキュリティレベルは高い方から低い方へ並んでいます：

| モード | ファイル編集 | コマンド実行 | 適用シナリオ | セキュリティレベル |
|------|---------|---------|---------|---------|
| `plan` | 禁止 | 禁止（読み取り専用） | コードレビュー、アーキテクチャ分析 | 最高 |
| `default` | 初回確認 | 毎回確認 | 日常開発 | 高 |
| `acceptEdits` | 自動承認 | 毎回確認 | ファイルを頻繁に変更するタスク | 中 |
| `bypassPermissions` | 自動承認 | 自動承認 | CI/CD、信頼できる環境 | 低 |

**各モードの詳細：**

**plan モード**：Claude はコードの検索と閲覧のみが可能で、何も変更できません。Claude にコードを分析させたいが、何も触ってほしくないシナリオに適しています。`Shift+Tab`でこのモードに切り替えられます。

**default モード**：推奨される日常モードです。Claude があるツールを初めて使用する際に確認を求め、承認後は同種の操作について繰り返し確認しません。Shell コマンドは毎回確認を求めます。

**acceptEdits モード**：Claude のファイル編集能力を信頼しますが、コマンド実行には警戒を維持します。Claude にコードファイルを大量に修正させたいが、勝手にコマンドを実行されたくないシナリオに適しています。

**bypassPermissions モード**：すべての権限チェックをスキップします。現在のタスクを完全に信頼している場合、または隔離された CI/CD 環境でのみ使用してください。

### /permissions で確認と変更

Claude Code でいつでも `/permissions` を入力すると、現在の権限状態を確認できます：

```
/permissions
```

出力には現在のモード、承認されたツール、Allow/Deny ルールなどが表示されます。

### settings.json での権限設定

権限設定は `settings.json` に保存され、2 つのレベルがあります：

**ユーザー級**（全プロジェクトに適用）：`~/.claude/settings.json`
**プロジェクト級**（現在のプロジェクトのみに適用）：`.claude/settings.json`

```json
{
  "permissions": {
    "defaultMode": "default",
    "allow": [
      "Bash(npm run lint)",
      "Bash(npm run test:*)",
      "Bash(git status)",
      "Bash(git add:*)",
      "Bash(git diff:*)",
      "Bash(git log:*)",
      "Bash(node:*)",
      "Bash(python:*)"
    ],
    "deny": [
      "Bash(rm -rf:*)",
      "Bash(git push --force:*)",
      "Bash(curl:*)",
      "Bash(wget:*)",
      "Read(.env)",
      "Read(.env.*)",
      "Read(secrets/**)"
    ]
  }
}
```

**ルール構文の説明：**

| 構文 | 意味 | 例 |
|------|------|------|
| `Bash(cmd)` | コマンドの完全一致 | `Bash(npm run lint)` |
| `Bash(cmd:*)` | コマンドプレフィクスの一致 | `Bash(git log:*)` は `git log` で始まるすべてのコマンドに一致 |
| `Read(path)` | ファイル読み取りの一致 | `Read(.env)` |
| `Write(path)` | ファイル書き込みの一致 | `Write(src/**)` |
| `**` | 複数レベルのディレクトリワイルドカード | `Read(secrets/**)` は secrets 以下の全レベルのファイルに一致 |
| `*` | 単層ワイルドカード | `Read(.env.*)` は .env.local、.env.production などに一致 |

**重要**：Deny ルールの優先度は Allow ルールより高いです。たとえ Allow である操作を承認しても、同時に Deny ルールに一致する場合は依然として拒否されます。

## 機密ファイルの保護

### .claudeignore で機密ディレクトリを除外

`.claudeignore` ファイルの構文は `.gitignore` と同じで、記載されたファイルとディレクトリは Claude Code に対して完全に不可視になります：

プロジェクトルートディレクトリに `.claudeignore` を作成します：

```gitignore
# 環境変数とキー
.env
.env.*
secrets/
*.pem
*.key
*credentials*

# 機密設定
config/production.yml
config/secrets.yml

# 個人データ
data/users/
*.sqlite
*.db

# その他の機密ディレクトリ
.aws/
.ssh/
.gnupg/
```

**注意**：`.claudeignore` を使用すると、Claude はこれらのファイルを完全に認知できなくなります — これらのファイルが存在することすらわかりません。これは Deny ルールよりもさらに徹底的です。

### Hooks を使用して機密ファイルへの変更を遮断

特定のファイルを Claude に読み取らせたいが変更はさせたくない場合、Hooks を使用してきめ細かい制御を実現できます：

```json
{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Write|Edit",
        "hooks": [
          {
            "type": "command",
            "command": "python3 -c \"\nimport sys, json, os\ntool_input = json.loads(os.environ.get('TOOL_INPUT', '{}'))\npath = tool_input.get('file_path', '') or tool_input.get('path', '')\nprotected = ['.env', 'credentials', 'secret', '.pem', '.key']\nfor p in protected:\n    if p in path.lower():\n        print(f'BLOCKED: {p} を含むファイルの変更は許可されていません', file=sys.stderr)\n        sys.exit(2)\n\""
          }
        ]
      }
    ]
  }
}
```

この Hook は、Claude がファイルの書き込みまたは編集を試みる前にファイルパスをチェックし、パスに機密キーワードが含まれている場合は操作を遮断します（exit code 2 は遮断を示します）。

### 設定テンプレートを守る

チームプロジェクトの場合、リポジトリに保存する標準のセキュリティ設定ファイルを作成することをお勧めします：

```json
// .claude/settings.json（Git にコミット）
{
  "permissions": {
    "deny": [
      "Read(.env)",
      "Read(.env.*)",
      "Read(secrets/**)",
      "Read(**/*.pem)",
      "Read(**/*.key)",
      "Write(.git/**)",
      "Bash(rm -rf:*)",
      "Bash(git push --force:*)",
      "Bash(git reset --hard:*)",
      "Bash(chmod 777:*)",
      "Bash(curl|wget:*)"
    ]
  },
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [
          {
            "type": "command",
            "command": "echo \"$TOOL_INPUT\" | python3 -c \"import sys,json; cmd=json.load(sys.stdin).get('command',''); blocked=['DROP TABLE','DELETE FROM','TRUNCATE','password','token','secret']; [sys.exit(2) for b in blocked if b.lower() in cmd.lower()]\""
          }
        ]
      }
    ]
  }
}
```

## コマンド実行のセキュリティ

### Bash ツールの動作を理解する

Claude Code は Bash ツールを通じて Shell コマンドを実行します。デフォルトでは、事前承認されたコマンドを除き、実行のたびに確認を求められます。

注意すべき動作：
- コマンドは現在の Shell 環境で実行されます
- 環境変数はコマンドから参照可能です
- コマンドはファイルシステムを変更できます
- コマンドはソフトウェアをインストールできます
- コマンドはネットワークにアクセスできます

### 自動承認されるコマンド

`settings.json` の `allow` リストにあるコマンドパターンを追加すると、一致するコマンドは自動的に実行され、確認を求めなくなります。

推奨の自動承認安全コマンド：

```json
{
  "permissions": {
    "allow": [
      "Bash(git status)",
      "Bash(git diff:*)",
      "Bash(git log:*)",
      "Bash(git branch:*)",
      "Bash(ls:*)",
      "Bash(cat:*)",
      "Bash(head:*)",
      "Bash(tail:*)",
      "Bash(wc:*)",
      "Bash(find:*)",
      "Bash(grep:*)",
      "Bash(npm run lint:*)",
      "Bash(npm run test:*)",
      "Bash(python -m pytest:*)"
    ]
  }
}
```

### 危険なコマンドの遮断

以下のコマンドは常に Deny リストに入れ、自動実行を許可しないでください：

```json
{
  "permissions": {
    "deny": [
      "Bash(rm -rf:*)",
      "Bash(rm -r /:*)",
      "Bash(git push --force:*)",
      "Bash(git push -f:*)",
      "Bash(git reset --hard:*)",
      "Bash(git checkout -- .:*)",
      "Bash(git clean -f:*)",
      "Bash(chmod 777:*)",
      "Bash(chown:*)",
      "Bash(dd:*)",
      "Bash(mkfs:*)",
      "Bash(shutdown:*)",
      "Bash(reboot:*)"
    ]
  }
}
```

### Hooks でのカスタムコマンド遮断

より複雑な遮断ロジックには、Hooks を使用します：

**例 1：すべてのネットワークリクエストコマンドを遮断**

```json
{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [
          {
            "type": "command",
            "command": "echo \"$TOOL_INPUT\" | python3 -c \"\nimport sys, json\ncmd = json.load(sys.stdin).get('command', '')\nnet_cmds = ['curl', 'wget', 'nc ', 'netcat', 'ssh ', 'scp ', 'rsync']\nfor nc in net_cmds:\n    if nc in cmd:\n        print(f'BLOCKED: ネットワークコマンド ({nc}) の実行は許可されていません', file=sys.stderr)\n        sys.exit(2)\n\""
          }
        ]
      }
    ]
  }
}
```

**例 2：すべてのコマンドを監査ログに記録**

```json
{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [
          {
            "type": "command",
            "command": "echo \"$(date '+%Y-%m-%d %H:%M:%S') [Bash] $TOOL_INPUT\" >> ~/.claude/audit.log"
          }
        ]
      }
    ],
    "PostToolUse": [
      {
        "matcher": "Write|Edit",
        "hooks": [
          {
            "type": "command",
            "command": "echo \"$(date '+%Y-%m-%d %H:%M:%S') [FileChange] $TOOL_INPUT\" >> ~/.claude/audit.log"
          }
        ]
      }
    ]
  }
}
```

これで完全な操作監査ログが取得でき、いつでも Claude Code が何をしたかを確認できます。

## API キーのセキュリティ

### CLAUDE.md に API キーをハードコードしない

これが最も一般的なセキュリティエラーです。`CLAUDE.md` ファイルは通常 Git リポジトリにコミットされ、Claude Code は起動のたびにこれを読み取ります。もし API キーが含まれている場合：

1. キーは Git 履歴にコミットされます（後から削除しても）
2. キーは Claude Code から参照可能で、ログや分析結果に表示される可能性があります
3. チームの他のメンバーがこのキーを確認できます

**誤った方法：**

```markdown
<!-- CLAUDE.md -->
## API 設定
データベース接続：postgresql://admin:P@ssw0rd@localhost:5432/mydb
OpenAI キー：sk-xxxxxxxxxxxxxxxxxxxx
```

**正しい方法：**

```markdown
<!-- CLAUDE.md -->
## API 設定
- データベース接続と API キーは .env ファイルで管理
- .env ファイルは Git にコミットしない（.gitignore に含まれる）
- 新規開発者は .env.example をコピーして自分の認証情報を入力
```

### 環境変数でキーを管理

推奨のキー管理方法：

```bash
# .env（Git にコミットしない）
DATABASE_URL=postgresql://admin:P@ssw0rd@localhost:5432/mydb
OPENAI_API_KEY=sk-xxxxxxxxxxxxxxxxxxxx
REDIS_URL=redis://localhost:6379

# .env.example（Git にコミット、実際の値なし）
DATABASE_URL=postgresql://user:password@localhost:5432/dbname
OPENAI_API_KEY=sk-your-key-here
REDIS_URL=redis://localhost:6379
```

`.env` が `.gitignore` と `.claudeignore` にあることを確認します：

```gitignore
# .gitignore
.env
.env.local
.env.production

# .claudeignore（.env を Claude に読み取らせたくない場合）
.env
.env.*
```

### API キーが漏れた場合の対処手順

API キーが漏れた疑いがある場合（誤って Git にコミットしてしまったなど）、直ちに以下の手順を実行してください：

```
1. 即座にキーをローテーション
   - 該当サービスのコンソールで新しい API キーを生成
   - 当該キーを使用するすべての環境変数を更新

2. Git 履歴から削除
   git filter-branch --force --index-filter \
     "git rm --cached --ignore-unmatch .env" \
     --prune-empty --tag-name-filter cat -- --all

   またはより安全な BFG Repo-Cleaner を使用：
   bfg --delete-files .env
   git reflog expire --expire=now --all
   git gc --prune=now --aggressive

3. 清理後の履歴を強制プッシュ
   git push --force --all

4. 異常使用を確認
   - API 使用ログを確認し、異常な呼び出しがないかをチェック
   - 請求記録を確認し、異常な請求がないかをチェック

5. チームに通知
   - すべての開発者にリポジトリを再クローンするよう告知
   - すべてのデプロイ環境のキーを更新
```

## チームセキュリティ規範

### 共有 settings.json テンプレート

チーム用の統一セキュリティベースライン設定を作成し、プロジェクトリポジトリの `.claude/settings.json` にコミットします：

```json
{
  "permissions": {
    "defaultMode": "default",
    "allow": [
      "Bash(npm run:*)",
      "Bash(git status)",
      "Bash(git diff:*)",
      "Bash(git log:*)",
      "Bash(python -m pytest:*)"
    ],
    "deny": [
      "Read(.env)",
      "Read(.env.*)",
      "Read(secrets/**)",
      "Read(**/*.pem)",
      "Read(**/*.key)",
      "Read(**/*credential*)",
      "Write(.git/**)",
      "Bash(rm -rf:*)",
      "Bash(git push --force:*)",
      "Bash(git reset --hard:*)",
      "Bash(curl:*)",
      "Bash(wget:*)",
      "Bash(ssh:*)",
      "Bash(scp:*)"
    ]
  },
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [
          {
            "type": "command",
            "command": "echo \"$(date -Iseconds) TOOL_USE: $TOOL_INPUT\" >> .claude/audit.log"
          }
        ]
      }
    ]
  }
}
```

チームメンバーは `~/.claude/settings.json`（ユーザー級）で個人設定を追加できますが、プロジェクト級の Deny ルールは上書きできません。

### CI/CD でのセキュリティ設定

CI/CD 環境（Headless モード）で Claude Code を使用する場合、セキュリティ設定は特に重要です：

```yaml
# GitHub Actions の例
name: AI Code Review
on: [pull_request]

jobs:
  review:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Run Claude Code Review
        env:
          ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
        run: |
          claude --print --dangerously-skip-permissions \
            "今回の PR のコード変更をレビューし、セキュリティとコード品質の評価を提供してください" \
            < /dev/null
```

**CI/CD セキュリティ注意事項：**

| 注意事項 | 説明 |
|--------|------|
| API キー管理 | CI/CD プラットフォームの Secrets 管理を使用（GitHub Secrets など）、ハードコード禁止 |
| 最小権限 | CI 環境での Claude Code は読み取り専用権限のみを持ち、コードを変更しない |
| ネットワーク隔離 | CI 環境のアウトバウンドネットワークアクセスを制限 |
| タイムアウト設定 | 異常な長時間実行を防ぐため、適切な実行時間上限を設定 |
| ログ清理 | CI ログに機密情報が含まれないことを確認 |

### Headless モードのセキュリティ注意事項

Headless モード（`--print` または `-p`）は非対話型シナリオ用で、ヒューマン・イン・ザ・ループによる操作確認がありません。使用時は特に注意が必要です：

```bash
#  安全な Headless 使用法 — 読み取り専用操作
claude --print "src/ ディレクトリのコード構造を分析"

# 書き込み操作が必要な場合、具体的にファイルを限定
claude --print "src/utils.py の型エラーを修正"

# --dangerously-skip-permissions 使用時はリスクをよく理解していること
claude --print --dangerously-skip-permissions "npm test を実行"
```

`--dangerously-skip-permissions` この引数名がこんなに長いのは、あなたに警告ためです：権限チェックをスキップすることは危険です。入力プロンプトを完全に制御しており、考えられる操作を完全に理解している場合にのみ使用してください。

## エンタープライズセキュリティ

### ネットワークアクセス制御

厳格なネットワークセキュリティポリシーがある場合、以下の方法で Claude Code のネットワークアクセスを制御できます：

**1. プロキシ設定**

環境変数で HTTP プロキシを設定すると、すべてのネットワークリクエストがプロキシを経由し、監査と制御が容易になります：

```bash
# .bashrc または .zshrc に設定
export HTTP_PROXY=http://proxy.company.com:8080
export HTTPS_PROXY=http://proxy.company.com:8080
export NO_PROXY=localhost,127.0.0.1,.company.com
```

**2. ファイアウォールルール**

企業ファイアウォールでは、Claude Code に必要なドメインのみを許可できます：

```
# 必須許可ドメイン
api.anthropic.com         # Anthropic API
*.claude.ai               # Claude サービス

# オプション許可（使用する機能による）
registry.npmjs.org         # npm パッケージインストール
pypi.org                   # Python パッケージインストール
github.com                 # Git 操作
```

**3. settings.json でネットワークコマンドを禁止**

追加のセキュリティレイヤーとして、Deny ルールで一般的なネットワークツールを禁止します：

```json
{
  "permissions": {
    "deny": [
      "Bash(curl:*)",
      "Bash(wget:*)",
      "Bash(nc:*)",
      "Bash(ssh:*)",
      "Bash(scp:*)",
      "Bash(rsync:*)",
      "Bash(ftp:*)",
      "Bash(telnet:*)"
    ]
  }
}
```

### ログ監査

コンプライアンス要件が高い企業では、完全な監査ログシステムを構築することをお勧めします：

**1. 操作ログ**

Hooks ですべてのツール呼び出しを記録します：

```json
{
  "hooks": {
    "PreToolUse": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "python3 -c \"\nimport json, os, datetime\nlog_entry = {\n    'timestamp': datetime.datetime.now().isoformat(),\n    'user': os.environ.get('USER', 'unknown'),\n    'tool': os.environ.get('TOOL_NAME', 'unknown'),\n    'input': os.environ.get('TOOL_INPUT', '')[:500]\n}\nwith open(os.path.expanduser('~/.claude/audit.jsonl'), 'a') as f:\n    f.write(json.dumps(log_entry, ensure_ascii=False) + '\\n')\n\""
          }
        ]
      }
    ]
  }
}
```

**2. セッションログ**

Claude Code 自体がセッション履歴を保持し、`~/.claude/` ディレクトリに保存されます。企業はこれらのログを定期的にバックアップできます。

**3. 変更追跡**

Git と組み合わせると、すべてのファイル変更に完全な追跡記録があります。Claude Code による変更は毎回独立したブランチで実行し、PR フローでマージすることをお勧めします。

### コンプライアンスの考慮事項

AI プログラミングツールの使用は以下のコンプライアンス問題に関わる可能性があります：

**データセキュリティ**

| リスク | 対策 |
|------|---------|
| コードのクラウドアップロード | Claude Code は API リクエストのコンテキスト除き、コードを Anthropic サーバーにアップロードしません |
| 機密データの漏えい | .claudeignore を使用して機密ファイルを排除；Deny ルールで .env とキーファイルの読み取りを遮断 |
| API リクエスト内の機密情報 | パスワード、Token などの機密情報を会話に貼り付けない |

**知的財産権**

- Claude Code の出力（生成されたコード）は使用者所有
- Claude が生成したコードが著作権で保護された内容を含まないか確認に注意
- 重要なビジネスコードは、使用前に手動レビューをお勧めします

**業界コンプライアンス**

- 金融、医療などの規制業界では、AI 使用に追加の制限がある可能性があります
- あなたの組織に AI ツールの使用に関するポリシーがあるか確認
- コンプライアンス監査のニーズに応えるため監査ログを維持

## セキュリティ設定早見表

最後になりましたが、セキュリティ設定のクイックリファレンスです：

### 個人開発者の最低セキュリティ設定

```json
{
  "permissions": {
    "deny": [
      "Read(.env)",
      "Read(.env.*)",
      "Bash(rm -rf:*)",
      "Bash(git push --force:*)"
    ]
  }
}
```

### チームプロジェクト推奨設定

```json
{
  "permissions": {
    "defaultMode": "default",
    "allow": [
      "Bash(npm run:*)",
      "Bash(git status)",
      "Bash(git diff:*)",
      "Bash(git log:*)"
    ],
    "deny": [
      "Read(.env)",
      "Read(.env.*)",
      "Read(secrets/**)",
      "Read(**/*.pem)",
      "Write(.git/**)",
      "Bash(rm -rf:*)",
      "Bash(git push --force:*)",
      "Bash(git reset --hard:*)",
      "Bash(curl:*)",
      "Bash(wget:*)"
    ]
  }
}
```

### 高セキュリティエンタープライズ設定

```json
{
  "permissions": {
    "defaultMode": "default",
    "allow": [
      "Bash(npm run lint)",
      "Bash(npm run test)",
      "Bash(git status)",
      "Bash(git diff)"
    ],
    "deny": [
      "Read(.env)",
      "Read(.env.*)",
      "Read(secrets/**)",
      "Read(**/*.pem)",
      "Read(**/*.key)",
      "Read(**/*credential*)",
      "Read(**/*password*)",
      "Write(.git/**)",
      "Write(.github/**)",
      "Bash(rm:*)",
      "Bash(git push:*)",
      "Bash(git reset:*)",
      "Bash(git checkout -- :*)",
      "Bash(curl:*)",
      "Bash(wget:*)",
      "Bash(ssh:*)",
      "Bash(scp:*)",
      "Bash(nc:*)",
      "Bash(python -c:*)",
      "Bash(node -e:*)",
      "Bash(eval:*)",
      "Bash(exec:*)",
      "Bash(sudo:*)",
      "Bash(chmod:*)",
      "Bash(chown:*)"
    ]
  },
  "hooks": {
    "PreToolUse": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "python3 -c \"import json,os,datetime; f=open(os.path.expanduser('~/.claude/audit.jsonl'),'a'); f.write(json.dumps({'ts':datetime.datetime.now().isoformat(),'user':os.environ.get('USER','?'),'tool':os.environ.get('TOOL_NAME','?'),'input':os.environ.get('TOOL_INPUT','')[:500]},ensure_ascii=False)+'\\n'); f.close()\""
          }
        ]
      }
    ]
  }
}
```

## よくある質問

**Q：Claude Code はコードを Anthropic のサーバーに送信しますか？**

A：Claude Code は Anthropic と API 経由で通信しており、会話コンテキスト（あなたが引用したコード断片を含む）は API リクエストの一部として送信されます。しかし、Anthropic は API を通じて提出されたデータをモデルのトレーニングに使用しません（Anthropic の利用規約に従います）。QCode などのリレーサービスを使用している場合は、当該サービスのプライバシーポリシーをご確認ください。

**Q：settings.json の Deny ルールは Claude によってバイパスできますか？**

A：通常の使用ではできません。Deny ルールはシステムレベルで強制適用され、Claude はプロンプトエンジニアリングやその他の方法でバイパスできません。ただし、`bypassPermissions` モードを手動で選択したり、`--dangerously-skip-permissions` パラメータを使用した場合、これらのルールはもはや有効ではありません。

**Q：.claudeignore と Deny ルールの違いは何ですか？**

A：`.claudeignore` は Claude がファイルの存在を完全に認知できなくします（Git にとっての `.gitignore` のようなもの）。一方、Deny ルールは Claude がアクセスを試みた時点で拒否します。Claude に特定のファイルが存在することすら知られたくない場合は `.claudeignore` を使用し、単に変更されたくない場合は Deny ルールを使用します。

**Q：複数人コラボレーション時、それぞれの設定が異なる場合はどうすればいいですか？**

A：プロジェクト級の `.claude/settings.json` を Git にコミットし、チームが統一されたセキュリティベースラインを共有できるようにします。個人の `~/.claude/settings.json` で追加設定できますが、プロジェクト級の Deny ルールは上書きできません。

**Q：Docker コンテナで Claude Code を使用するとより安全になりますか？**

A：はい。Docker は追加の隔離レイヤーを提供し、Claude Code が予期しない操作を実行しても、影響はコンテナ内に制限されます。コンテナでは以下を推奨します：ソースコードディレクトリを読み取り専用でマウント、ネットワークアクセスを制限、非 root ユーザーで実行。
## MCP セキュリティとサンドボックス

MCP（Model Context Protocol）により、Claude Code は外部のツールやデータソース — データベース、API、ファイルシステム、サードパーティサービスなど — に接続できます。これは能力を大きく拡張しますが、新しい種類のセキュリティリスクももたらします：**MCP サーバーを 1 つ追加するたびに、サードパーティのコードとそれが宣言するツール権限を、あなたの信頼境界の中に取り込むことになります**。MCP の設定と使い方は [MCP サーバー設定](/docs/advanced/mcp) を参照してください。本節はセキュリティに焦点を当てます。

### MCP がもたらす主なリスク

- **データの外部流出**：悪意のある、または侵害された MCP サーバーは、渡した内容（コード、ファイル、会話コンテキスト）を読み取り、ひそかに外部へ送信できます。
- **ツールポイズニング（Tool Poisoning）**：サーバーがツールの説明・メタデータに隠れた指示を埋め込み、モデルを意図しない操作へ誘導します — AI のツール呼び出しを狙ったプロンプトインジェクションの一種です。
- **認証情報の漏洩**：サーバーが環境変数や秘密ファイルにアクセスできる場合、API キーやトークンなどの機密認証情報を盗む可能性があります。
- **過大な権限**：「削除」「書き込み」「コマンド実行」といった破壊的なツールを宣言したサーバーは、暴走すると取り返しのつかない損害を引き起こすおそれがあります。

### 緩和策

- **信頼できる提供元のみインストール**：公式または監査済みの MCP サーバーのみをインストールし、他のサードパーティ依存と同様に信頼性を評価します。
- **各サーバーのツール権限範囲を確認**：接続前に、サーバーが宣言するツールと、それぞれが何をできるかを一つずつ点検し、「読み取り」「書き込み」「実行」を段階的に扱います。
- **人による承認ゲートを残す**：Claude Code はツールを呼び出す前に確認を求めます。破壊的な操作や認証情報に触れるツールについては、**一括で許可せず**、毎回の承認を維持してください。
- **サンドボックスで秘密へのアクセスを遮断**：`sandbox.credentials` 設定により、サンドボックス内で実行されるコマンドが環境変数や秘密ファイルを読み取れないようにします。これにより、ツールがポイズニングされても認証情報を取得できません。
- **最小権限の原則**：MCP サーバーには、タスク遂行に必要な最小限のツールセットとアクセス範囲だけを与え、便宜のためにすべてを開放しないでください。
- **監査とログ**：ツール呼び出しを記録し、どのサーバーが呼び出され何をしたかを定期的に振り返ることで、異常な挙動を早期に発見できます。

すべての MCP サーバーを「自分の道具箱を持って入ってくる外部の請負業者」として扱いましょう — まず身元を確認し、触れられるものを限定し、各操作に対する確認権を保持します。こうすることで、MCP の拡張能力を享受しながら、セキュリティ境界を守ることができます。