入口の機械ゲート — 使い方と思想

AIで作ったコードの漏洩や脆弱性を「起きてから直す」のではなく「入る前に機械で止める」ための3つのゲートです。監査(事後の説明)の対になる「防止(事前の停止)」を担います。ただしこれらは既知パターンを止めるもので、網羅ではありません(「安全になる」ではなく「既知の事故を減らす」)。

このページは使い方だけでなく、なぜこの設計にしたのか(思想)も残します。設計は Claude・OpenAI Codex・xAI Grok の3つのAIによる独立レビューで方向づけし、活用するオープンソースは一次情報でライセンス・オフライン可否・保守を確認して選びました。

貫いている4つの原則

  1. AIの能力を落とさない。 ゲートが止めるのは「漏洩」と「危険」であって、AIの作る力ではありません。特に外部AIへコードを渡すときは、文脈を削るのではなく「全部渡すが秘密だけ隠す」を既定にしています。
  2. 止める判定は機械が、決定論で行う。 AIは分析の補助であって、停止の可否は決定論的なゲートが握ります。曖昧さで素通りさせません。
  3. 未検証を「安全」と偽らない。 専用ツールが入っていなければ「未検証(NOT-TESTED)」と正直に返し、「問題なし」とは扱いません。網羅を主張しません。
  4. 外部にコードを出さない。 漏洩対策の道具が漏洩源になっては本末転倒です。オフラインで動くツールだけを選び、外部送信するツール(クラウド必須のスキャナ等)は採用しませんでした。

ゲート1:コミット前に秘密を止める(gate-commit)

秘密(APIキー・トークン等)は、いったんGit履歴に入ると除去が高くつきます。コミットする前に止めるのが最も安上がりです。

python3 scripts/security_gate.py gate-commit .

思想:秘密検出を単一ツールに委ねない。ツールごとに取りこぼす対象が違うため、複数の検出器の「和(union)」で止めるのが安全側です。


ゲート2:外部AIへ渡す前に秘密・PIIを隠す(build-prompt-bundle)

別のAI(レビュー用のCodexやGrok等)へコードを渡す瞬間、それ自体が「外に出したくないコード」の外部送信になります。ここを手順の心得でなく機械で処理します。

# 既定=redactモード:全文脈を送りつつ、秘密とPIIだけをマスクする
python3 scripts/security_gate.py build-prompt-bundle <repo> --output <外部一時ディレクトリ>

# 機密性が極端に高いとき=allowlistモード:許可したパスだけ送る(文脈は減る)
python3 scripts/security_gate.py build-prompt-bundle <repo> \
  --output <外部一時ディレクトリ> --mode allowlist --allow <許可リスト>

思想:プライバシーと能力はトレードオフに見えて、両立できる。「渡すファイルを絞る」より「渡すが秘密を隠す」方が、漏洩を防ぎつつAIの理解を保てます。


ゲート3:依存の脆弱性を止め、部品表を残す(scan-deps / gen-sbom)

自分のコードが綺麗でも、取り込んだ依存パッケージに既知の脆弱性があれば穴になります。ここは依存の読み取り検査だけで、実装能力は一切制限しません。

# 依存の既知脆弱性(SCA):Critical/Highがあれば停止
python3 scripts/security_gate.py scan-deps <repo>

# ソフトウェア部品表(SBOM)をCycloneDX形式で生成
python3 scripts/security_gate.py gen-sbom <repo> --output sbom.cdx.json

思想:個人開発者には「少数の強いゲート」が現実的。常時稼働のSOC級監視やAIの自動修復・自動デプロイは、偽陽性と運用負担で無視されるようになり逆効果になり得るため、あえて載せていません。


全体の位置づけ

導入手順の全体像はスタートガイド、監査本体の詳細は監査内容の詳しい備考を参照してください。ソースと変更履歴はGitHubにあります。