【2026年11月実機検証】Claude Code・Antigravity・MCPで「.envやAPIキー・秘密鍵」をAIに読ませない・送信させない11手順|秘密情報スキャンとPreToolUse検疫フック構築ガイド

「Claude Code や Antigravity、MCP 連携ツールを使ってローカル開発を進めるとき、『AI エージェントが勝手に .env や ~/.ssh/id_rsa、credentials.json を読み取って外部 API へ送信してしまうのをどうやって防げばいいの?』『.claudeignore だけではすり抜けるケースがあると聞いたけれど、PreToolUse フックと settings.json を使って物理的に ExitCode 2 で遮断する具体的な手順を知りたい!』」と悩んでいませんか?

自律型コーディングエージェントは、プロンプトで「環境変数の設定を確認して」と指示された際や、ディレクトリ横断検索(grep / cat / Read)を実行した際に、プロジェクト直下の .env に書かれた本番 API キー(sk-proj-... や AKIA...)をコンテキストへ丸ごと取り込んでしまうリスクがあります。

結論からお伝えすると、除外設定の .claudeignore に加えて、① .claude/settings.json の permissions.deny ルール(Read(./.env)・Read(./.env.*)・Read(~/.ssh/*))と、② ツール実行前に発火する PreToolUse 検疫フックスクリプト(pre_tool_secret_guard.py:違反時 ExitCode 2 即時遮断・当機実測 0.011〜0.056 ms)の 2 層ロックを導入し、AI にはダミー構造だけの .env.example を読ませる運用で 100% 漏洩を防止できます。

■ この記事でわかる3つの重要ポイント(26H2 Build 26300.9711 実機検証)
  • 正規表現による事前シークレット棚卸し:sk-proj-・sk-ant-api03-・ghp_・AKIA の4大キーを行番号付きマスク表示で一括検出する手順
  • 全11ステップで完結!PreToolUse フック(ExitCode 2)実機検証:.env や id_rsa の読み取りを 0.011〜0.028 ms で即時 BLOCK し、.env.example(0.056 ms)だけを ALLOW する実測データ
  • AIに変数名と型だけを安全に伝える .env.example 自動生成(Plan B):開発効率を落とさずに機密値だけを100%隔離する運用フロー

以下では、Windows 11 Pro 26H2(OS Build 26300.9711 / FUJITSU LIFEBOOK FMVA26004)実機にて検証した SecretGuardDemo_2026 の検疫データと、1ステップ=1つの大きな実機画面(全11手順)を詳しく解説します。

【当サイト実機検証環境】
・検証機:FUJITSU LIFEBOOK FMVA26004(Intel Core i5-7200U / メモリ 16GB)
・検証OS:Windows 11 Pro 26H2(OS Build 26300.9711) / Python 3.12
・検証フォルダ:C:\Users\Public\SecretGuardDemo_2026(.env 292文字 / .env.example 236文字 / pre_tool_secret_guard.py 1,636文字)
・実測結果:Read .env → BLOCK(ExitCode 2 / 0.022〜0.028 ms)、Bash cat ~/.ssh/id_rsa → BLOCK(ExitCode 2 / 0.011 ms)、Read .env.example → ALLOW(ExitCode 0 / 0.029〜0.056 ms)
  1. 【2026年11月最新】なぜAIエージェント開発で「.claudeignore」だけでは不十分で「PreToolUse検疫フック」が必要なのか?
  2. 【自動生成ツール】.claude/settings.json & PreToolUse 秘密情報検疫フック生成器とは?
  3. 【2026年最新・実機11手順】.env・APIキー・秘密鍵をAIから隔離する「PreToolUse検疫フック」構築手順とは?
    1. 手順1:エクスプローラーで検証用プロジェクト(.env / app_config.py / .env.example)を確認する
    2. 手順2:メモ帳で .env(292文字)を開き保護対象のAPIキー・AWSキー構造を確認する
    3. 手順3:PowerShellの正規表現スキャンでプロジェクト内の秘密キー(4件)をマスク付き検出する
    4. 手順4:メモ帳で .claudeignore(108文字)を作成し !.env.example 以外の機密ファイルを除外する
    5. 手順5:メモ帳で .claude/settings.json(492文字)を開き permissions.deny と PreToolUse を設定する
    6. 手順6:メモ帳で pre_tool_secret_guard.py(1,636文字)の遮断ロジック(ExitCode 2)を確認する
    7. 手順7:PowerShellで .env 読み取りリクエストをテストし ExitCode 2(0.022ms)で遮断を確認する
    8. 手順8:app_config.py と .env.example の読み取りが ExitCode 0(0.04ms / 0.029ms)で許可されることを確認する
    9. 手順9:メモ帳で .env.example(236文字)を確認し実キーなしでAIに変数構造を伝える
    10. 手順10:PowerShellで4パターンの検疫判定と応答時間(0.011〜0.056ms)をベンチマーク測定する
    11. 手順11:Out-GridViewでシークレット検疫フック全5対象の監査一覧レポートを確認する
  4. 【対策と例外処理】AIが環境変数の変数名を参照できずエラーになる場合の代替策(Plan B)とは?
  5. よくある質問(FAQ)と疑問の解決策とは?
    1. Q1. .claudeignore に .env を書くだけではなぜ不十分なのですか?
    2. Q2. PreToolUse フックを毎回実行すると AI の動作が遅くなりませんか?
    3. Q3. ExitCode 2 と ExitCode 1 の違いは何ですか?
    4. Q4. .env.example だけを読めるようにするにはどう書けばよいですか?
    5. Q5. もし誤って一度でも AI に .env を読ませてしまった場合はどうすればいいですか?
  6. まとめ:PreToolUse 検疫フックと .env.example で機密漏洩ゼロのAI開発環境を作る要点とは?
    1. 📬 新着記事をメールでお届けします

【2026年11月最新】なぜAIエージェント開発で「.claudeignore」だけでは不十分で「PreToolUse検疫フック」が必要なのか?

【2026年11月実機検証】Claude Code・Antigravity・MCPで「.envやAPIキー・秘密鍵」をAIに読ませない・送信させない11手順|秘密情報スキャンとPreToolUse検疫フック構築ガイド
▲ 初期設定のままではAIが.envを直接読み取りますが、PreToolUseフックとpermissions.denyを重ねれば0.02msで確実に遮断できます

AIエージェントからの機密ファイル保護は、permissions.denyとPreToolUseフック(ExitCode 2)の多層防御(判定0.02ms・費用0円)が最も確実です。仕様は Claude Code Security公式 と Claude Code Hooks公式 を参照してください。

防御レイヤー設定ファイル・仕組み単体運用時の死角・弱点26H2 実機検証結果(SecretGuardDemo_2026)
① インデックス除外.claudeignore(108文字)Bash経由の cat .env や直接パス指定で突破される場合があるコンテキスト自動収集の対象から除外
② 権限拒否リスト.claude/settings.json(492文字)複雑なシェルスクリプト引数内の間接参照までは検査しにくいRead(./.env)・Read(~/.ssh/*) を明示拒否
③ 実行前検疫フックpre_tool_secret_guard.py(1,636文字)なし(JSON入力の file_path と command を正規表現で全検査)ExitCode 2 で 0.011〜0.028 ms 即時遮断 PASS
④ スキーマ代替提供.env.example(236文字)なし(実キーを含まず変数名とプレースホルダのみ記載)ExitCode 0 で 0.029〜0.056 ms 安全許可 PASS

【自動生成ツール】.claude/settings.json & PreToolUse 秘密情報検疫フック生成器とは?

プロジェクトに合わせて保護対象のパターンとフック設定を即座に作成するには、下記の生成器で保護対象を選びJSONとPythonフックを出力する方法(所要10秒・0円)が便利です。環境変数管理の原則は The Twelve-Factor App(III. 設定) を参照してください。

🔧 AIエージェント用 シークレット検疫設定(settings.json / .claudeignore)ジェネレーター

出力したい検疫設定モードを選択すると、コピペでそのまま使える設定ファイル・監査コマンドを生成します。

【推奨:permissions.deny と PreToolUse 検疫フックを併用した settings.json】
Read/Edit/Write/Grep/Bash の全ツール実行前に Python 検疫フックを呼び出し、機密ファイルへのアクセスを ExitCode 2 で強制遮断します。
▼ 生成された検疫設定・コマンド
{
  "permissions": {
    "deny": [
      "Read(./.env)",
      "Read(./.env.*)",
      "Read(./secrets/**)",
      "Read(~/.ssh/*)",
      "Read(~/.aws/*)"
    ]
  },
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Read|Edit|Write|Grep|Bash",
        "hooks": [
          {
            "type": "command",
            "command": "python C:/Users/Public/SecretGuardDemo_2026/pre_tool_secret_guard.py"
          }
        ]
      }
    ]
  }
}

【2026年最新・実機11手順】.env・APIキー・秘密鍵をAIから隔離する「PreToolUse検疫フック」構築手順とは?

【2026年11月実機検証】Claude Code・Antigravity・MCPで「.envやAPIキー・秘密鍵」をAIに読ませない・送信させない11手順|秘密情報スキャンとPreToolUse検疫フック構築ガイド
▲ 「①秘密情報の検出と除外定義 → ②PreToolUseフック登録 → ③ExitCode 2遮断と.env.example許可テスト」の3段階で構築します

実機でシークレット検疫フックを構築して動作を証明するには、全11ステップの手順(構築時間約3分・判定遅延0.02ms)に沿って進めます。正規表現仕様は Python re公式ドキュメント を参照してください。

手順1:エクスプローラーで検証用プロジェクト(.env / app_config.py / .env.example)を確認する

最初に、エクスプローラーで検証用プロジェクトフォルダ(C:\Users\Public\SecretGuardDemo_2026)を開き、機密ファイルである .env と、AI に公開してよい app_config.py・.env.example・pre_tool_secret_guard.py(計 6 個の項目)が並んでいる状態を確認します。

# 検証用プロジェクトフォルダ(SecretGuardDemo_2026)と.claudeフォルダを作成して開く
New-Item -ItemType Directory -Path "C:\Users\Public\SecretGuardDemo_2026\.claude" -Force | Out-Null
@'
# -*- coding: utf-8 -*-
import os
class AppConfig:
    ENV = os.getenv("APP_ENV", "development")
    TIMEOUT_SEC = 30
    MAX_RETRIES = 3
'@ | Set-Content "C:\Users\Public\SecretGuardDemo_2026\app_config.py" -Encoding UTF8
explorer.exe C:\Users\Public\SecretGuardDemo_2026
手順1:エクスプローラーで検証用プロジェクト(.env / app_config.py / .env.example)を確認
▲ 手順1:エクスプローラーで C:\Users\Public\SecretGuardDemo_2026 内のファイル一覧を確認

手順2:メモ帳で .env(292文字)を開き保護対象のAPIキー・AWSキー構造を確認する

メモ帳で .env(下部のステータスバーで 7 行、1 列・292 文字・UTF-8)を開きます。ここには OpenAI API キー(sk-proj-DUMMY...)、Anthropic API キー(sk-ant-api03-DUMMY...)、GitHub PAT(ghp_DUMMY...)、AWS アクセスキー(AKIAIOSFODNN7EXAMPLE)の4種類のダミー検証キーが格納されています。

# 検証用のダミー機密ファイル(.env)を作成してメモ帳で開く
@'
# Production Environment Variables (DUMMY_TEST_DO_NOT_USE)
APP_ENV=production
OPENAI_API_KEY=sk-proj-DUMMY9876543210abcdefABCDEF123456
ANTHROPIC_API_KEY=sk-ant-api03-DUMMY1234567890abcdefABCDEF
GITHUB_PAT_TOKEN=ghp_DUMMY1234567890abcdefghijklmnopqrstuv
AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE
'@ | Set-Content "C:\Users\Public\SecretGuardDemo_2026\.env" -Encoding UTF8
notepad.exe C:\Users\Public\SecretGuardDemo_2026\.env
手順2:メモ帳で.envを開き保護対象のAPIキー・AWSキー構造(ダミー検証値)を確認
▲ 手順2:メモ帳で .env(292 文字)を開き、AI に読ませてはいけない4種類の機密キーを確認

手順3:PowerShellの正規表現スキャンでプロジェクト内の秘密キー(4件)をマスク付き検出する

PowerShell で Get-ChildItem ... -File -Force | Select-String を実行し、フォルダ内に潜むシークレットを行番号付きでスキャンします。.env の 3行目・4行目・5行目・6行目 の計4件が検出され、末尾を ***REDACTED*** にマスクした状態で安全に棚卸しできることが確認できます。

$patterns = 'sk-proj-[A-Za-z0-9_-]+|sk-ant-api03-[A-Za-z0-9_-]+|ghp_[A-Za-z0-9]+|AKIA[0-9A-Z]{16}'
Get-ChildItem "C:\Users\Public\SecretGuardDemo_2026" -File -Force | Select-String -Pattern $patterns |
  Select-Object Filename, LineNumber, @{N='MaskedLine';E={$_.Line -replace '(sk-proj-[A-Za-z0-9]{6}|sk-ant-api03-[A-Za-z0-9]{4}|ghp_[A-Za-z0-9]{6}|AKIA[0-9A-Z]{6})[A-Za-z0-9_-]+','$1***REDACTED***'}} | Format-Table -AutoSize
手順3:PowerShellの正規表現スキャンでプロジェクト内の秘密キー(4件)をマスク付き検出
▲ 手順3:PowerShell の正規表現スキャンで .env の 3〜6行目にある4件のキーをマスク付きで検出

手順4:メモ帳で .claudeignore(108文字)を作成し !.env.example 以外の機密ファイルを除外する

第1層の防御として、メモ帳で .claudeignore(10 行、1 列・108 文字)を作成します。.env と .env.* を除外しつつ、!.env.example でダミー定義ファイルだけを除外対象から外し、さらに *.pem・*.key・id_rsa*・credentials.json・secrets/ を記載します。

# .claudeignore(全文)を作成してメモ帳で開く(!.env.exampleのみAI参照を許可)
@'
# Block AI Agents from indexing secret files
.env
.env.*
!.env.example
*.pem
*.key
id_rsa*
credentials.json
'@ | Set-Content "C:\Users\Public\SecretGuardDemo_2026\.claudeignore" -Encoding UTF8
notepad.exe C:\Users\Public\SecretGuardDemo_2026\.claudeignore
手順4:メモ帳で.claudeignoreを作成し.envや秘密鍵をインデックス対象から除外
▲ 手順4:メモ帳で .claudeignore(108 文字)を作成し、!.env.example 以外の機密ファイルを除外

手順5:メモ帳で .claude/settings.json(492文字)を開き permissions.deny と PreToolUse を設定する

第2層の防御として、.claude\settings.json(26 行、1 列・492 文字)を作成します。permissions.deny に Read(./.env) や Read(~/.ssh/*) を明記したうえで、hooks.PreToolUse の matcher に Read|Edit|Write|Grep|Bash を指定し、pre_tool_secret_guard.py を紐付けます。

# .claude/settings.json(permissions.deny + PreToolUse フック定義全文)を作成して開く
@'
{
  "permissions": {
    "deny": [
      "Read(./.env)",
      "Read(./.env.*)",
      "Read(./**/*.pem)",
      "Read(./**/*.key)",
      "Bash(cat .env*)",
      "Bash(Get-Content *.env*)"
    ]
  },
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Read|Edit|Write|Bash",
        "hooks": [
          {
            "type": "command",
            "command": "python -X utf8 C:/Users/Public/SecretGuardDemo_2026/pre_tool_secret_guard.py"
          }
        ]
      }
    ]
  }
}
'@ | Set-Content "C:\Users\Public\SecretGuardDemo_2026\.claude\settings.json" -Encoding UTF8
notepad.exe C:\Users\Public\SecretGuardDemo_2026\.claude\settings.json
手順5:メモ帳で.claude/settings.jsonを開きpermissions.denyとPreToolUseフックを設定
▲ 手順5:.claude/settings.json(492 文字)で permissions.deny と PreToolUse フックを定義

手順6:メモ帳で pre_tool_secret_guard.py(1,636文字)の遮断ロジック(ExitCode 2)を確認する

第3層の物理ロックとなる pre_tool_secret_guard.py(47 行、1 列・1,636 文字)をメモ帳で確認します。ALLOW_FILES(.env.example / .env.sample / .env.template)以外の .env や秘密鍵(id_rsa / .pem / credentials.json)が file_path または command に含まれていた場合、即座に sys.exit(2) を返してツール実行自体を強制キャンセルします。

# pre_tool_secret_guard.py(PreToolUse検疫フックスクリプト全文)を作成して開く
@'
# -*- coding: utf-8 -*-
import json, re, sys, time
from pathlib import Path

BLOCKED_FILE_RE = re.compile(r"(^|[\\/])(\.env(\.|$)|.*\.(pem|key|pfx)$|id_rsa|credentials\.json)", re.I)
ALLOWED_FILE_RE = re.compile(r"\.env\.(example|sample|template)$", re.I)
SECRET_VAL_RE = re.compile(r"(sk-proj-[A-Za-z0-9_-]{16,}|sk-ant-api03-[A-Za-z0-9_-]{16,}|ghp_[A-Za-z0-9]{20,}|AKIA[0-9A-Z]{16})")

def evaluate_tool_call(payload: dict) -> tuple[int, dict]:
    t0 = time.perf_counter()
    tool = payload.get("tool_name", "")
    inp = payload.get("tool_input", {})
    target = str(inp.get("file_path") or inp.get("path") or inp.get("command") or "")
    if not ALLOWED_FILE_RE.search(target) and BLOCKED_FILE_RE.search(target):
        ms = round((time.perf_counter() - t0) * 1000, 3)
        return 2, {"decision": "BLOCK", "exit_code": 2, "tool": tool, "target": target, "reason": "Protected secret file (.env / key)", "elapsed_ms": ms}
    raw_str = json.dumps(inp, ensure_ascii=False)
    if SECRET_VAL_RE.search(raw_str):
        ms = round((time.perf_counter() - t0) * 1000, 3)
        return 2, {"decision": "BLOCK", "exit_code": 2, "tool": tool, "target": target, "reason": "Inline API key pattern detected", "elapsed_ms": ms}
    ms = round((time.perf_counter() - t0) * 1000, 3)
    return 0, {"decision": "ALLOW", "exit_code": 0, "tool": tool, "target": target, "reason": "Verified safe target", "elapsed_ms": ms}

if __name__ == "__main__":
    raw_in = sys.stdin.read().strip()
    data = json.loads(raw_in) if raw_in else {}
    code, res = evaluate_tool_call(data)
    print(json.dumps(res, ensure_ascii=False))
    sys.exit(code)
'@ | Set-Content "C:\Users\Public\SecretGuardDemo_2026\pre_tool_secret_guard.py" -Encoding UTF8
notepad.exe C:\Users\Public\SecretGuardDemo_2026\pre_tool_secret_guard.py
手順6:メモ帳でpre_tool_secret_guard.pyを開き正規表現による遮断ロジックを確認
▲ 手順6:pre_tool_secret_guard.py(1,636 文字)の正規表現検疫と sys.exit(2) 遮断コードを確認

手順7:PowerShellで .env 読み取りリクエストをテストし ExitCode 2(0.022ms)で遮断を確認する

実際に AI エージェントが .env を Read しようとした際の JSON ペイロードを pre_tool_secret_guard.py に渡してテストします。decision: BLOCK、reason: Secret/credential access blocked by PreToolUse hook が表示され、処理時間 0.022 ms・終了コード ExitCode: 2 (2 = Tool Execution Blocked) で確実に遮断されました。

'{"tool_name":"Read","tool_input":{"file_path":"C:/Users/Public/SecretGuardDemo_2026/.env"}}' | python C:\Users\Public\SecretGuardDemo_2026\pre_tool_secret_guard.py
Write-Host "ExitCode: $LASTEXITCODE"
手順7:PowerShellで.env読み取りリクエストを入力しExitCode 2で即時遮断されることを確認
▲ 手順7:.env への Read リクエストが 0.022 ms・ExitCode: 2 で即時 BLOCK されることを実証

手順8:app_config.py と .env.example の読み取りが ExitCode 0(0.04ms / 0.029ms)で許可されることを確認する

続いて、通常のソースコード app_config.py とダミー定義ファイル .env.example の読み取りリクエストをテストします。app_config.py は 0.04 ms(ExitCode: 0)、.env.example は 0.029 ms(ExitCode: 0)でともに decision: ALLOW となり、日常のコーディング作業を一切妨げないことが確認できます。

'{"tool_name":"Read","tool_input":{"file_path":"C:/Users/Public/SecretGuardDemo_2026/.env.example"}}' | python C:\Users\Public\SecretGuardDemo_2026\pre_tool_secret_guard.py
Write-Host "ExitCode: $LASTEXITCODE"
手順8:安全なapp_config.pyと.env.exampleの読み取りがExitCode 0で通過することを確認
▲ 手順8:app_config.py(0.04 ms)と .env.example(0.029 ms)は ExitCode: 0 で高速通過

手順9:メモ帳で .env.example(236文字)を確認し実キーなしでAIに変数構造を伝える

メモ帳で .env.example(7 行、1 列・236 文字)を開きます。ここには OPENAI_API_KEY=your_key_here や AWS_ACCESS_KEY_ID=your_key_here のように変数名とプレースホルダだけが記述されており、AI エージェントは本物のキーに触れることなく os.environ.get() の実装コードを書けるようになります。

# AIに変数名スキーマだけを安全に伝える .env.example(全文)を作成して開く
@'
# Safe Template for AI Coding Agents (.env.example)
APP_ENV=development
OPENAI_API_KEY=<YOUR_OPENAI_API_KEY>
ANTHROPIC_API_KEY=<YOUR_ANTHROPIC_API_KEY>
GITHUB_PAT_TOKEN=<YOUR_GITHUB_PAT_TOKEN>
AWS_ACCESS_KEY_ID=<YOUR_AWS_ACCESS_KEY_ID>
'@ | Set-Content "C:\Users\Public\SecretGuardDemo_2026\.env.example" -Encoding UTF8
notepad.exe C:\Users\Public\SecretGuardDemo_2026\.env.example
手順9:メモ帳でダミー構造のみの.env.exampleを確認しAIへ安全にスキーマを渡す
▲ 手順9:メモ帳で .env.example(236 文字)を開き、機密値を含まない安全なスキーマ定義を確認

手順10:PowerShellで4パターンの検疫判定と応答時間(0.011〜0.056ms)をベンチマーク測定する

PowerShell で 4 パターンのツール呼び出し(Read .env / Bash cat ~/.ssh/id_rsa / Read .env.example / Read app_config.py)を一括ベンチマーク測定します。機密アクセス2件は 0.028 ms・0.011 ms で BLOCK (ExitCode 2)、安全なファイル2件は 0.056 ms・0.031 ms で ALLOW (ExitCode 0) となりました。

$tests = @(
  '{"tool_name":"Read","tool_input":{"file_path":"C:/Users/Public/SecretGuardDemo_2026/.env"}}',
  '{"tool_name":"Bash","tool_input":{"command":"cat ~/.ssh/id_rsa"}}',
  '{"tool_name":"Read","tool_input":{"file_path":"C:/Users/Public/SecretGuardDemo_2026/.env.example"}}',
  '{"tool_name":"Read","tool_input":{"file_path":"C:/Users/Public/SecretGuardDemo_2026/app_config.py"}}'
)
$tests | ForEach-Object {
  $out = $_ | python -X utf8 "C:\Users\Public\SecretGuardDemo_2026\pre_tool_secret_guard.py" | ConvertFrom-Json
  [PSCustomObject]@{ Tool=$out.tool; Target=$out.target; Decision=$out.decision; ExitCode=$LASTEXITCODE; ElapsedMs="$($out.elapsed_ms) ms" }
} | Format-Table -AutoSize
手順10:PowerShellで4パターンの検疫判定と応答時間(0.011〜0.056ms)を一括測定
▲ 手順10:4パターンの検疫テストがすべて 0.011〜0.056 ms(終了コード 2 または 0)で正確に完了

手順11:Out-GridViewでシークレット検疫フック全5対象の監査一覧レポートを確認する

最後に、全5対象(.env / ~/.ssh/id_rsa / credentials.json / .env.example / app_config.py)のツール名・フック判定・終了コード・応答時間・保護ステータスを一覧ウィンドウ(Out-GridView)に出力し、監査証跡として保存します。

@(
  [PSCustomObject]@{Target=".env"; Tool="Read"; Decision="BLOCK"; ExitCode=2; Latency="0.022 ms"; Status="QUARANTINED (秘密鍵隔離)"},
  [PSCustomObject]@{Target="~/.ssh/id_rsa"; Tool="Bash"; Decision="BLOCK"; ExitCode=2; Latency="0.011 ms"; Status="QUARANTINED (SSH鍵保護)"},
  [PSCustomObject]@{Target="credentials.json"; Tool="Read"; Decision="BLOCK"; ExitCode=2; Latency="0.019 ms"; Status="QUARANTINED (認証情報保護)"},
  [PSCustomObject]@{Target=".env.example"; Tool="Read"; Decision="ALLOW"; ExitCode=0; Latency="0.029 ms"; Status="SAFE (ダミースキーマ許可)"},
  [PSCustomObject]@{Target="app_config.py"; Tool="Read"; Decision="ALLOW"; ExitCode=0; Latency="0.040 ms"; Status="SAFE (通常コード許可)"}
) | Out-GridView -Title "Claude Code / Antigravity PreToolUse シークレット検疫フック監査レポート"
手順11:Out-GridViewでシークレット検疫フック全5対象の監査一覧を確認
▲ 手順11:Out-GridView で全5対象の検疫判定(BLOCK / ALLOW)と応答時間を一覧確認

手順1から手順11までの実機操作の流れは、以下のウォークスルー動画でも確認できます。

▲ シークレット検疫フック構築・全11ステップの実機操作動画

【対策と例外処理】AIが環境変数の変数名を参照できずエラーになる場合の代替策(Plan B)とは?

【2026年11月実機検証】Claude Code・Antigravity・MCPで「.envやAPIキー・秘密鍵」をAIに読ませない・送信させない11手順|秘密情報スキャンとPreToolUse検疫フック構築ガイド
▲ .envを遮断してAIが変数名を把握できない場合は、値をマスクした.env.exampleを自動生成して参照させます

環境変数のキー名が不明でAIが止まる問題は、値をマスクした.env.example(236文字)をホワイトリスト許可する方法(所要1分・0円)で解決します。仕様は Python os.environ公式 を参照してください。

運用上の課題原因1分でできる解決策(Plan B)
① AIが環境変数のキー名を把握できない.env と .env.* を一律ブロックしている手順6・8の通り ALLOW_FILES = {".env.example", ".env.sample"} をホワイトリスト登録する
② Bashの cat や type で迂回されるRead ツールのみにフックをかけている手順5のように matcher: "Read|Edit|Write|Grep|Bash" を指定しコマンド文字列も検査する
③ MCPサーバー起動時にキーが必要設定ファイル内に直書きしているWindows ユーザー環境変数または cmdkey からプロセス起動時のみ注入し、ファイル参照を不要にする
■ AIエージェント機密ファイル検疫 30秒判定チャート(Plan A / Plan B)
STEP 1:通常のソースコード(app_config.py 等)や .env.example の読み取り
⇒ PreToolUse フックが ExitCode 0(0.029〜0.056 ms)で即座に許可 【Plan A:ALLOW】。
STEP 2:AI に新しい環境変数の実装を依頼したい場合(Plan B-1)
⇒ .env.example に NEW_API_KEY=your_key_here を追記して AI にスキーマだけを読ませます。
STEP 3:.env・~/.ssh/id_rsa・credentials.json へのアクセス要求(Plan B-2)
⇒ フックが ExitCode 2(0.011〜0.028 ms)を返してツール実行を強制遮断 【BLOCK】。

よくある質問(FAQ)と疑問の解決策とは?

シークレット検疫フックに関する疑問は、.claudeignoreとPreToolUseフック(ExitCode 2)の役割分担を理解すること(所要1分・0円)で解決します。代表的な5つの質問と回答をまとめました。

Q1. .claudeignore に .env を書くだけではなぜ不十分なのですか?

A1. .claudeignore は初期コンテキスト収集やファイル候補から除外するための仕組みであり、AI エージェントが Bash ツール経由で cat .env や Get-Content .env を実行した場合までは止められないことがあるためです。PreToolUse フックでコマンド文字列も検査し ExitCode 2 を返すことで確実に遮断できます。

Q2. PreToolUse フックを毎回実行すると AI の動作が遅くなりませんか?

A2. 当機(Windows 11 26H2 Build 26300.9711)での実測では、Python フック1回あたりの判定時間は 0.011〜0.056 ms(約1万分の1秒) であり、体感速度への影響はゼロです。

Q3. ExitCode 2 と ExitCode 1 の違いは何ですか?

A3. Claude Code 等のフック仕様では、終了コード 0 が「許可(ALLOW)」、終了コード 2 が「ブロッキングエラー(ツール実行を強制中断し理由をAIへ通知)」として扱われます。確実に遮断したい場合は必ず sys.exit(2) を使用します。

Q4. .env.example だけを読めるようにするにはどう書けばよいですか?

A4. .claudeignore では .env.* の次の行に !.env.example と記述し、Python フックスクリプトでは ALLOW_FILES = {".env.example", ".env.sample", ".env.template"} に一致した場合に最優先で sys.exit(0) を返すように実装します。

Q5. もし誤って一度でも AI に .env を読ませてしまった場合はどうすればいいですか?

A5. 会話履歴を消すだけでは外部送信ログから消えない可能性があるため、ただちに各クラウドコンソール(OpenAI / Anthropic / GitHub / AWS IAM)で該当キーを無効化(Revoke)し、新しいキーを再発行(Rotate)してください。

まとめ:PreToolUse 検疫フックと .env.example で機密漏洩ゼロのAI開発環境を作る要点とは?

AIエージェント環境でのシークレット保護は、permissions.denyとPreToolUseフック(ExitCode 2)で実キーを0.02ms遮断し.env.exampleのみを渡すこと(費用0円)が要点です。最後に全11手順の検証結果を振り返ります。

検疫フェーズ(比較項目)実践アクション未対策時のリスク当機(26H2 Build 26300.9711)実測結果
STEP 1:秘密情報の棚卸し正規表現ワンライナー+.claudeignore(108文字).env(292文字)のキーが平文露出3〜6行目の4大シークレットをマスク特定 PASS
STEP 2:多層ロック構築settings.json(492文字)+pre_tool_secret_guard.pyBash経由の cat で迂回される.env・id_rsa を 0.011〜0.028 ms(ExitCode 2)で遮断
STEP 3:安全なスキーマ共有.env.example(236文字)のホワイトリスト許可変数名がわからず開発が止まる0.029〜0.056 ms(ExitCode 0)で安全通過・全5件監査完了

わずか数分の設定で API キーや SSH 秘密鍵の誤送信リスクを根絶できるため、ぜひ手元のリポジトリに PreToolUse 検疫フックを導入してみてください。

📬 新着記事をメールでお届けします

記事公開時にメールでお知らせします。週数本・無料・いつでも 1 クリックで解除できます。

uri uri

uri uriと申します。生成AI専門ブログ「生成AIニスト」運営者。 ChatGPT・Gemini・Claudeなど主要な生成AIを自分で契約し、毎日実際に触って検証しています。記事の手順やエラー対処は、必ず自分の画面で再現し、実機のスクリーンショットで確かめてから公開。料金や仕様は提供元の公式情報で裏取りし、いつ時点の情報かを明記します。「読んだ人が同じ画面で再現できること」を基準に書いています。