
credactor v2.6.0
スキャン。編集。クリーンコミット。
Credactor
秘密を見つけて、修正して、クリーンにコミット。
ほとんどのシークレットスキャナーはアラートを出すところで止まります。漏洩した認証情報の一覧が手に入るだけで、後片付けはあなたの仕事です。Credactor はハードコードされたシークレットを見つけ、その場で書き換えるため、作業ツリー内の漏洩は1つのコマンドで「発見」から「修正」へと変わります。ローカルマシン上でも、pre-commit フックとしても、CI ゲートとしても動作し、Gitleaks、TruffleHog、Betterleaks が見つけたものも修正できます。
# Before
db_password = "h8Tq2vKp9mRz4Wd"
# credactor --fix-all . (default: a sentinel that fails loudly at runtime)
db_password = "REDACTED_BY_CREDACTOR"
# credactor --replace-with env --fix-all . (read it from the environment)
db_password = os.environ["DB_PASSWORD"]
リダクションは作業ツリーをクリーンにします。 資格情報を失効させるわけではなく、 git 履歴には触れません。シークレットが一度でもコミットされたり共有されたりした場合は、 ローテーションし、そこからも消す必要があるなら履歴を書き換えてください(例えば
git filter-repoを使って)。
Credactor を選ぶ理由
- 指摘するだけでなく修正します。 各検出結果は、センチネル、独自のマーカー、またはファイル自体の言語での環境変数参照にその場で置き換えられます。
- 慎重な書き込み。 各編集はメモリ上で計画され、まずバックアップされ(モード
0600)、一時ファイルに書き込まれてから所定の場所にリネームされます。実行中に変更されたファイル、スキャンルートの外に出るパス、秘密鍵ブロックは警告付きでスキップされ、その検出結果は報告されたままになります。 - 既に実行しているスキャナーと連携します。 Gitleaks、TruffleHog、Betterleaks のレポートを渡すと、それらの検出結果と自身の検出結果を重複排除した1回のパスで修正します。
- パイプライン向けに設計。 明確な終了コードを備えた読み取り専用の
--ciゲート、GitHub Code Scanning 向けの行・列位置付き SARIF 2.1.0、GitHub Action、pre-commit フック。シークレットはすべてのレポート形式でマスクされ、テキスト出力はクリーンアップされるため、スキャン対象ファイルがエスケープシーケンスや CI ワークフローコマンドをターミナルやログに注入することはできません。 - リリースはソースと照合して検証。 ランタイム依存のない純粋な Python 3.11+ 標準ライブラリ。リリースが PyPI に届く前に、wheel と sdist 内のすべての Credactor ファイルがタグ付けされたソースとバイト単位で比較され、パッケージメタデータが
pyproject.tomlと一致している必要があります(サプライチェーンの強化を参照)。
単独では適さない場合:組み込みルールは数百のプロバイダーではなく、最も頻繁に漏れる資格情報形式をカバーしており、シークレットが有効かどうかはチェックしません。クリーンな実行結果はルールに何も一致しなかったという意味であり、コードにシークレットがないという意味ではありません。網羅性のために専用スキャナーと組み合わせてください(独自のスキャナーを持ち込むを参照)。
インストール
pip install credactor
uv を使用して、ツールとしてインストールするか、インストールせずに一度だけ実行できます:
uv tool install credactor
uvx credactor --dry-run .
または、macOS と Linux では Homebrew を使用します:
brew install rxb06/tap/credactor
Python 3.11 以降が必要です。CI では Linux と Windows、Python 3.11 から 3.13 でテストされています。UTF-8、Latin-1、単純な UTF-16 以外のエンコーディングのファイルについては、オプションの追加パッケージをインストールしてください: pip install 'credactor[encoding]' または uv tool install 'credactor[encoding]'(Homebrew の formula には含まれています)。
クイックスタート
1. 検出結果を確認する。 何も変更されません。
credactor --dry-run .
======================================================================
CREDENTIAL SCAN REPORT -- 2 finding(s) in 1 file(s)
======================================================================
FILE: config.py
────────────────────────────────────────────────────────────
Line 3 [HIGH] [variable:db_password]
db_password = "h8Tq[REDACTED]"
Line 4 [CRITICAL] [pattern:AWS access key]
aws_key = "AKIA[REDACTED]"
レポートには各シークレットの最初の4文字のみが表示されます。
2. 修正する。 まず検出結果を確認してください。--fix-all は誤検出を含むすべてを書き換えます。1つを残すには、その行に # credactor:ignore を追加するか(誤検出の抑制を参照)、対話的に修正して n と回答してください。各ファイルが変更される前に、元に戻せるよう .bak コピーがその隣に書き込まれます。
credactor . # ask y/N for each finding (needs a terminal)
credactor --fix-all . # fix all after one confirmation
credactor --fix-all --yes . # fix all, no prompt (scripts)
credactor --replace-with env --fix-all . # environment lookups instead of the sentinel
Env モードは import ではなく参照を書き込むため、ファイルに import os やお使いの言語の同等のものがなければ追加してください。Windows の Git Bash では、インタラクティブモードを winpty credactor . として実行してください。
3. 確認してからバックアップをクリーンアップします。 各 .bak には依然として元のシークレットが含まれており、Credactor は .gitignore を編集しないため、単純な git add . ではそれがステージングされてしまいます。
diff config.py.bak config.py # check what changed
cp config.py.bak config.py # undo
*.bak と *.credactor.tmp を .gitignore に追加し、問題がなければバックアップを削除してください。最初からバックアップをツリーの外に置くには、修正実行時に --secure-backup-dir DIR(リポジトリ外のディレクトリ)を渡します。--secure-delete は代わりに各バックアップを完全に消去するため、取り消し手段は git だけになります。
コマンド一覧
| コマンド | 動作 | ファイルを変更するか |
|---|---|---|
credactor --dry-run . | 検出結果を報告 | いいえ |
credactor . | 1件ずつ確認して修正 | y の場合のみ |
credactor --fix-all . | 一度の確認後にすべての検出結果を修正 | はい |
credactor --ci . | ゲート:検出結果があれば終了コード 1 | 決して変更しない |
credactor --staged --ci . | コミット用にステージされたものだけをゲート | 決して変更しない |
credactor --scan-history . | ファイルを変更した直近 100 件のコミットをスキャン | 決して変更しない |
credactor --ci -f sarif . > results.sarif | Code Scanning 向けの SARIF 2.1.0 | 決して変更しない |
credactor --ci -f json . > findings.json | 機械可読なレポート | 決して変更しない |
すべてのフラグと組み合わせは マニュアルに記載されています。
pre-commit と CI で使う
pre-commit フック
# .pre-commit-config.yaml
repos:
- repo: https://github.com/rxb06/credactor
rev: v2.7.5
hooks:
- id: credactor
pre-commit install
git commit のたびにステージされた内容をスキャンし、認証情報が含まれている場合はブロックします。このフックはファイルを書き換えることはありません。pre-commit 3.2.0 以降が必要です。フレームワークを使用しない場合は、スタンドアロンフックを参照してください。
GitHub Action
steps:
- uses: actions/checkout@v7
- uses: rxb06/[email protected]
この Action は常に --ci 付きで実行されるため、チェックアウトを書き換えることはありません。検出結果はステップを失敗させ、エラーも同様に失敗させます。失敗させる代わりに Code Scanning へ報告するには:
permissions:
contents: read
security-events: write
steps:
- uses: actions/checkout@v7
- uses: rxb06/[email protected]
with:
format: sarif
upload-sarif: true
fail-on-findings: false
CI 統合ガイド には、すべての Action の入力と出力が記載されており、GitLab CI とプレーンなシェル手順についても説明されています。
独自のスキャナを持ち込む
すでに Gitleaks、TruffleHog、Betterleaks を実行していますか?そのレポートを Credactor に渡せば、それらの検出結果を自身の検出結果とともに修正し、重複を排除します(重複した場合は、より高い重大度が保持されます)。ネイティブスキャンと同様に、まず --dry-run でプレビューしてください。
gitleaks dir . -f json -r gl.json
credactor --from-gitleaks gl.json --fix-all --yes .
trufflehog filesystem . --no-verification --json > th.json
credactor --from-trufflehog th.json --fix-all --yes .
betterleaks dir . -f json -r bl.json
credactor --from-betterleaks bl.json --fix-all --yes .
Credactor をスキャナが実行されたのと同じディレクトリに向け、ツリーが変更された後にレポートを再生成してください。レポートには検出されたすべてのシークレットが平文で保持され、レポート自体はスキャンされません(.json には --scan-json が必要です)。そのため、リポジトリの外に書き出すか、実行後に削除してください。Credactor が安全に配置できない検出結果(有効な行番号がない、.git 配下のパス、単独で照合するには短すぎる値など)は報告されたままとなり、決して書き込まれません。詳細と対応バージョンについては Manual を参照してください。
検出対象
| カテゴリ | 例 | 重大度 |
|---|---|---|
| クラウドおよび SaaS キー | AWS (AKIA…, ASIA…)、GCP (AIza…)、Stripe ライブ (sk_live_…, rk_live_…)、Slack (xoxb-…, xoxp-…) | Critical |
| プラットフォームトークン | GitHub (ghp_, gho_, ghs_, github_pat_)、GitLab (glpat-)、npm (npm_)、PyPI (pypi-) | Critical |
| 秘密鍵 | PEM ブロック (-----BEGIN … PRIVATE KEY-----、暗号化されたものを含む)、PGP 秘密鍵ブロック | Critical |
| JWT | eyJ… の3セグメントトークン | High |
| 接続文字列 | インライン認証情報を含む URL (scheme://user:pass@host) | High |
| 認証情報変数 | password = "…", api_key = "…", secret_key = "…" | High、Medium または Low |
| XML 属性 | <add key="Password" value="…" /> | High、Medium または Low |
| Stripe テストキー | sk_test_… | Medium |
| 高エントロピー文字列 | 引用符で囲まれた hex(32〜64文字)または Base64(60文字以上) | Medium または Low |