見出し画像

【全コピペ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 | head

1つ目でヒットが出たら、その時点でローテーション対象です。 「後で」は効きません。

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章に書きますが、最低限これだけは今すぐ。

  1. 🛑 失効させる ──まず該当キーを無効化する。新しく作るのは後

  2. 🔄 作り直す ──新しいキーを発行し、環境変数など安全な場所に置く

  3. 🗑️ 設定から消す ──許可リストの該当行を削除する( バックアップファイルにも残ります

「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原則(評価順・優先順位・モード)

ここから先は

9,953字 / 5画像
この記事のみ ¥ 1,480

最新AIを「技術的に正しく、でも読みやすく」翻訳して毎日お届けするメンバーシップです。 Claude…

実践フルアクセス

¥1,000 / 月
1ヶ月無料

ここまで読んでいただきありがとうございます! 記事が少しでもお役に立てたなら、応援チップをいただけると跳ねて喜びます🙌 いただいたチップは、AIツールの検証費・API利用料・新しい記事の取材にそのまま使わせていただきます。 無理のない範囲で、気持ちだけでも嬉しいです✨