Secret Redactor:Claude Code シークレットのマスクでプロンプトとツール出力を守る
API キー、メール、公開 IP をモデルに見せる前にプレースホルダーへ置き換え、ツール実行時に元の値へ戻します。
権限
- ツール呼び出しを傍受Claude が行うすべてのツール呼び出しを参照でき(tool.call / tool.check)、ブロックや変更も可能です。
- プロンプトを読み取る入力内容と会話のトランスクリプトを参照できます(prompt.* / session.append / session.messages)。
- UI を変更Claude Code の画面に描画します。バンド、ペイン、ステータス表示、トーストなど(ui.render / $.ui.*)。
- 検証バージョン
- v2.1.291
- 最終検証日
- 必要バージョン
- Claude Code ≥ 2.1.287
- 表示先
- トースト
Claude Code 内でインストール:
/plugin install secret-redactor --marketplace ray-amjad/awesome-claude-code-function-hooksこのModでできること
Secret Redactor は、Claude Code シークレットのマスクを行うコミュニティ製 Mod です。作者は Ray Amjad(ray-amjad)で、彼の awesome-claude-code-function-hooks コレクションに含まれています。対象は 3 つの経路で、あなたが入力する内容、ツールが読み返す内容、最初のメッセージに付くコンテキストブロックです。シークレット、メールアドレス、公開 IP アドレスは、モデルに見える前に [REDACTED-SECRET-164d0c98] のようなプレースホルダーに置き換えられます。
値が消えるわけではありません。同じ値には常に同じプレースホルダーが付くので、Claude は顧客やキーの違いを区別できます。Claude がその後ツールを呼ぶと、hook がプレースホルダーを元に戻すため、Bash コマンドや Write には本物の値が渡ります。cat .env で Claude にはプレースホルダーが見え、それを使った後続のコマンドもそのまま動きます。
隠す対象は、ベンダー固有の形式のキー(sk-ant-、ghp_、AKIA、sk_live_、JWT、Slack と Discord の webhook、秘密鍵ブロック、接続文字列内のパスワード)、エントロピーの高いトークン、メールアドレス、IP アドレスです。127.x、10.x、192.168.x などのプライベート IP は、既定では見えたままです。price_ や prod_ のような Stripe のオブジェクト ID は公開情報として扱われます。作者の README によると、関数 hooks を有効にする必要があるため、何も起きないように見えたらまずそこを確認してください。
デモ
録画では、小さなデモプロジェクトで関数 hooks を有効にし、この Mod を読み込んだ Claude Code を起動します。作者の test/fixtures/sample.env にあるサンプルキー(本物の認証情報ではありません)とサンプルのメールアドレスを含むプロンプトを入力して Enter を押します。送信後のプロンプトは、記録上 KEY=[REDACTED-SECRET-164d0c98] mail [REDACTED-EMAIL-6f096ff7] となり、フッター右側に secret-redactor: hid 2 value(s) from the prompt というトーストが出ます。クリップは Claude がまだ作業中のところで終わり、返答は録画していません。
インストール
インストールブロックのどの方法でも構いません。いずれも作者自身のマーケットプレイスから直接インストールします。その後、関数 hooks を有効にします。~/.claude/settings.json に "env": { "CLAUDE_CODE_ENABLE_FUNCTION_HOOKS": "1" } を追加するか、CLAUDE_CODE_ENABLE_FUNCTION_HOOKS=1 claude でセッションを起動します。インストールせずに試すには、リポジトリをクローンして claude --plugin-dir ./awesome-claude-code-function-hooks/plugins/secret-redactor を実行します。
$ install secret-redactor
Claude Code 2.1.287 以上が必要
作者のマーケットプレイスからインストール: ray-amjad/awesome-claude-code-function-hooks
1.Claude Code 内で1行
/plugin install secret-redactor --marketplace ray-amjad/awesome-claude-code-function-hooks実行中のセッション(v2.1.275 以降)に貼り付けます。最初に Claude Code がマーケットプレイスの追加を確認します。
2.シェルから
claude plugin marketplace add ray-amjad/awesome-claude-code-function-hooks claude plugin install secret-redactor@awesome-claude-code-function-hooksその後、すでに開いているセッションでは /reload-plugins を実行してください。
3.インストールせずに試す
git clone https://github.com/ray-amjad/awesome-claude-code-function-hooks claude --plugin-dir ./awesome-claude-code-function-hooks/plugins/secret-redactorその1セッションだけ Mod を読み込みます。設定には何も追加されません。
仕組み
hooks モジュールは hooks/redact.ts の 1 ファイルだけです。モジュールレベルの保管庫に 2 つのマップがあり、プレースホルダーは種別と値の FNV-1a ハッシュでできています。
function mint(kind: Kind, value: string): string {
hidden++
const seen = byValue.get(value)
if (seen) return seen
const tag = `[REDACTED-${kind}-${fnv1a(value)}]`
byValue.set(value, tag)
byTag.set(tag, value)
return tag
}prompt.submit は入力したテキストを処理してトーストを出します。tool.call はまずツール入力のプレースホルダーを元に戻し、await next(input) でツールを実行させ、結果を処理して、ツール行に件数を表示します。prompt.context は最初のメッセージに付くブロックのシークレットを処理しますが、メールアドレスは対象外です。
値がシークレットと判定されるのは、ベンダー形式に一致する場合、24 文字以上で大文字・小文字・数字を含み 1 文字あたり 3.6 ビットを超えるトークン、または API_KEY=、"token":、Bearer のような名前の後ろにある 3.0 ビットを超える短めのトークンの場合です。単語、キャメルケースの名前、アルファベット、16 進数のみの文字列に対する規則で、git の SHA や識別子が隠れないようにしています。
カスタマイズ
プラグインは 12 個のオプションを宣言していて、/config またはユーザー設定の pluginConfigs で変更できます。
secrets、pii:それぞれのクラスをオフにします。restoreInToolInputs:ツール実行前に本物の値へ戻すのをやめます。notify:トーストとツール行の件数表示をオフにします。minEntropy(3.6)、minLength(24)、contextMinEntropy(3.0):上げると隠す対象が減ります。redactPrivateIps:127.x、10.x、192.168.xなどの予約範囲も隠します。allow、allowEmails、allowPrefixes、denyPrefixes:カンマ区切りの例外と追加ルールです。
権限と安全性
実行する前に、プラグインが実行しうるすべてのファイルを読みました。plugin.json、hooks/hooks.json、hooks/redact.ts(唯一のモジュールで、型以外の import はありません)、テスト、フィクスチャです。package.json、インストールスクリプト、バイナリ、バンドルされたコードはありません。
- ネットワーク、コマンド、ファイル、環境変数: いずれもありません。モジュールは
$.http、$.process、$.fs、$.envを呼ばず、$.storeや$.stateも使いません。保管庫はモジュールのメモリ上にあり、セッションとともに消えます。API 呼び出しは$.ui.toastと$.ui.noticeだけです。 - ツール呼び出しを横取りし、プロンプトを読みます。 これがこの Mod の目的で、README の説明どおりです。プロンプトを書き換え、ツール入力(プレースホルダーから本物の値へ)とツール結果(値からプレースホルダーへ)も書き換えます。呼び出しを拒否することはありません。
- 復元は一つの権限です。 ツール入力にあるプレースホルダーは、コマンドが何であっても本物の値に置き換えられます。ツールの結果に注入された指示が含まれていると、Claude が
curlコマンドにプレースホルダーを入れるよう誘導され、本物のキーが送られる可能性があります。気になる場合はrestoreInToolInputsをオフにしてください。その代わり、ツールにはプレースホルダーの文字列がそのまま渡されます。 - プレースホルダー自体は秘密ではありません。 ハッシュは 32 ビットの FNV-1a なので、メールや IP のようにエントロピーの低い値のプレースホルダーは、候補をハッシュして推測できます。モデルのコンテキストから値を隠すものであり、推測を試せる相手から守るものではありません。理論上、2 つの値が同じハッシュになることもあります。
- ヒューリスティックには漏れがあります。 エントロピーの規則は、シークレットを見逃したり、無害なトークンを隠したりすることがあります。モデルが書いた内容はスキャンされず、再起動をまたいで保持もされません。
- テレメトリーはなく、指示も注入しません。 プレースホルダー以外の文章をプロンプトに追加することはありません。
- ライセンス: MIT で、リポジトリに LICENSE ファイルがあります。
claude plugin validate はエラーも警告も出しませんでしたが、ノートには .catch のないゲート型 hook が 2 つ(prompt.submit と tool.call)あると示されています。hook が例外を投げた場合の保護がないため、hook のバグでプロンプトやツール呼び出しが、そのまま通らずに失敗する可能性があります。claude plugin test は実行できるテストを見つけられませんでした。作者のテストは *.test.ts ではなく test/detect.test.mts(通常の Node スクリプト)だからです。こちらは実行していません。
- ツール呼び出しを傍受
- Claude が行うすべてのツール呼び出しを参照でき(tool.call / tool.check)、ブロックや変更も可能です。
- プロンプトを読み取る
- 入力内容と会話のトランスクリプトを参照できます(prompt.* / session.append / session.messages)。
- UI を変更
- Claude Code の画面に描画します。バンド、ペイン、ステータス表示、トーストなど(ui.render / $.ui.*)。
互換性とトラブルシューティング
macOS 上の Claude Code 2.1.291 で確認しました。validate は通り、プラグインを読み込んだデモも動きました。何も隠れない場合は次を確認してください。
- 関数 hooks が有効か:設定、または Claude Code を起動するシェルで
CLAUDE_CODE_ENABLE_FUNCTION_HOOKS=1を設定します。 - すでに開いているセッションにインストールした後は、
/reload-pluginsを実行します。 - その値が除外リストに入っていないか:
@example.comのようなドキュメント用ドメイン、noreply@のアドレス、プライベート IP 範囲、Stripe のオブジェクト ID は意図的にそのままです。 - 入力欄には入力したとおりの文字が表示され、プレースホルダーはプロンプトを送信した後に現れます。
よくある質問
- Secret Redactor はシークレットをどこかへ送信しますか?
- いいえ。コードにネットワーク呼び出し、シェルコマンド、ファイルアクセスは見つかりませんでした。元の値は hooks モジュールのメモリ上のマップに保持され、セッションが終わると消えます。
- インストールしても何も隠れないのはなぜですか?
- 作者の README によると、これは関数 hook で、関数 hooks を有効にするまで何もしません。~/.claude/settings.json の env ブロックに CLAUDE_CODE_ENABLE_FUNCTION_HOOKS=1 を設定するか、1 回のセッションだけこの変数を付けて起動してください。
- 見えないキーを Claude は使えますか?
- ツールの入力では使えます。ツールが動く前に、hook が [REDACTED-SECRET-164d0c98] のようなプレースホルダーを元の値に戻すので、Bash コマンドや Write は本物のキーを持ったままです。モデルが見るのはプレースホルダーだけです。
- Claude 自身が書いたシークレットは隠れますか?
- いいえ。スキャンされるのは Claude が読む内容、つまりあなたのプロンプト、ツールの結果、最初のメッセージに付く各ブロックだけです。モデルがコマンドに書いたキーは、すでに知っているキーです。
- 隠したくない値を残すにはどうしますか?
- /config のオプションを使います。allow は完全一致の文字列、allowEmails はアドレスまたは @yourdomain.com のようなドメイン、allowPrefixes は公開として扱う追加の ID プレフィックスを指定します。minEntropy を上げると隠す対象が減ります。
# 関連する Mod
おすすめ危険なコマンドのブロック
rm -rf /、main への force-push、DROP TABLE、curl | sh などの破壊的な Bash コマンドを実行前に拒否します。
- トースト
- ツール呼び出しを傍受
- UI を変更
v2.1.310 で検証済み
おすすめツール呼び出しカウンター
Claude のツール呼び出しをターンごと・セッションごとに数え、スピナーの横に件数を表示。/tally で内訳も確認できます。
- スピナー
- トランスクリプト
- ステータス
- ツール呼び出しを傍受
- UI を変更
- コマンド・ツールを追加
v2.1.310 で検証済み
同じカテゴリの Mod: 安全ガード、Claude に追加するツール。