
Сканируй. Редактируй. Коммить чисто.
Найди секрет. Исправь его. Закоммить чисто.
Сканеры секретов хорошо умеют бить тревогу, но мало помогают её устранить. Они выдают список утёкших учётных данных и оставляют уборку вам. Credactor замыкает цикл: он находит захардкоженный секрет и переписывает его на месте, так что утечка проходит путь от обнаружения до исправления одной командой.
Держать учётные данные вне исходного кода — это базовая практика безопасности, а не опциональная. Credactor делает соблюдение этой базовой практики дешёвым: на вашей машине до коммита или в CI до слияния. Запускайте его отдельно или вместе со сканерами, которым вы уже доверяете.
# Credactor finds this:
db_password = "h8Tq2vKp9mRz4Wd"
# By default it rewrites the secret as a sentinel that fails loudly at runtime:
db_password = "REDACTED_BY_CREDACTOR"
# With --replace-with env, it writes a reference that reads from the environment:
db_password = os.environ["DB_PASSWORD"]
Редактирование переписывает файлы в вашем рабочем дереве. Если секрет уже был закоммичен, смените ключ и очистите историю (например, с помощью
git filter-repo). Перезапись файла не заменяет отзыв утёкших учётных данных.
REDACTED_BY_CREDACTOR, который по умолчанию падает во время выполнения, или языко-зависимую ссылку на переменную окружения (Python, JavaScript/TypeScript, Go, Java/Kotlin, Ruby, PHP и shell), например os.environ["KEY"]. Замена является валидным кодом. Если файл ещё не содержит соответствующий импорт (например, import os), добавьте его..bak, защита границ симлинков и прав доступа к файлам, а также полное маскирование секретов во всех выводах. Если безопасную резервную копию записать нельзя, Credactor пропускает файл, а не переписывает его вслепую, а сбой в середине записи оставляет оригинал нетронутым.--ci с точными кодами выхода, pre-commit хук и приём отчётов Gitleaks, TruffleHog или Betterleaks. Обнаруживайте сканером, который вы уже запускаете, устраняйте с помощью Credactor.pip install credactor
Требуется Python 3.11+. Никаких других зависимостей. Работает на Linux, macOS и Windows (протестировано в CI на Linux и Windows).
На macOS и Linux его можно установить через Homebrew:
brew install rxb06/tap/credactor
Формула устанавливает в собственный virtualenv и включает опциональное
дополнение [encoding], так что установка через Homebrew также обнаруживает секреты в
не-UTF-8 файлах. Обычный pip install credactor не включает это дополнение; добавьте его с помощью
pip install 'credactor[encoding]', если хотите такое же покрытие.
Из исходников:
git clone https://github.com/rxb06/credactor.git
cd credactor
pip install -e .
После этого credactor работает из любого каталога.
Сначала запустите
--dry-runи просмотрите находки перед редактированием. Ложные срабатывания возможны, и при--fix-allложное срабатывание будет переписано. Подавляйте известные безопасные значения с помощью# credactor:ignoreили записи в.credactorignore.
credactor --dry-run . # scan, change nothing
credactor . # scan, then redact interactively (y/n per finding)
credactor --fix-all . # redact everything after one confirmation
credactor --fix-all --yes . # redact non-interactively (CI / scripts)
credactor --ci . # read-only gate: exit 1 on findings
credactor --replace-with env . # redact to env-var references instead of the sentinel
Хук проверяет только проиндексированное содержимое, поэтому уже закоммиченный секрет не будет помечен повторно. Используйте
credactor --scan-history ., чтобы проверить то, что уже находится в репозитории.
# .pre-commit-config.yaml
repos:
- repo: https://github.com/rxb06/credactor
rev: v2.7.4 # pin to the latest release tag
hooks:
- id: credactor
- uses: rxb06/[email protected]
Действие всегда передаёт --ci, поэтому оно сообщает и блокирует, но никогда не переписывает
checkout. Находки приводят к провалу шага; установите fail-on-findings: false, чтобы сообщать
без блокировки. Ошибка приводит к провалу шага в любом случае.
Загрузка в Code Scanning вместо провала при находках:
- uses: rxb06/[email protected]
with:
format: sarif
upload-sarif: true
fail-on-findings: false
Для загрузки заданию нужны permissions: security-events: write. См.
руководство по интеграции с CI для всех входных параметров,
включая приём отчётов Gitleaks, TruffleHog и Betterleaks.
Credactor обнаруживает типы учётных данных, которые утекают чаще всего, и присваивает каждому уровень серьёзности, чтобы вы могли оценивать их с первого взгляда.
| Категория | Примеры | Серьёзность |
|---|---|---|
| Ключи облачных провайдеров | AWS (AKIA…), GCP (AIza…), Stripe (sk_live_…), Slack (xoxb-…) | Critical |
| Токены платформ | GitHub (ghp_, github_pat_), GitLab (glpat-), npm (npm_), PyPI (pypi-) | Critical |
| Приватные ключи | PEM-блоки (-----BEGIN … PRIVATE KEY-----) | Critical |
| JWT | eyJ… трёхсегментные токены | High |
| Строки подключения | URL со встроенными учётными данными (scheme://user:pass@host) | High |
| Переменные учётных данных | password = "…", api_key = "…", secret_key = "…" | High/Medium/Low |
| XML-атрибуты | <add key="Password" value="…" /> | High/Medium/Low |
| Строки с высокой энтропией | hex в кавычках (32–64 символа) / Base64 (60+ символов) | Medium/Low |
Детерминированные токены провайдеров (префиксы выше) помечаются независимо от энтропии. Эвристические детекторы (JWT, строки подключения, hex, Base64) должны превысить порог энтропии. Отдельный hex или Base64 помечается только в кавычках. Значение с высокой энтропией без кавычек ловится только на переменной с именем учётных данных, что избавляет от ложных срабатываний на git SHA и контрольные суммы. Полные правила обнаружения и серьёзности см. в Руководстве.
Собственный набор правил Credactor уже, чем у специализированного сканера, и некоторые форматы провайдеров (например, SendGrid, Twilio и вебхуки Slack) не обнаруживаются. Его преимущество — устранение: объедините его с Gitleaks, TruffleHog или Betterleaks для самого широкого обнаружения или запускайте отдельно.
Credactor работает самостоятельно, но в компании становится сильнее. Уже запускаете Gitleaks, TruffleHog или Betterleaks? Передайте их отчёт в Credactor, и он отредактирует объединённый набор, дедуплицированный относительно собственных находок (при пересечении побеждает более высокая серьёзность). Один проход устранения покрывает ваш скан и их: