Tips & Tricks

Claude Code セキュリティ対策完全ガイド|APIキー漏洩・権限設定・本番保護

Claude Code を安全に使うための実践セキュリティガイド。APIキー管理から権限設定、Hooksを使った自動チェック、本番環境保護まで、動くコードで解説。

Claude Code は強力なファイル操作・コマンド実行能力を持つ反面、設定を誤ると取り返しのつかない事故が起きます。.env ファイルをコミット、本番DBを誤って削除、APIキーをログに出力——これらは全て「Claude Code を無防備に使った結果」起きた実際の事例です。

この記事では、Claude Code を安全に使うためのセキュリティ対策を実装レベルで解説します。概念の説明だけでなく、コピペで動く設定と予防コードを中心にまとめました。

なぜ Claude Code にセキュリティ対策が必要か

通常のテキストエディタと違い、Claude Code は以下の権限を持ちます。

  • 任意ファイルの読み書き削除 (Read / Write / Edit / Bash(rm))
  • シェルコマンドの実行 (Bash)
  • ネットワークアクセス (WebFetch / APIコール)
  • 外部サービスへの投稿 (Qiita, GitHub, Slack など)

これらは全て、ユーザーが承認さえすれば実行できます。問題は「承認を機械的にOKし続けると、意図しない操作が通り抜ける」こと。セキュリティ対策とは「ミスの入り込む余地を構造的に消す」作業です。

対策1: APIキーの管理 — .env + gitignore が基本

やってはいけない例

// ❌ ソースコードに直書き
const client = new Anthropic({ apiKey: "sk-ant-api03-..." });

// ❌ CLAUDE.md や設定ファイルに書く
// ANTHROPIC_API_KEY=sk-ant-api03-...

// ❌ claude -p のプロンプト内に書く
// QIITA_TOKEN=abc123 を使ってQiitaに投稿して

正しい管理方法

# .env (git管理外、マシンローカルに置く)
ANTHROPIC_API_KEY=sk-ant-api03-...
QIITA_TOKEN=06b4441b...
SLACK_BOT_TOKEN=xoxb-...
DATABASE_URL=postgresql://...
# .gitignore に必ず追加
.env
.env.*
.env.local
!.env.example   # ← サンプルだけはOK
*.pem
*.key
credentials.json
*-service-account.json
# .env.example (git管理OK、値は空)
ANTHROPIC_API_KEY=
QIITA_TOKEN=
SLACK_BOT_TOKEN=
DATABASE_URL=

コードでの読み込み

// ✅ 環境変数から読む
import { config } from "dotenv";
config();

const token = process.env.QIITA_TOKEN;
if (!token) throw new Error("QIITA_TOKEN が設定されていません。.env を確認してください。");

CLAUDE.md に禁則事項として明記

## セキュリティ禁則事項
- APIキー・トークンをプロンプトに含めない
- .env ファイルを読んで内容を出力しない
- 環境変数の値をログやコメントに書かない
- process.env の中身を console.log しない

対策2: コミット前の秘密情報スキャン

.env をgitignoreしていても、別ファイルへの誤記入やコピペ漏れは防げません。コミット前に自動スキャンする仕組みを入れましょう。

Hooks でコミット前チェック

.claude/settings.json:

{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash(git commit*)",
        "hooks": [
          {
            "type": "command",
            "command": "node scripts/secret-scan.mjs"
          }
        ]
      }
    ]
  }
}

scripts/secret-scan.mjs:

import { execSync } from "child_process";

// ステージングされた変更を取得
const diff = execSync("git diff --cached").toString();

const PATTERNS = [
  { name: "Anthropic APIキー", re: /sk-ant-api\d+-[A-Za-z0-9_-]{80,}/ },
  { name: "OpenAI APIキー", re: /sk-[A-Za-z0-9]{48}/ },
  { name: "AWS アクセスキー", re: /AKIA[0-9A-Z]{16}/ },
  { name: "Slack トークン", re: /xox[baprs]-[0-9A-Za-z-]{10,}/ },
  { name: "Generic シークレット", re: /[Ss]ecret[_-]?[Kk]ey\s*[:=]\s*['"][^'"]{10,}['"]/ },
];

const found = PATTERNS.filter(({ re }) => re.test(diff));

if (found.length > 0) {
  console.error("🚨 シークレット検出! コミットを中止します:");
  found.forEach(({ name }) => console.error(`  - ${name}`));
  console.error("\n対処法: git reset HEAD <file> で unstage してください");
  process.exit(1);  // 終了コード1 → Hookがコマンドをブロック
}

console.log("✓ シークレットスキャン: 問題なし");
process.exit(0);

これで git commit を Claude Code が実行しようとした瞬間に自動スキャンが走り、漏洩が検出された場合はブロックされます。

対策3: 権限モードの設定

Claude Code の許可・拒否はファイルレベルで細かく制御できます。

.claude/settings.json の権限設定

{
  "permissions": {
    "allow": [
      "Read(**)",
      "Glob(**)",
      "Grep(**)"
    ],
    "deny": [
      "Bash(rm -rf*)",
      "Bash(git push --force*)",
      "Bash(git reset --hard*)",
      "Bash(DROP TABLE*)",
      "Bash(truncate*)",
      "Bash(curl * | bash)",
      "Bash(wget * | sh)"
    ],
    "ask": [
      "Write(**)",
      "Edit(**)",
      "Bash(git commit*)",
      "Bash(git push*)",
      "Bash(npm publish*)",
      "Bash(wrangler pages deploy*)"
    ]
  }
}
設定意味
allow確認なしで実行
deny一切実行不可 (拒否)
ask毎回承認が必要

ポイント: 破壊的コマンドは deny、書き込み系は ask、読み取り系は allow が基本分類です。

本番環境専用の設定ファイル

本番環境では読み取り専用に絞るのが安全。

// .claude/settings.production.json
{
  "permissions": {
    "allow": ["Read(**)", "Glob(**)", "Grep(**)", "Bash(git log*)", "Bash(git diff*)"],
    "deny": ["Write(**)", "Edit(**)", "Bash(git push*)", "Bash(rm*)", "Bash(*deploy*)"],
    "ask": []
  }
}
# 本番作業時に明示的に指定
CLAUDE_SETTINGS=.claude/settings.production.json claude

対策4: 本番環境の保護

接続先を明示的に分離

## CLAUDE.md — 本番環境ルール

## 環境判定
- DATABASE_URL に 'prod' または 'production' が含まれる場合は**本番環境**
- 本番環境では以下を絶対に実行しない:
  - DROP / TRUNCATE / DELETE (WHERE なし)
  - マイグレーション (事前確認必須)
  - ファイルの一括削除

## 確認フロー
本番への変更は必ず:
1. ステージング環境でテスト
2. ユーザーに確認を取る
3. 実行後に結果を報告

環境変数で接続先を制御

// scripts/db-query.mjs
const env = process.env.NODE_ENV ?? "development";
const dbUrl = process.env.DATABASE_URL;

if (env === "production" && process.argv.includes("--write")) {
  console.error("❌ 本番環境への書き込みは --force-production フラグが必要です");
  process.exit(1);
}

対策5: ファイル操作の安全装置

削除前のバックアップを自動化

// .claude/settings.json のHooks
{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash(rm *)",
        "hooks": [
          {
            "type": "command",
            "command": "echo '⚠️  削除コマンドが実行されようとしています。Ctrl+C で中止できます。' && sleep 3"
          }
        ]
      }
    ]
  }
}

重要ファイルを誤編集から守る

## CLAUDE.md — 変更禁止ファイル

以下のファイルは**絶対に編集しない**:
- .env (環境変数、秘密鍵を含む)
- wrangler.toml (Cloudflare本番設定)
- scripts/deploy.sh (デプロイスクリプト)
- .github/workflows/*.yml (CI/CD設定)

変更が必要な場合はユーザーに確認を取ること。

落とし穴5選

1. .gitignore を後から追加しても手遅れ すでにコミット済みの .env は gitignore を追加しても git 履歴に残ります。

# 履歴から完全削除 (要注意: force push が必要)
git filter-branch --force --index-filter \
  "git rm --cached --ignore-unmatch .env" \
  --prune-empty --tag-name-filter cat -- --all

# または BFG Repo Cleaner を使う

GitHub にプッシュ済みの場合は 必ず APIキーをローテーション してから対処してください。

2. サービスアカウントJSONをリポジトリに置く Google Cloud や AWS のサービスアカウントキーは .json で配布されることが多いですが、リポジトリに置くのは危険。環境変数化 するか Secret Manager (AWS Secrets Manager / GCP Secret Manager) に移行しましょう。

3. Bash ツールで対話型コマンドを実行する claude -p でのヘッドレス実行中に sudovim など対話入力が必要なコマンドが混ざると、プロセスがハングします。非対話的なコマンドのみ を使うようにしましょう。

4. エラーメッセージに認証情報を含める

// ❌ 危険: APIキーがログに出る
throw new Error(`認証失敗: token=${process.env.TOKEN}`);

// ✅ 安全: 値を出さない
throw new Error(`認証失敗: TOKEN 環境変数を確認してください`);

5. 全プロジェクトで同じ権限設定を使い回す 趣味プロジェクトと業務プロジェクトで同じ settings.json を使うと、業務側で必要な制限が趣味側の緩い設定で上書きされます。プロジェクトごとに .claude/settings.json を管理しましょう。

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

Claude Code プロジェクトに導入する際の確認リスト:

### 基本設定
- [ ] .env を作成し .gitignore に追加済み
- [ ] .env.example を作成してチーム共有済み
- [ ] 既存コミットに秘密情報がないか git log で確認

### 権限設定
- [ ] .claude/settings.json に deny リストを設定
- [ ] 破壊的コマンド (rm -rf, DROP TABLE 等) を deny に追加
- [ ] 本番デプロイコマンドを ask に設定

### 自動化
- [ ] コミット前シークレットスキャン Hook を設定
- [ ] CLAUDE.md にセキュリティ禁則事項を記載

### 運用
- [ ] APIキーのローテーション周期を決める (推奨: 90日)
- [ ] 本番環境は専用の settings.production.json を使用
- [ ] インシデント発生時の対処フローを文書化

まとめ

Claude Code のセキュリティは「制限を課す」ではなく「事故が起きない構造を作る」です。

脅威対策
APIキー漏洩.env + .gitignore + シークレットスキャンHook
意図しない削除deny リスト + 削除前 Hook
本番誤操作本番専用 settings + CLAUDE.md禁則
コミット汚染PreToolUse Hook でコミット前スキャン

設定は一度入れてしまえばメンテナンスフリー。今日30分かけて入れると、将来の大きな事故を防げます。

関連記事

参考資料

#claude-code #security #api-key #permissions #devops #best-practices

Claude Codeをもっと活用しませんか?

実務で使えるプロンプトテンプレート50選。コピペですぐ使えます。

無料プレゼント

無料PDF: Claude Code 5分でわかるチートシート

メールアドレスを登録するだけで、A4 1枚のチートシートPDFを今すぐお送りします。

個人情報は厳重に管理し、スパムは送りません。

Masa

この記事を書いた人

Masa

現役DX室長|Claude Code でゼロから多言語AI技術メディア運営中。実務直結の自動化、AI開発相談・研修受付中。

PR

関連書籍・参考図書

この記事のテーマに関連する書籍を楽天ブックスで探せます。

※ 当サイトは楽天市場のアフィリエイトプログラムに参加しています。上記リンクから商品をご購入いただくと、運営者に紹介料が支払われる場合があります。