secretgate — コーディングエージェント向けローカルシークレットファイアウォール
認証情報がLLM APIに送信されてはなりません。secretgateはそれをローカルで強制します。決定論的エンジン(node scripts/secretgate.mjs、npmインストール不要、キー不要)を使用し、gitleaksから変換された221ルール+エントロピーゲート+Luhnチェックカードを備えています。エージェントのフックAPIが書き換えを許可する場合、シークレットは安定したプレースホルダに秘匿化され、エージェントがファイルに書き戻す際にローカルで復元されます(秘匿化&復元)。プロンプトのブロックのみを許可する場合(Claude Code/Codex)、秘匿化コピーとともにブロックされ、再送信用に提供されます。
アクティベーション → インストール(スキルがトリガーされたら最初に実行)
このスキルがアクティベートされたら(ユーザーがシークレット保護/secretgateインストール/ファイアウォール設定を依頼したら)、doctorを実行し、まだ配線されていないものを配線してください。secretgateはスキルであり、npmパッケージではありません。独自のバンドルを実行します。
node scripts/secretgate.mjs status # 現在の配線状況を確認
node scripts/secretgate.mjs install --claude-code # フック + ~/.claude/settings.json に permissions.deny を追加
node scripts/secretgate.mjs install --codex # ~/.codex/hooks.json + [features] hooks = true
node scripts/secretgate.mjs install --opencode # ~/.config/opencode/plugin/ に自己完結型プラグイン
node scripts/secretgate.mjs install --all # すべてのエージェントを設定
--project を指定すると、Claude Codeのインストールを ./.claude/settings.json にスコープします。install はバンドルのコピーを ~/.secretgate/bin/ に固定し、エージェントがそれを呼び出すように配線するため、スキルキャッシュが削除されても動作し続けます。インストール後は、必ずユーザーにエージェントセッションを再起動するよう伝えてください。フックは起動時に読み込まれます。一度配線されると、秘匿化は自動的かつ決定論的に行われます(フックが実行するので、ユーザーが行う必要はありません)。
コマンド
| コマンド | 説明 |
|---|---|
status | ドクター:エージェントごとの配線、エンジン、ヴォールトの健全性、制限事項を表示 |
| `scan <ファイル | ディレクトリ |
pipe | 標準入力 → 標準出力(シークレットをプレースホルダに秘匿化) |
allow <値> / allow --rule <ルールID> / allow --path <グロブ> | 許可リストに追加(値はSHA-256ハッシュとして保存、平文では保存しない) |
vault list / vault clear | プレースホルダマッピングを表示(シークレットは表示しない) |
uninstall --<エージェント> | インストールで追加したものを正確に削除 |
保護の仕組み(ユーザーから尋ねられたら説明)
- プロンプト: Claude Code/Codex → 秘匿化コピーとともにブロック(
[allow-secret]を追加すると1回だけバイパス)。OpenCode → その場で静かに秘匿化。 - ファイル読み込み:
.env*、鍵、~/.aws、~/.ssh… は直接拒否(.env.example/.sample/.templateは読み取り可能)。値はモデルに入力されません。 - ツール/bash出力:
SECRETGATE_<ハッシュ>プレースホルダに秘匿化(Claude Code + OpenCode。Codexはまだ出力の書き換えに対応していません)。 - 復元: エージェントがファイルにプレースホルダを書き込むと(Write/Edit)、ディスク上には実際の値が保存されます。Bash復元はデフォルトでOFF(プロンプトインジェクションによる情報漏洩防止)。有効にするには
~/.secretgate/config.jsonでrestoreBash: trueを設定。 - クリーンなツール呼び出し: Claude Codeのpre-tool-useフックは、最小限のJSON(
{}、決定不要=通常の許可フロー)を返し、空の標準出力を返しません。空のフック出力はClaude Codeのバグ(anthropics/claude-code#77782)を引き起こし、autoモードでも一致するすべてのツール呼び出しで対話的な許可プロンプトが強制されます。また、文書化された"defer"決定値はClaude Code <= 2.1.212で拒否されるため、{}はどこでも機能する棄権となります。
対応していないこと(ユーザーに正直に伝える)
- Claude Codeの
@fileメンションは、ツールフックを起動せずにインラインコンテンツを含める(permissions.denyルールのみがカバー)。 - Codexの非インタラクティブ実行(
codex exec)— 上流のバグで、フックが起動しません。 - 画像/スクリーンショット/クリップボード、MCPツールトラフィック、インストール前に会話にすでに含まれているもの。
- フックプロセスが強制終了/タイムアウトした場合、エージェントは続行します(エージェント側のフェイルオープン)。secretgate自体は、プレイベントの自社エラーではフェイルクローズします。
- ブロックされたプロンプトは、Claude Codeによってローカルにエコーバックされます(ターミナルに
Original prompt:、claude -pJSONのresult)。APIは決してそれを見ませんが、パイプされたヘッドレス出力は機密として扱ってください。
誤検知
最も狭い修正を優先:行にインラインで # pragma: allowlist secret(または gitleaks:allow)→ allow <値>(ハッシュ化)→ allow --path <グロブ> → allow --rule <ルールID>(最終手段)。プロジェクトは .secretgate.json({"allowlist": {"paths": […]}})に追加の許可リストエントリをコミットできます。