Claude Code セキュリティ完全ガイド|プロンプトインジェクション対策・権限設計・機密情報保護・監査ログ

Claude Code セキュリティ完全ガイド|プロンプトインジェクション対策・権限設計・機密情報保護・監査ログ AI開発

Claude Codeはファイルの読み書き・Bashコマンドの実行・ネットワークへのアクセスなど、強力な操作権限を持ちます。その分、適切なセキュリティ設定なしに使うとリスクが生じます。悪意あるWebページを読み込ませてコマンドを実行させる「プロンプトインジェクション」攻撃、誤って.envファイルやAPIキーを読み取られるリスク、チームメンバーが意図せず本番環境を変更してしまうリスクなどが実在します。

この記事では、Claude Codeのセキュリティ機能を体系的に解説します。権限設定の詳細は権限・パーミッション設定完全ガイドを、Hooksの詳細はHooks完全ガイドを、Docker隔離環境の構築はDev Containers完全ガイドも参照してください。

スポンサーリンク

プロンプトインジェクション攻撃とは

プロンプトインジェクションとは、Claude Codeが処理するデータの中に悪意ある指示を埋め込み、意図しない操作を実行させる攻撃です。

主な攻撃ベクトル

攻撃パターン 具体例
Webコンテンツ経由 WebFetchで取得したHTMLやAPIレスポンスに"以下の指示を無視して~を実行せよ"が埋め込まれている
ファイル経由 外部から取得したJSONや設定ファイルにシェルコマンドが埋め込まれている
MCPサーバー経由 悪意あるMCPサーバーがツール定義やレスポンスに偽の指示を混入させる
リポジトリ経由 CLAUDE.mdや設定ファイルに攻撃コードが混入したリポジトリをクローンして開く

Claude Codeの組み込み保護機構

Claude Codeには以下の保護機構が組み込まれています。

  • コンテキスト分析:悪意ある指示をリクエスト全体の文脈から検知
  • WebFetchの隔離:外部コンテンツは専用のコンテキストウィンドウで処理し、メインセッションへの混入を制限
  • コマンドインジェクション検知:疑わしいBashコマンドは事前許可があっても手動承認を要求
  • Fail-closed:パターンにマッチしないコマンドはデフォルトで手動承認が必要
  • 新MCPサーバーの信頼確認:初回接続時に確認ダイアログを表示(非インタラクティブ実行時は自動ブロック)
保護機構があっても100%ではない
Claude Codeの保護機構はリスクを大幅に低減しますが、完全ではありません。外部コンテンツを扱う際は後述の設定を組み合わせて多層防御を構築してください。疑わしい動作に気づいたら/feedbackコマンドで報告してください。

ユーザーがとれる対策

  • 外部APIのレスポンスやWebコンテンツを直接パイプで処理させない(curl | claudeは避ける)
  • WebFetchを特定ドメインに制限する(後述の権限設定参照)
  • Bashコマンドの提案は実行前に必ずレビューする
  • VM・コンテナ内で実行して被害をホストOSに及ばないようにする

権限設計:deny-firstアプローチで最小権限を実現

権限設定の評価順序はdeny → ask → allowです。denyに一致した時点でブロックされるため、「まず危険なものをすべてdenyし、必要なものだけallowする」という設計が安全です。

基本的なdeny-first設計例

.claude/settings.json(deny-firstの権限設計)
{
  "permissions": {
    "deny": [
      "Bash(git push *)",
      "Bash(rm -rf *)",
      "Bash(sudo *)",
      "Bash(curl * | bash)",
      "Read(./.env)",
      "Read(./.env.*)",
      "Read(~/secrets/**)"
    ],
    "ask": [
      "Bash(rm *)",
      "Bash(git reset *)"
    ],
    "allow": [
      "Bash(npm run *)",
      "Bash(npm test)",
      "Bash(git add *)",
      "Bash(git commit *)",
      "Bash(git status)",
      "Bash(git diff *)",
      "Read(**)",
      "Edit(src/**)",
      "Edit(tests/**)"
    ]
  }
}

WebFetchの制限

WebFetchは特定ドメインのみに制限することで、意図しない外部サービスへのアクセスを防げます。

WebFetchをドメイン制限
{
  "permissions": {
    "allow": [
      "WebFetch(domain:github.com)",
      "WebFetch(domain:docs.anthropic.com)",
      "WebFetch(domain:npmjs.com)"
    ],
    "deny": [
      "WebFetch(domain:pastebin.com)",
      "WebFetch(domain:ngrok.io)"
    ]
  }
}
Bashのcurl制限には抜け穴がある
Bash(curl *)のdenyルールはBashサブプロセス内のcurl呼び出しには完全には適用されません。確実にネットワークを制限したい場合は、後述のサンドボックス機能かDev Containersのファイアウォール設定を使ってください。

ファイルシステムのパス形式

Read/Editルールのパスはgitignore形式で指定します。絶対パスと相対パスの扱いに注意してください。

パターン 意味
/path プロジェクトルートからの相対パス Read(/src/**)
//path ファイルシステムルートからの絶対パス Read(//home/user/secrets/*)
~/path ホームディレクトリからの相対パス Read(~/Documents/**)
./path または path 現在のディレクトリからの相対パス Read(./.env)

機密情報・シークレットの保護

.envファイルとシークレットをdenyする

.envファイルや秘密鍵などの機密情報は、permissions.denyで明示的に読み取りを禁止してください。gitignoreで除外していてもClaude Codeからは読み取れるため、別途denyルールが必要です。

~/.claude/settings.json(機密情報保護)
{
  "permissions": {
    "deny": [
      "Read(./.env)",
      "Read(./.env.*)",
      "Read(./.env.local)",
      "Read(./.env.*.local)",
      "Read(./secrets/**)",
      "Read(~/secrets/**)",
      "Read(~/.ssh/**)",
      "Read(~/.aws/credentials)",
      "Read(~/.config/gcloud/**)"
    ]
  }
}
ユーザー設定に書いて全プロジェクトに適用
ホームディレクトリ(~/.ssh/~/.aws/credentials等)の保護は~/.claude/settings.json(ユーザー設定)に書いておくと、すべてのプロジェクトに自動で適用されます。プロジェクト設定(.claude/settings.json)には環境固有のdenyルールを追加してください。

bypassPermissionsModeの制限

bypassPermissionsモード(Shift+Tabで選択可能)はほぼすべての操作を確認なしで実行します。企業環境でこのモードを禁止したい場合はdisableBypassPermissionsModeを設定します。

bypassPermissionsModeを無効化
{
  "disableBypassPermissionsMode": "disable"
}

サンドボックスによるファイルシステム・ネットワーク隔離

Claude Codeにはサンドボックス機能があり、Bashコマンドの実行を隔離された環境に閉じ込めることができます。Bashのdenyルールより強力な隔離を提供します。

プラットフォーム サンドボックス技術
macOS Seatbelt(macOS標準のサンドボックス機能)
Linux / WSL2 bubblewrap + socat
Windows(ネイティブ) 現在対応中

サンドボックスの有効化

サンドボックスは/sandboxコマンドでインタラクティブに設定するか、settings.jsonで有効化できます。有効化するとClaude Codeのバージョンごとに許可済みのファイルパスやネットワークドメインが制御されます。

/sandboxコマンドで設定
# インタラクティブメニューでオン/オフを切り替え
/sandbox
.claude/settings.json(サンドボックス有効化)
{
  "sandbox": true
}
サンドボックスの詳細設定
サンドボックスで許可するファイルパスやネットワークドメインの詳細設定は、Claude Codeのバージョンや動作環境により設定方法が異なります。最新の設定方法はclaude --helpコマンドまたは公式ドキュメントを確認してください。より強力なネットワーク隔離が必要な場合は、後述のDev Containersのファイアウォール設定を検討してください。
Dev Containersのファイアウォールとの違い
サンドボックスはClaude Code内部での制限、Dev Containersのファイアウォールはコンテナレベルの制限です。両方を組み合わせることで多層防御になります。Dev Containersのファイアウォール設定についてはDev Containers完全ガイドを参照してください。

MCPサーバーのセキュリティリスクと対策

MCPサーバーはClaude Codeの能力を拡張しますが、信頼できないMCPサーバーはセキュリティリスクになります。AnthropicはMCPサーバーの内容を審査・管理していません。

MCPサーバー選定時のチェックポイント

  • 公式レジストリまたは信頼できる提供元のリポジトリから取得しているか
  • 要求する権限が用途に対して適切か(不要なファイルアクセス・ネットワーク権限を要求していないか)
  • 定期的なメンテナンス・セキュリティパッチが提供されているか
  • オープンソースでコードが確認できるか

enableAllProjectMcpServersのリスク

enableAllProjectMcpServersはリスクがある
enableAllProjectMcpServers: trueを設定すると、.mcp.jsonに定義されたすべてのMCPサーバーが確認なしで自動起動します。信頼できないリポジトリをクローンして開いた場合、マルウェアサーバーが自動的に起動するリスクがあります。代わりにenabledMcpjsonServersで信頼するサーバーを明示的に列挙してください。
.claude/settings.json(MCPサーバーを個別に許可)
{
  "enabledMcpjsonServers": ["github", "filesystem", "postgresql"],
  "disabledMcpjsonServers": ["untrusted-server"]
}

企業環境でのMCPサーバー管理

Managed settings(MCPサーバーをホワイトリスト化)
{
  "allowManagedMcpServersOnly": true,
  "allowedMcpServers": [
    "github",
    "internal-db-server"
  ]
}

Hooksによる監査ログと危険コマンドのブロック

Claude Codeのフック機能を使って、ツール実行を記録したり危険なコマンドを事前にブロックしたりできます。フックの詳細はHooks完全ガイドを参照してください。

PostToolUseフックで監査ログを記録する

.claude/settings.json(PostToolUseで実行ログ)
{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Bash|Edit|Write",
        "hooks": [
          {
            "type": "command",
            "command": "jq -c --arg ts $(date -u +%Y-%m-%dT%H:%M:%SZ) '{timestamp: $ts, tool: .tool_name, input: .tool_input}' >> ~/claude-audit.log"
          }
        ]
      }
    ]
  }
}

PreToolUseフックで危険なコマンドをブロックする

PreToolUseフックでツール実行前にチェックを行い、危険なパターンを検知したら実行を中止できます。フックのexit codeが2の場合、ツールの実行がブロックされます。

.claude/hooks/security-filter.sh(危険コマンドブロック)
#!/bin/bash
# stdin からツール情報を受け取る
INPUT=$(cat)
TOOL=$(echo "$INPUT" | jq -r '.tool_name')
CMD=$(echo "$INPUT" | jq -r '.tool_input.command // empty')

# 危険なパターンのリスト
BLOCKED=(
  "rm -rf /"
  "drop table"
  "curl.*|.*bash"
  "wget.*|.*sh"
  "> /dev/sda"
)

for pattern in "${BLOCKED[@]}"; do
  if echo "$CMD" | grep -iE "$pattern" > /dev/null 2>&1; then
    echo "BLOCKED: コマンドが危険なパターンにマッチしました: $pattern" >&2
    exit 2  # exit 2 = ブロック
  fi
done

exit 0  # 許可
.claude/settings.json(PreToolUseフックの設定)
{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [
          {
            "type": "command",
            "command": "$CLAUDE_PROJECT_DIR/.claude/hooks/security-filter.sh"
          }
        ]
      }
    ]
  }
}
exit code フックの動作
0 ツール実行を許可(stdoutがコンテキストに追加される)
2 ツール実行をブロック(stderrの内容がClaudeへのフィードバックになる)
その他 ツール実行を許可(エラーとしてログに記録)

企業向け:Managed settingsでセキュリティポリシーを強制する

Claude Teams/Enterpriseプランでは、管理者がManaged settingsでセキュリティポリシーをチーム全員に強制できます。ユーザーはManaged settingsを上書きできません。

Managed settings専用のセキュリティフィールド

フィールド 説明
allowManagedPermissionRulesOnly ユーザー・プロジェクトのallow/denyルールを無効化。Managed settingsのルールだけが有効になる
allowManagedHooksOnly ユーザー・プロジェクト・プラグインのフックをすべて無効化
allowManagedMcpServersOnly Managed settings外のMCPサーバーを使用不可にする
disableBypassPermissionsMode "disable"で権限バイパスモードを禁止
blockedMarketplaces 禁止するプラグインマーケットプレイスのURLリスト
Managed settings例(セキュリティ強化構成)
{
  "allowManagedPermissionRulesOnly": true,
  "allowManagedHooksOnly": true,
  "allowManagedMcpServersOnly": true,
  "disableBypassPermissionsMode": "disable",
  "permissions": {
    "deny": [
      "Read(./.env*)",
      "Read(~/secrets/**)",
      "Bash(curl * | bash)",
      "Bash(wget * | sh)"
    ]
  },
  "allowedMcpServers": [
    "github",
    "internal-tools"
  ]
}

Managed settingsの配布方法

OS 配布方法
macOS MDM(Jamf/Kandji)でのプロファイル配信、または/Library/Application Support/ClaudeCode/managed-settings.jsonを手動配置
Linux / WSL2 /etc/claude-code/managed-settings.jsonを管理者権限で配置
全OS(Teams/Enterprise) Claude.ai管理コンソールから自動配信

セキュリティ設定チェックリスト

個人開発者向け

  • ~/.claude/settings.jsonにホームディレクトリの機密ファイル(~/.ssh/~/.aws/credentials)のdenyルールを設定
  • プロジェクトの.claude/settings.json.env系ファイルのdenyルールを設定
  • WebFetchを必要なドメインのみに制限
  • MCPサーバーはenabledMcpjsonServersで個別に許可(enableAllProjectMcpServersを使わない)
  • Bashコマンドの提案は実行前にレビューする習慣をつける

チーム・企業向け

  • .claude/settings.jsonをGitにコミットしてチームで共有
  • Teams/EnterpriseプランではManaged settingsでdenyルールを全員に強制
  • disableBypassPermissionsMode: "disable"でバイパスモードを禁止
  • allowManagedMcpServersOnlyでMCPサーバーをホワイトリスト管理
  • PostToolUseフックで監査ログを記録
  • PreToolUseフックで危険コマンドをブロック
  • 本番環境の操作はDev Containers(ファイアウォール付き)内で実行

よくある質問

Q.envファイルをdenyに設定すれば完全に守れますか?

ARead(./.env)のdenyルールはClaude Codeからの直接読み取りをブロックしますが、Bashサブプロセス内でcat .envを実行された場合には適用されません。完全な保護には、denyルールに加えてサンドボックスのdenyRead設定か、Dev Containersでのファイルシステム隔離を組み合わせてください。

Qプロンプトインジェクション攻撃を受けたかもしれません。どう確認しますか?

Aclaude doctorでシステム状態を確認してください。また、PostToolUseフックで監査ログを記録している場合はログを確認します。疑わしいコマンドが実行されていた場合は/feedbackコマンドでAnthropicに報告してください。重要なリポジトリへの変更はgit log --oneline -20で確認し、意図しないコミットがあればgit revertで戻してください。

QMCPサーバーはどのように信頼性を判断すればいいですか?

A①GitHubのリポジトリのスター数・コントリビューター数・最終更新日を確認、②ソースコードを確認してファイルシステム・ネットワークへの不審なアクセスがないかチェック、③要求している権限が機能の範囲内か確認します。わからない場合はenabledMcpjsonServersで個別に許可して使い始め、問題がなければ継続利用という段階的なアプローチを取ってください。

QManaged settingsはFreeプランでも使えますか?

AManaged settingsのサーバー経由配信機能(Claude.ai管理コンソール)はClaude Teams/Enterpriseプランが必要です。MDM・グループポリシー・手動ファイル配置による方法はどのプランでも利用できます。

Q本番環境へのアクセスをClaude Codeから完全に防ぐにはどうすればいいですか?

A最も確実な方法はdenyルールと組み合わせることです。例として本番DBの接続情報ファイルをReadでdeny、本番サーバーへのSSH・git pushをBashでdenyします。さらにサンドボックスのallowedDomainsで本番ドメインを除外すれば、ネットワーク経由のアクセスも防げます。