
credactor v2.6.0
Сканируй. Редактируй. Коммить чисто.
Credactor
Найди секрет. Исправь его. Коммить чисто.
Сканеры секретов хорошо умеют поднимать тревогу, но почти не помогают её погасить. Они выдают вам список утёкших учётных данных и оставляют уборку за вами. Credactor замыкает цикл: он находит захардкоженный секрет и переписывает его на месте, так что утечка проходит путь от обнаружения до исправления одной командой.
Хранение учётных данных вне исходного кода — это базовая практика безопасности, а не опция. Credactor делает эту базу дешёвой в соблюдении: на вашей машине перед коммитом или в CI перед merge. Запускайте его отдельно или вместе со сканерами, которым вы уже доверяете.
# Credactor находит это:
db_password = "h8Tq2vKp9mRz4Wd"
# По умолчанию он переписывает секрет как sentinel, который громко падает во время выполнения:
db_password = "REDACTED_BY_CREDACTOR"
# С --replace-with env он записывает ссылку, которая читает из окружения:
db_password = os.environ["DB_PASSWORD"]
Редактирование переписывает файлы в вашем рабочем дереве. Если секрет уже был закоммичен, ротируйте ключ и вычистите историю (например, с помощью
git filter-repo). Переписывание файла не заменяет отзыв скомпрометированного учётного данного.
Зачем Credactor
- Редактирование, а не только обнаружение. Большинство сканеров останавливаются на находке. Credactor заменяет секрет на месте: громкий sentinel
REDACTED_BY_CREDACTOR, который падает во время выполнения по умолчанию, или языко-зависимая ссылка на переменную окружения (Python, JavaScript/TypeScript, Go, Java/Kotlin, Ruby, PHP и shell), напримерos.environ["KEY"]. Замена — это валидный код. Если в файле ещё нет соответствующего импорта (например,import os), добавьте его. - Безопасно по умолчанию. Атомарные записи, автоматические резервные копии
.bak, защита от пересечения симлинков и прав на файлы, а также полное маскирование секретов во всех выводах. Если безопасную резервную копию записать нельзя, Credactor пропускает файл, а не переписывает его вслепую, и сбой в середине записи оставляет оригинал нетронутым. - Ноль зависимостей во время выполнения. Чистая стандартная библиотека Python 3.11+, плюс опциональный extra для не-UTF-8 кодировок.
- Создан для пайплайна. Вывод SARIF для GitHub Code Scanning, read-only шлюз
--ciс точными кодами выхода, pre-commit hook (бета) и приём отчётов Gitleaks или TruffleHog. Обнаруживайте с помощью Gitleaks или TruffleHog, устраняйте с помощью Credactor.
Установка
pip install credactor
Требуется Python 3.11+. Других зависимостей нет. Работает на Linux, macOS и Windows (протестировано в CI на Linux и Windows).
Из исходников:
git clone https://github.com/rxb06/credactor.git
cd credactor
pip install -e .
Затем credactor работает из любой директории.
Быстрый старт
Сначала запустите
--dry-runи просмотрите находки перед редактированием. Ложные срабатывания возможны, и при--fix-allложное срабатывание будет переписано. Подавляйте заведомо безопасные значения с помощью# credactor:ignoreили записи в.credactorignore.
credactor --dry-run . # сканировать, ничего не менять
credactor . # сканировать, затем редактировать интерактивно (y/n на каждую находку)
credactor --fix-all . # редактировать всё после одного подтверждения
credactor --fix-all --yes . # редактировать неинтерактивно (CI / скрипты)
credactor --ci . # read-only шлюз: выход 1 при находках
credactor --replace-with env . # редактировать в ссылки на переменные окружения вместо sentinel
Pre-commit hook (бета)
Интеграция hook в бете. Запустите
credactor --dry-run .вручную, прежде чем полагаться только на него.
# .pre-commit-config.yaml
repos:
- repo: https://github.com/rxb06/credactor
rev: v2.6.0 # закрепите за последним тегом релиза
hooks:
- id: credactor
Обнаружение
Credactor обнаруживает типы учётных данных, которые утекают чаще всего, и присваивает каждому уровень серьёзности, чтобы вы могли триажировать с первого взгляда.
| Категория | Примеры | Серьёзность |
|---|---|---|
| Ключи облачных провайдеров | AWS (AKIA…), GCP (AIza…), Stripe (sk_live_…), Slack (xoxb-…) | Критическая |
| Токены платформ | GitHub (ghp_, github_pat_), GitLab (glpat-), npm (npm_), PyPI (pypi-) | Критическая |
| Приватные ключи | PEM-блоки (-----BEGIN … PRIVATE KEY-----) | Критическая |
| JWT | eyJ… токены из трёх сегментов | Высокая |
| Строки подключения | URL со встроенными учётными данными (scheme://user:pass@host) | Высокая |
| Переменные с учётными данными | password = "…", api_key = "…", secret_key = "…" | Высокая/Средняя/Низкая |
| XML-атрибуты | <add key="Password" value="…" /> | Высокая/Средняя/Низкая |
| Строки с высокой энтропией | hex в кавычках (32–64 символа) / Base64 (60+ символов) | Средняя/Низкая |
Детерминированные токены провайдеров (префиксы выше) помечаются независимо от энтропии. Эвристические детекторы (JWT, строки подключения, hex, Base64) должны пройти минимальный порог энтропии. Отдельно стоящий hex или Base64 помечается только в кавычках. Незакавыченное значение с высокой энтропией ловится только на переменной с именем учётных данных, что щадит git SHA и контрольные суммы. Полные правила обнаружения и серьёзности см. в Руководстве.
Собственный набор правил Credactor уже, чем у выделенного сканера, и некоторые форматы провайдеров (например, SendGrid, Twilio и Slack webhooks) не обнаруживаются. Его преимущество — устранение: сочетайте его с Gitleaks или TruffleHog для максимально широкого обнаружения или запускайте отдельно.
Сочетайте с другим сканером, редактируйте всё разом
Credactor работает сам по себе и становится сильнее в компании. Уже используете Gitleaks или TruffleHog? Передайте их отчёт Credactor, и он отредактирует объединённый набор, дедуплицированный относительно собственных находок (при пересечении побеждает более высокая серьёзность). Один проход устранения покрывает и ваш скан, и их:
gitleaks dir . -f json -r gitleaks.json
credactor --from-gitleaks gitleaks.json --fix-all --yes .
--from-gitleaks / --from-trufflehog (или таблица [ingest] в .credactor.toml) требуют целевой директории — укажите Credactor тот же корень, по которому работал сканер. Пути в отчёте разрешаются относительно рабочей директории, а отчёт — это снимок: перегенерируйте его после редактирования или изменения дерева. См. Руководство по интеграции с CI.
Дополнительные возможности
- Интерактивное или пакетное редактирование; пользовательская строка замены через
--replacement;--scan-historyдля сканирования истории git-коммитов - Безопасные резервные копии:
--secure-delete(перезапись и удаление.bak; повышает планку против случайного восстановления, но не является криминалистической гарантией) или--secure-backup-dirдля хранения резервных копий вне репозитория - Инлайновые
# credactor:ignoreи allowlist.credactorignore(glob-шаблоны,file:line, литералы значений) - Конфигурация на репозиторий через
.credactor.toml - 29 типов исходных/конфигурационных/заметочных файлов из коробки (включая
.txt);--scan-jsonдля включения JSON;--fail-on-errorдля отказа при невозможности прочитать файл
Сканируемые типы файлов
.py.js.ts.jsx.tsx.sh.bash.env.cfg.ini.toml.yaml.yml.rb.go.java.php.cs.kt.tf.hcl.conf.config.properties.xml.pem.key.crt.txt
Плюс варианты .env.* / .env-* (.env.local, .env.production) и файлы SSH / приватных ключей (id_rsa, id_dsa, id_ecdsa, id_ed25519), все сопоставляются по имени файла, а не по расширению. JSON исключён по умолчанию, потому что ответы API дают высокий уровень ложных срабатываний; добавьте --scan-json, чтобы включить его. Файл, указанный напрямую в командной строке, сканируется, даже если его расширения нет в этом списке.
Коды выхода
| Код | Значение |
|---|---|
0 | Находок нет или все устранены |
1 | Неустранённые находки |
2 | Ошибка (например: неверный путь, опасный --replacement, --ci --fix-all, отсутствующий или недействительный отчёт о приёме, или --fail-on-error с нечитаемым файлом) |
Укрепление цепочки поставок
Инструмент безопасности должен быть безопасен в установке, а не только в запуске. Конвейер сборки и выпуска Credactor укреплён от начала до конца; полные подробности в документе по безопасности.
- Ноль зависимостей во время выполнения. Обычный
pip install credactorне тянет сторонних пакетов (только опциональный extra[encoding]), так что проверять при установке нечего. - Хэш-закреплённый тулчейн. CI и сборки релизов устанавливают из lockfile с
--require-hashes, включая бэкенд сборки (python -m build --no-isolationпротив закреплённого setuptools), так что подменённая зависимость проваливает сборку. - Артефакты побайтово сверяются с исходниками. При каждом push и перед каждой публикацией
scripts/audit_wheel.pyсравнивает wheel и sdist с закоммиченными исходниками побайтово (sha256 противgit HEAD); любой добавленный, отсутствующий или изменённый файл проваливает шлюз, так что шаг сборки не может незаметно внедрить код. - SHA-закреплённый CI с минимальными правами. GitHub Actions закреплены за SHA коммитов, а токены workflow остаются узкими —
contents: readпо умолчанию,id-token: writeтолько для задания публикации.
Документация
| Документ | Описание |
|---|---|
| Руководство по настройке | Установка, конфигурация, интеграция с CI/CD |
| Руководство | Полный справочник: каждый флаг, режим и комбинация, поведение замены и резервных копий, обнаружение и серьёзность, коды выхода и ограничения (поведение проверено тестами) |
| Примеры | Типовые рабочие процессы с выводом |
| Интеграция с CI | Pre-commit hooks, пайплайны CI |
| Безопасность | Модель угроз, меры укрепления, известные ограничения |
| Журнал изменений | История версий |
| Участие | Настройка разработки, стиль кода, процесс PR |
| Отказ от ответственности | Ограничения, безопасное использование, гарантия |
Лицензия
Apache 2.0. См. LICENSE.