
Push Guard は、シークレット漏洩の可能性に対応するローカル Git の pre-push ガードです。
プッシュされる内容をスキャンし、シークレットらしきパターンを報告し、一致した値をすべて 伏字化したうえで、Git がプッシュをブロックするよう非ゼロで終了します。
Dragon Lady によって構築・保守されています - github.com/Dragon-Lady - X: @answerislove2
バージョン 0.4.3 では、インラインの # push-guard: ignore 例外が削除されました。アップグレードにより、
以前は通過していたプッシュやパッケージがブロックされ始める可能性があります。共有フックや CI インストールを
アップグレードする前に、利用している各リポジトリを確認してください:
git grep -n -i 'push-guard:[[:space:]]*ignore'
各一致箇所を確認してください。シークレットと非公開の素材は削除してください。どちらも例外にはできません。
正当なワークフロー/IOC フィクスチャについては、レビュー済みの正確なリポジトリ
パスと正確な workflow.* ルール ID のみを .push-guard-allow に追加してください。インラインマーカーは
現在、テストやドキュメント内のものを含め、通常のテキストです。すべてのマーカー行を
自動的に許可に変換しないでください。新たな許可はセキュリティ上重要な変更として
レビューしてください。
pre-push フックは、宛先が通知するベース コミットから例外を読み取り、作業コピーや候補コミットからは決して読み取りません。新規または拡張された 許可は、後のプッシュを免除できるようになる前に、別途レビューされ確立されている必要があります。マルチ ref のプッシュでは、すべての宛先 ベースで共有される例外のみが適用されます。通知されたベースを持たない新しい ref には例外が適用されません。
scan も同様に --base からポリシーを読み取ります。別途レビューされたポリシースナップショットに対して
より大きな履歴範囲を監査する場合は、明示的に
--allow-list-ref <reviewed-40-character-commit-SHA> を渡してください。これは呼び出し元による明示的な信頼
判断です。レビューされていない候補のポリシーで決して代用しないでください。
scan-package は引き続き、アーティファクトの外にある呼び出し元が選択した --repo ポリシーを使用します。信頼できないビルドをスキャンする場合は、
レビュー済みのポリシーディレクトリを指定してください。
インストール済みフックをアップグレードする前に、実際の送信変更とビルド済み
アーティファクトに対して、新バージョンの push-guard scan --base <trusted-base> --head HEAD と
push-guard scan-package dist/* を実行してください。アーカイブのメンバーパスは
ソースパスと異なる場合があります。それらの正確なパスを別途レビューしてください。影響を受けるリポジトリがこの移行を完了するまで、
既存のインストール済みバージョンを維持してください。
公開ランディングページ: push-guard.netlify.app
静的プロジェクトのランディングページは docs/ にあり、ランタイム
依存関係、外部スクリプト、アナリティクス、リモートアセットはありません。docs/ ディレクトリから GitHub Pages で配信するか、
含まれている netlify.toml を使用して Netlify にデプロイできます(ビルドコマンドなし、公開ディレクトリ docs)。
現在の Netlify プロジェクトは手動デプロイを使用しています。Git のプッシュだけでは
公開ページは更新されません。各リリース後に docs/ の内容を公開し、
ライブバージョン、ソーシャル画像、レスポンスヘッダーを確認してください。docs/_headers
ファイルは、そのディレクトリを直接デプロイする際にセキュリティヘッダーを維持します。
--send オプションのみが、設定された宛先への集約
アラートを有効にします。Git ガードはオフラインのままです。git サブプロセスを使用します。既存のフックエントリポイントは
保持され、生コンテンツと送信履歴の検査が強化されています。$HOME 内の選択されたファイルを読み取り、子
プロセス(Git を含む)を実行しません。$XDG_STATE_HOME/push-guard-sweep/fp.key(デフォルト
~/.local/state/push-guard-sweep/fp.key)にランダムな 32 バイトの HMAC キーを 1 つ作成します。
このキーは「デフォルトでデータを保存しない」に対する明示的な例外です。スキャンされたデータは含まれません。状態ディレクトリは 0700、ファイルは 0600 で作成されます。--baseline および --output ファイルには、秘匿化されたローカルメタデータが含まれます。
--send はキー付きの重複排除レシートを保存し、アラート認証情報やシークレットは決して保存しません。プッシュのブロックは、勧告に対する Git の応答です。Push Guard は読み取り専用のままであり、
ファイルを変更しません。一致した値がシークレットでないことが既知の場合、
git push --no-verify でオーバーライドできます。
push-guard sweep コマンドと push-guard-sweep エイリアスは、同じローカル検査を提供します。これらは既存パッケージの Python 3.11 以降を必要とし、追加のランタイム依存関係はありません。開発テストではオプションの test エクストラを使用します(python -m pip install ".[test]"、その後リポジトリルートから PYTHONPATH=src python -m pytest -q)。0.4.0 リリースでは Sweep が追加されます。CI はその開発用エクストラをインストールし、レガシーの unittest ケースを含む pytest スイート全体を実行します。リリーステストは別のジョブで実行され、そのジョブは公開処理に配布アーティファクトを一切提供しません。アーティファクトビルドジョブはテスト依存関係をインストールしません。Sweep はスケジューラをインストールしたり有効化したりしません。
push-guard sweep --list-targets
push-guard sweep --roots ~/projects --class stray
push-guard-sweep --format json --output ~/sweep-report.json
push-guard-sweep --baseline ~/sweep-baseline.json
push-guard-sweep report --format html --output ~/sweep-report.html
push-guard-sweep print-timer --interval 7d
すべてのスキャンは、以下に示すデフォルトの履歴、ドットファイル、設定、ログの場所も考慮します。--roots は .env* およびカスタムインクルードの検索ルートを変更します。他のデフォルトセットを絞り込むには --exclude を使用してください。--include GLOB を繰り返すと既存の範囲指定された検索内にファイルが追加され、--exclude GLOB を繰り返すとパスが除外されます。Glob はベース名、HOME 相対パス、または絶対パスにマッチします。除外が優先され、インクルードは安全上の除外や深さ制限を上書きできません。CLI のパス引数内の ~ は展開されます。スキャン対象のパスは $HOME 内に留まる必要があります。
.lesshst。SQLite のシェル履歴テキストはデータベースファイルとは別です。.bashrc、.zshrc、.profile、.bash_profile、.npmrc、.docker/config.json。.config 配下の選択された JSON、TOML、YAML、INI、CONF ファイルで、その下のディレクトリ階層が最大 4 階層までのもの。.env* ファイル: 選択されたルート(デフォルトは HOME)配下で、ディレクトリ階層が最大 6 階層まで。依存関係ツリー、仮想環境、Git メタデータ、キャッシュはこの検索から除外されます。.log ファイルおよび logs/ 内のファイルで、.local/state、.cache、.codex、.config/Cursor/logs および設定された log_dirs の下のディレクトリ階層が最大 4 階層までのもの。既知の認証情報ストア(.git-credentials、.aws/credentials、.netrc、.pypirc、.config/gh/hosts.yml、.config/rclone/rclone.conf、.codex/auth.json)はメタデータのみのチェックです。その内容は決して開かれません。それぞれ expected-store として報告され、プライベートモードの場合は info 重大度、実行/グループ/その他のパーミッションの場合は warn 重大度となります。line は null であり、fp_kind=path はトークンのフィンガープリントではなく、キー付きパスのフィンガープリントであることを明示的に示します。これらのストアにおける認証情報のインベントリは Reach Ward が担当します。これにより、モードチェックのために秘密の値や行番号を捏造することを避けます。その他のすべてのマッチは stray に分類され、通常は warn となります。Google アクセストークンは低重大度で、短命かつ期限切れの可能性が高いとマークされます。トークンがプロバイダに対してチェックされることはありません。
Sweep は Push Guard のプロバイダ定義と汎用代入マッチャーを再利用し、Slack、Google、npm、PyPI、JWT および認証情報を含む URL の形状を追加し、拡張された OpenAI トークンの形状を検出します。汎用代入にはさらに、1 文字あたり少なくとも 3.5 ビットのエントロピーが必要です。明らかなフィラーや変数参照は無視されますが、test のような単語を含むランダムなプロバイダトークンは依然として報告されます。# push-guard: ignore は Sweep のマッチを抑制できません。完全な秘密鍵ブロックは全体がフィンガープリント化され、不完全なブロックはヘッダー以降の範囲指定された残り部分がフィンガープリント化されます。秘密鍵の素材は一切永続化されません。
検出結果には、ローカルパス、行、ルール、タイプ、クラス、重大度、モード、fp: に続く 16 桁の HMAC-SHA256 16 進文字、およびリテラル <redacted> が含まれます。.git ディレクトリまたはファイルは、メタデータのみによって Git メンバーシップの可能性を確立します。追跡ステータスは常に unknown です。Sweep は Git を実行したり、そのインデックスを解析したりしません。検出された秘密の値やトークンの形状を含むパスは伏字化されます。エンコードされたパスラベルは保守的に全体が置換されます。レポートにはソース行が含まれることはありません。ヒントは表示されるアドバイスのみです。Sweep は履歴を削除したり、認証情報をローテーションしたり、.gitignore を編集したり、ファイルのモードを変更したりすることは決してありません。
--list-targets はスキャン対象や設定内容の読み取りを一切行わず、フィンガープリントキーやその他のファイルも作成しません。デフォルトおよび CLI のターゲットオプションのみを使用し、デフォルトの設定ファイルは読み取りません。これを --config、--baseline、--output または --send と組み合わせると拒否されます。意図されたテキスト読み取りを一覧表示し、期待されるストアをメタデータのみとして明示的にマークします。バイナリ内容は読み取らずに識別できないため、名前のないバイナリファイルがこのプレビューに表示され、スキャン中にスキップされる可能性があります。
すべてのシンボリックリンク、ハードリンク、FIFO、デバイス、ソケット、既知のブラウザプロファイル/キーリングのパス、データベースのファイル名、圧縮/バイナリ拡張子はスキップされます。ディレクトリコンポーネントは no-follow ディスクリプタで開かれるため、シンボリックリンクされた親が読み取りをリダイレクトすることはできません。テキストの読み取りはファイルあたり 10 MiB に制限され、データベース/圧縮のマジック、NUL バイト、バイナリ制御バイト、無効な UTF-8 はスキップの原因となります。識別可能なバイナリ/データベース/圧縮コンテンツは、最大 8 KiB のヘッダー読み取り後に拒否されます。設定/状態の読み取りは別個であり、変更されていません。予期しないバイナリ/データベース名を持つファイルは、その内容を識別するために有界の読み取りを必要とします。SQLite ライブラリは使用されません。ディスカバリは 250,000 個のディレクトリエントリ、10,000 個のターゲットファイル、10,000 件の検出結果に制限され、ベースラインは 10 MiB に制限されます。1 回の実行には 100 MiB のテキスト読み取り予算と、1 つの共有 45 秒の検査期限があります。予算の枯渇は、部分的な不完全レポートを返し、終了コード 2 で終了します。遅いストレージでは、中断不可能なカーネルシステムコール中に期限を超える可能性があります。
終了コード: 0 検出結果なし、1 検出結果あり(情報提供のストアチェックを含む)、2 使用法、ランタイム、不完全な検査、またはアラート配信のエラー。意図的なポリシーによるスキップは別途要約され、検査の失敗を意味するものではありません。標準的なオプションのソースファイルが存在しないことは正常です。テキスト、JSON、Markdown、および自己完結型のエスケープされた HTML は --format で利用できます。
最初の --baseline FILE 実行ではすべてを報告し、フィンガープリント、パス、行、ルール ID、モードを保存します。以降の実行では、前回の成功したスキャンに存在しなかったエントリのみを報告し、その後ベースラインをアトミックに置き換えます。モードまたは行が変更されたものは新しいエントリです。削除されたエントリは破棄されます。不完全なスキャンはベースラインを更新しません。ベースラインはプライベートで検証済みのファイルであり、同じフィンガープリントキーを使用する必要があります。キーが欠落しているか変更されている場合は、比較の前に元のキーを復元する必要があります。出力レポートは既存のファイルを上書きしません。すべての出力ファイルとベースラインファイルは作成時に 0600 となり、宛先の親ディレクトリはあらかじめ存在している必要があります。ソースファイルが状態として転用されることはありません。
report は、デフォルトでは過去のスキャン結果が保持されないため、新規のローカルスキャンを実行します。print-timer は systemd ユーザーサービス/タイマーのテキストを別々に stdout に出力し、何もインストールしません。タイマーはデフォルトまたは保存された設定を使用します。対象のマシンでツールを検証した後、ご自身で確認して保存してください。