【全コピペOK】AIエージェントに"権限を渡す"設計──Anthropicですら開いていた「閉じているつもり」を自分の環境で塞ぐ実装セット(deny設計・Hooks門番・サンドボックス・検証手順)
📣 メンバーシップ「実践フルアクセス」なら、この記事も読み放題! 月1,000円で、週1の実践有料記事(月4〜5本)+過去の有料記事がすべて読み放題📚 単品¥1,480のこの記事も、「8時間放置」「spec-driven」「二層設計」「監督ワークフロー」「Skills設計キット」「Opus 5棚卸し」も全部込み。
👇 単品で買うより断然お得、入会はこちらから
📖 読了目安:約20分(無料部分は約7分) | 📅 2026年8月2日 | 💴 ¥1,480(公開後72時間は早割 ¥1,280)
Anthropicですら、「閉じているつもりの環境」が開いていました。
7月30日の公表によると、同社の評価環境は プロンプトで「インターネット接続はない」と明示していたのに、設定ミスで実際は接続が生きていた 。しかも Anthropicも評価パートナーも気づいていなかった 。
これを読んだ翌日、私は自分の設定ファイルを開きました。そして 許可リストに、自分のAPIキーが平文で4件 入っているのを見つけました。
他人事ではありませんでした。 この記事は、その日にやった棚卸しを そのまま渡せる実装セット にしたものです。
🎯 この記事で手に入るもの(全部コピペ可能)
「エージェントを速く走らせる設定」は、もう十分に語られました。足りていないのは「事故らせない設計」のほうです。
🧭 権限の評価順とモード早見 :deny/ask/allowはどう効くか、どのモードで何が自動承認されるか
🚫 denyルールの実物 :`.env`・認証情報・Windowsパスまで塞ぐ設定(コピペ可)
🪝 Hooks門番の実装 :危険なコマンドを 物理的にブロック する2系統の書き方
📦 サンドボックスと隔離 :何が守られ、 何が素通りするか (ここを誤解している人が多い)
✅ 【核心】"本当に閉じているか"の検証手順 :Anthropicが持っていなかったのはこれです
🩹 漏れた後の手順 :失効→ローテ→削除→記録の正しい順番
📰 なぜ今か
AIエージェントに 実際に手を動かす権限 を渡す流れは、もう戻りません。問題は、 権限を渡す側の設計が、能力の伸びに追いついていない ことです。
そして数字が出ています。 GitGuardianの調査では、Claude Code支援のコミットにおけるシークレット混入率は3.2% 。公開GitHub全体のベースラインは1.5%なので、 およそ2倍 です。
「AIが危ない」ではなく、「AIに渡す環境の設計が甘いと危ない」 。今週はそれが可視化された週でした。

😱 「うちは大丈夫」が危ない3つの理由
結論:多くの人が"設定した覚えのない場所"に秘密を置いています。私もそうでした。
🔑 ① 許可リストに「コマンド全文」が残る
Claude Codeの許可リストは、承認したコマンドを 文字列としてそのまま記録 します。つまり——
# これを一度「許可」すると…
curl -H 'x-goog-api-key: AIzaSy……' https://…キーごと設定ファイルに転写されます。 私の場合、これが4件溜まっていました。しかもそのファイルはクラウド同期フォルダの中です。
📄 ② セッション記録は平文で保存される
公式ドキュメントにこう書かれています。
Transcripts and history are not encrypted at rest. OS file permissions are the only protection.
(トランスクリプトと履歴は保存時に暗号化されない。OSのファイル権限だけが保護手段)
エージェントが一度 `.env` を読んだら、その中身は履歴に残ります。
🦠 ③ 攻撃側は、もうエージェントを狙っている
2025年8月のNxサプライチェーン攻撃(s1ngularity)では、 postinstallフックがインストール済みのAI CLIを検出し、権限バイパスのフラグ付きで起動 させました。 あなたのエージェントが、攻撃の実行役に使われる という筋書きです。
🙋 なぜ私が書けるのか(+6/14との違い)
結論:昨日、自分の環境で実際に見つけて、実際に塞いだからです。
このブログはClaude Codeを絡めた半自動パイプラインで毎日回しています。だからこそ 「動けばいい」で権限を開けてきた自覚 がありました。
そして本記事は、実装シリーズの続きです。 6/14との違いを先に書いておきます。
🏃 6/14「8時間放置セットアップ」 = 走らせるための設定 (どう自動承認して止まらせないか)
🛡️ 本記事 = 事故らせないための設計 (どこで止めるか、どう隔離するか、どう検証するか)
アクセルの記事とブレーキの記事 、と考えてください。両方あって初めて安心して長時間任せられます。
🥉 6/28「spec-driven」=何を作るか
🏅 7/5「二層設計」=どのモデルに任せるか
🛡️ 7/12「監督ワークフロー」=作らせた後どう検収するか
🧩 7/19「Skills設計キット」=手順を資産化する
🔧 7/26「Opus 5棚卸し」=新モデルに指示を合わせる
🆕 本記事 = 権限と隔離を設計する
🎁 無料で持ち帰れる:3分の棚卸し+最小denyセット
まず 「自分がいま何を許してしまっているか」を3分で確認するコマンド と、 今日すぐ入れられる最小のdeny設定 をお渡しします。
⌨️ 棚卸しコマンド(コピペ可)
# 1) 許可リストに秘密が転写されていないか(最重要)
grep -rE "AIzaSy[A-Za-z0-9_-]{30,}|sk-[A-Za-z0-9]{20,}|ghp_[A-Za-z0-9]{30,}|xox[baprs]-|AKIA[0-9A-Z]{16}" \
~/.claude/settings.json .claude/settings.json .claude/settings.local.json 2>/dev/null
# 2) deny ルールが1つでもあるか
cat ~/.claude/settings.json .claude/settings.local.json 2>/dev/null | grep -c '"deny"'
# 3) セッション記録に秘密が残っていないか
grep -rlE "AIzaSy[A-Za-z0-9_-]{30,}|sk-[A-Za-z0-9]{20,}|AKIA[0-9A-Z]{16}" ~/.claude/projects/ 2>/dev/null | head1つ目でヒットが出たら、その時点でローテーション対象です。 「後で」は効きません。
2つ目が `0` なら、あなたの環境には止める仕組みが1つもありません。 ちなみに私は0でした。
📄 実物:今日入れる最小deny(`~/.claude/settings.json`)
{
"permissions": {
"deny": [
"Read(.env)",
"Read(.env.*)",
"Read(**/credentials*)",
"Read(~/.aws/**)",
"Read(~/.ssh/**)",
"Edit(.env)",
"Bash(rm -rf /*)",
"Bash(git push --force*)"
]
}
}5分で入れられて、事故の大半を潰せます。 ポイントを3つだけ。
📌 `Read(.env)` は gitignore と同じ意味論 で、 どの階層の `.env` にもマッチ します(`Read(**/.env)` と等価)
📌 `Read` のdenyは、同じパスへの `Edit` もブロック します(v2.1.208以降)。ただし `Write` と `NotebookEdit` は対象外 なので、変更を一切させたくないパスには `Edit` のdenyも別途必要です
📌 denyには例外を作れません 。広いdenyは、より狭いallowがあっても勝ちます
⚠️ 重要な限界: このdenyが効くのは Claudeの組み込みファイルツールと、Claude Codeが認識するBashのファイルコマンド(`cat`・`head`・`tail`・`sed` など) までです。 PythonやNodeのスクリプトが自前でファイルを開く場合には効きません 。OSレベルで止めるには、後述のサンドボックスが要ります。
🚑 もし見つかってしまったら(応急処置)
順番だけは間違えないでください。 詳細は第6章に書きますが、最低限これだけは今すぐ。
🛑 失効させる ──まず該当キーを無効化する。新しく作るのは後
🔄 作り直す ──新しいキーを発行し、環境変数など安全な場所に置く
🗑️ 設定から消す ──許可リストの該当行を削除する( バックアップファイルにも残ります )
「Git履歴から消す」を最初にやってはいけません。 消しても、 すでに流出した鍵は生き続けます 。まず殺してください。
🛡️ 再発防止は、実質1行
そもそも許可リストにキーが転写されるのは、 コマンドに直書きしているから です。
# ❌ これを許可すると、キーごと設定ファイルに残る
curl -H 'x-goog-api-key: AIzaSy……' https://…
# ✅ これなら、残るのは変数名だけ
curl -H "x-goog-api-key: $GEMINI_API_KEY" https://…この書き換えだけで、同じ事故は二度と起きません。 私はこれをやっていませんでした。
あわせて `.claude/settings.local.json` を `.gitignore` に入れておく と、うっかり共有する事故も防げます。 クラウド同期フォルダ(OneDriveやDropbox)にプロジェクトを置いている人は、そのファイルが同期対象になっていないかも確認 してください。私はここで冷や汗をかきました。
ここから先は、 この限界をどう埋めるか の話になります。
📖 目次
🔒 ここから先は有料エリアです
無料部分では、 棚卸しコマンドと最小denyセット をお渡ししました。これだけでも今日から効きます。
ただ、無料パートの最後に書いた通り、 denyには効かない範囲があります 。そこを埋めないと「設定した気になっているだけ」で終わります。この先は——
🧭 評価順と優先順位の正確な仕様 + モード別の自動承認一覧 (`acceptEdits` が `rm` まで通す話)
🚫 Windowsパス・アンカー記法まで含むdeny実物 (`//c/**/.env` を知らないと穴が残ります)
🪝 Hooks門番の2系統 (exit 2 と JSON)と、 セキュリティ制御にしてはいけない書き方
📦 サンドボックスの正体 : 既定オフ・フェイルオープン・MCPとフックは素通り
✅ 【核心】陰性コントロール付きの検証スクリプト ──Anthropicに欠けていたのはこれです
🩹 漏えい時の正しい順番 と `--fail` を忘れると機能しないCIゲート
を、 全部コピペできる形 でお渡しします。
💡 単品¥1,480ですが、メンバーシップ(月1,000円)なら本記事+実装シリーズ全部が読み放題。 通しで実践するなら、メンバーが断然お得です。
1. 権限設計の3原則(評価順・優先順位・モード)
ここから先は
ここまで読んでいただきありがとうございます! 記事が少しでもお役に立てたなら、応援チップをいただけると跳ねて喜びます🙌 いただいたチップは、AIツールの検証費・API利用料・新しい記事の取材にそのまま使わせていただきます。 無理のない範囲で、気持ちだけでも嬉しいです✨
