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サーバーの信頼確認:初回接続時に確認ダイアログを表示(非インタラクティブ実行時は自動ブロック)
Claude Codeの保護機構はリスクを大幅に低減しますが、完全ではありません。外部コンテンツを扱う際は後述の設定を組み合わせて多層防御を構築してください。疑わしい動作に気づいたら
/feedbackコマンドで報告してください。ユーザーがとれる対策
- 外部APIのレスポンスやWebコンテンツを直接パイプで処理させない(
curl | claudeは避ける) - WebFetchを特定ドメインに制限する(後述の権限設定参照)
- Bashコマンドの提案は実行前に必ずレビューする
- VM・コンテナ内で実行して被害をホストOSに及ばないようにする
権限設計:deny-firstアプローチで最小権限を実現
権限設定の評価順序はdeny → ask → allowです。denyに一致した時点でブロックされるため、「まず危険なものをすべてdenyし、必要なものだけallowする」という設計が安全です。
基本的な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は特定ドメインのみに制限することで、意図しない外部サービスへのアクセスを防げます。
{
"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 *)の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ルールが必要です。
{
"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を設定します。
{
"disableBypassPermissionsMode": "disable"
}
サンドボックスによるファイルシステム・ネットワーク隔離
Claude Codeにはサンドボックス機能があり、Bashコマンドの実行を隔離された環境に閉じ込めることができます。Bashのdenyルールより強力な隔離を提供します。
| プラットフォーム | サンドボックス技術 |
|---|---|
| macOS | Seatbelt(macOS標準のサンドボックス機能) |
| Linux / WSL2 | bubblewrap + socat |
| Windows(ネイティブ) | 現在対応中 |
サンドボックスの有効化
サンドボックスは/sandboxコマンドでインタラクティブに設定するか、settings.jsonで有効化できます。有効化するとClaude Codeのバージョンごとに許可済みのファイルパスやネットワークドメインが制御されます。
# インタラクティブメニューでオン/オフを切り替え /sandbox
{
"sandbox": true
}
サンドボックスで許可するファイルパスやネットワークドメインの詳細設定は、Claude Codeのバージョンや動作環境により設定方法が異なります。最新の設定方法は
claude --helpコマンドまたは公式ドキュメントを確認してください。より強力なネットワーク隔離が必要な場合は、後述のDev Containersのファイアウォール設定を検討してください。サンドボックスはClaude Code内部での制限、Dev Containersのファイアウォールはコンテナレベルの制限です。両方を組み合わせることで多層防御になります。Dev Containersのファイアウォール設定についてはDev Containers完全ガイドを参照してください。
MCPサーバーのセキュリティリスクと対策
MCPサーバーはClaude Codeの能力を拡張しますが、信頼できないMCPサーバーはセキュリティリスクになります。AnthropicはMCPサーバーの内容を審査・管理していません。
MCPサーバー選定時のチェックポイント
- 公式レジストリまたは信頼できる提供元のリポジトリから取得しているか
- 要求する権限が用途に対して適切か(不要なファイルアクセス・ネットワーク権限を要求していないか)
- 定期的なメンテナンス・セキュリティパッチが提供されているか
- オープンソースでコードが確認できるか
enableAllProjectMcpServersのリスク
enableAllProjectMcpServers: trueを設定すると、.mcp.jsonに定義されたすべてのMCPサーバーが確認なしで自動起動します。信頼できないリポジトリをクローンして開いた場合、マルウェアサーバーが自動的に起動するリスクがあります。代わりにenabledMcpjsonServersで信頼するサーバーを明示的に列挙してください。{
"enabledMcpjsonServers": ["github", "filesystem", "postgresql"],
"disabledMcpjsonServers": ["untrusted-server"]
}
企業環境でのMCPサーバー管理
{
"allowManagedMcpServersOnly": true,
"allowedMcpServers": [
"github",
"internal-db-server"
]
}
Hooksによる監査ログと危険コマンドのブロック
Claude Codeのフック機能を使って、ツール実行を記録したり危険なコマンドを事前にブロックしたりできます。フックの詳細はHooks完全ガイドを参照してください。
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の場合、ツールの実行がブロックされます。
#!/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 # 許可
{
"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リスト |
{
"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で本番ドメインを除外すれば、ネットワーク経由のアクセスも防げます。

