
Локальный Git pre-push хук и сканер файловой системы, который обнаруживает вероятные утечки секретов, редактирует совпавшие значения и блокирует push без телеметрии и сетевого доступа.
Push Guard — это локальный Git-хук pre-push для защиты от вероятных утечек секретов.
Он сканирует содержимое, отправляемое при push, сообщает о вероятных шаблонах секретов, скрывает все совпавшие значения и завершается с ненулевым кодом, чтобы Git заблокировал push.
Создано и поддерживается Dragon Lady - github.com/Dragon-Lady - X: @answerislove2
Версия 0.4.3 удаляет встроенное исключение # push-guard: ignore. После обновления
могут начать блокироваться push и пакеты, которые ранее проходили. Перед обновлением
общих хуков или установок CI проверьте каждый использующий репозиторий:
git grep -n -i 'push-guard:[[:space:]]*ignore'
Проверьте каждое совпадение. Удалите секреты и приватные материалы; ни то, ни другое не может быть исключено.
Для легитимных фикстур workflow/IOC добавьте в .push-guard-allow только проверенный точный путь
в репозитории и точные идентификаторы правил workflow.*. Встроенные маркеры теперь
являются обычным текстом, в том числе в тестах и документации. Не преобразуйте
все строки с маркерами в исключения автоматически. Рассматривайте любое новое исключение как
изменение, критичное для безопасности.
Хук pre-push читает исключения из объявленного базового коммита назначения, а не из рабочей копии или коммитов-кандидатов. Новое или расширенное исключение должно быть проверено и установлено отдельно, прежде чем оно сможет освободить последующий push. Для 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/ и не имеет runtime-зависимостей,
внешних скриптов, аналитики или удалённых ресурсов. Её можно разместить
с помощью GitHub Pages из каталога docs/ или развернуть на Netlify с помощью
включённого netlify.toml (без команды сборки; каталог публикации docs).
Текущий проект Netlify использует ручные развёртывания. Один лишь Git push не
обновляет публичную страницу: публикуйте содержимое docs/ после каждого релиза и
проверяйте живую версию, социальное изображение и заголовки ответов. Файл docs/_headers
сохраняет заголовки безопасности при прямом развёртывании этого каталога.
--send включает агрегированные
оповещения на настроенные назначения; Git-защита остаётся офлайн.git только для чтения диффов коммитов, отправляемых деревьев,
настроенных путей хуков и метаданных игнорирования. Существующая точка входа хука
сохранена, а проверка сырого содержимого и исходящей истории усилена.$HOME, и не запускает дочерние
процессы, включая Git.$XDG_STATE_HOME/push-guard-sweep/fp.key (по умолчанию
~/.local/state/push-guard-sweep/fp.key) для стабильных, непредсказуемых отпечатков.
Этот ключ является явным исключением из правила «по умолчанию данные не хранятся». Он не содержит
отсканированных данных. Каталог состояния имеет права 0700, а файлы создаются с правами 0600.--baseline и --output содержат отредактированные локальные метаданные;
--send сохраняет ключевые квитанции дедупликации, но никогда не учётные данные оповещений или секреты.Блокировка push — это ответ Git на рекомендацию. Push Guard остаётся работающим только на чтение
и не изменяет файлы. Обход доступен через git push --no-verify,
когда известно, что совпавшее значение не является секретом.
Команда push-guard sweep и псевдоним push-guard-sweep обеспечивают одинаковую локальную
проверку. Они требуют Python 3.11 или новее из существующего пакета и не имеют
дополнительных зависимостей времени выполнения. Тесты разработки используют необязательный extra test
(python -m pip install ".[test]", затем PYTHONPATH=src python -m pytest -q
из корня репозитория). Релиз 0.4.0 добавляет Sweep. CI устанавливает этот
extra для разработки и запускает весь набор тестов pytest, включая устаревшие
случаи unittest. Тесты релиза выполняются в
отдельной задаче; эта задача никогда не передаёт артефакты дистрибутива в публикацию. Задача
сборки артефактов не устанавливает тестовые зависимости. 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
Каждое сканирование также учитывает перечисленные ниже расположения по умолчанию: историю, dotfile-файлы, конфигурации и логи. --roots изменяет корни поиска .env* и пользовательских include-шаблонов; используйте --exclude, чтобы сузить остальные наборы по умолчанию. Повторяющийся --include GLOB добавляет файлы в рамках существующих ограниченных поисков, а повторяющийся --exclude GLOB удаляет пути. Glob-шаблоны сопоставляются с базовыми именами, путями относительно HOME или абсолютными путями. Исключения имеют приоритет; include-шаблоны не могут переопределить исключения безопасности или ограничения глубины. ~ в аргументах путей CLI раскрывается. Сканируемые пути должны оставаться внутри $HOME.
.lesshst. Текст истории оболочки SQLite отделён от файлов баз данных..bashrc, .zshrc, .profile, .bash_profile, .npmrc и .docker/config.json; отдельные файлы JSON, TOML, YAML, INI и CONF в .config на глубине не более четырёх уровней каталогов ниже него..env*: в выбранных корнях (по умолчанию HOME), на глубине не более шести уровней каталогов. Деревья зависимостей, виртуальные окружения, метаданные Git и кэши исключаются из этого поиска..log и файлы внутри logs/, на глубине не более четырёх уровней каталогов ниже .local/state, .cache, .codex, .config/Cursor/logs и настроенных log_dirs.