Перейти к содержимому
>_ITDITDПлатформа веб-безопасности

Руководства по безопасности

Останавливайте секреты до коммита с gitleaks: ловите утечки API-ключей до push

Случайно закоммитите API-ключ — и он останется в истории Git, утёкшим навсегда. Как gitleaks останавливает секреты на двух воротах — хук pre-commit и CI — плюс шаг отзыва, который одно обнаружение не завершает.

Опубликовано 2026-06-12 Обновлено 2026-06-12 6 мин чтения

Для тех, кто использует Git в разработке в одиночку или малой командой и беспокоится «а вдруг я случайно закоммичу API-ключ?» Здесь нет механики атакующего — только механизм для остановки утечки секретов из вашего собственного репозитория.

Взгляд этого сайта: один .gitignore не защитит секреты

«Мой .env в .gitignore, так что всё нормально» — частая фраза, и в ней есть дыры. .gitignore лишь не даёт новым файлам отслеживаться; он не может поймать секреты, уже закоммиченные, принудительно добавленные впопыхах через git add -f или неожиданные имена вроде .env.local.bak. Он блокирует лишь часть входа. Нужно что-то, что реально смотрит в содержимое коммитов и помечает «строки, похожие на секреты» — детектор. Для этого и нужен gitleaks.

Почему останавливать «до коммита»

Секреты опасны тем, что Git хранит историю вечно. Удалите из последнего файла — он остаётся в прошлых коммитах. А в момент push эта история копируется на другие машины, серверы и в логи CI.

остаётся в истории
нет в последнем, но есть в прошлых коммитах
push = распространение
скопировано на другие машины, серверы, в логи CI
нужен отзыв
раз утёкший ключ можно только перевыпустить
двое ворот
остановить на pre-commit и CI

Так что защита секретов — это на самом деле профилактика до утечки, а не восстановление после неё. Та же идея, что и инвентаризация «не оставляйте секреты в публичной директории» (→ инвентаризация веб-корня), перенесённая в мир кода.

Где ставить ворота

На пути секрета от кода к миру можно поставить двое ворот: в момент локального коммита и прямо перед тем, как им поделятся (CI).

секрет в коде

API-ключ, ключ, токен

ворота 1: pre-commit

обнаружить и прервать локально при коммите

ворота 2: CI / cron

обнаружить после push, до merge/деплоя

публично / общий доступ

после этого считать утёкшим

Путь утечки и двое ворот. Pre-commit останавливает локально; CI останавливает до merge/деплоя.

Как встроить gitleaks

1

Сначала просканируйте существующую историю

При внедрении один раз просканируйте всю историю репозитория командой gitleaks detect. Выявить секреты, спящие в прошлых коммитах, — первая задача. Всё найденное здесь, как ниже, считается требующим отзыва.
2

Постройте ворота 1 хуком pre-commit

Запускайте gitleaks protect --staged на каждом коммите, чтобы прерывать на месте любой коммит, содержащий секрет. Добавьте его в фреймворк pre-commit (.pre-commit-config.yaml), чтобы та же проверка применялась у всех, локально.
3

Постройте ворота 2 в CI / cron

Хуки каждый может отключить, так что проверяйте снова до того, как чем-либо поделятся. Запускайте gitleaks detect как задание CI — или, для самостоятельных конфигураций, как периодический скан — чтобы ловить просочившееся (тот же подход машинного мониторинга, что и аудит зависимостей).
4

Настройте ложные срабатывания в .gitleaks.toml

Когда тестовые ключи-заглушки или примеры срабатывают, скорректируйте правила и allowlist в .gitleaks.toml. Правильная практика — не «заглушить», а «записать, почему это безопасно»: исключение без обоснования — семя следующего инцидента.

При обнаружении «отзыв» идёт первым; переписывание истории — потом

Когда вы находите секрет, который был закоммичен и запушен, высший приоритет — отозвать и перевыпустить (сменить) этот ключ или токен. Стереть его из истории через git filter-repo важно, но это лишь уборка, чтобы «остановить дальнейшее распространение». Исходите из того, что секрет, достигший публичного репозитория, форка, лога CI или чужого клона, невосстановим — сначала аннулируйте его, затем чистите историю. Переверните порядок — и его используют, пока вы ещё удаляете.

Опора на .gitignore

  • лишь предотвращает новое отслеживание
  • секреты, уже закоммиченные, проходят насквозь
  • бессилен против git add -f или странных имён файлов
  • не может проверить «я не собирался это добавлять»

gitleaks (обнаружение + практика отзыва)

  • реально инспектирует рабочее дерево и содержимое истории
  • останавливает на двух воротах: pre-commit и CI
  • при обнаружении — процедура, доходящая до отзыва
  • ложные срабатывания исключены с записанным обоснованием

Что делает сам этот сайт

Этот сайт построен на основе полного недопущения секретов в Git — строки подключения и API-ключи живут только в защищённой конфигурации на сервере (env-файл с ограниченными правами), никогда в открытом виде в репозитории или в передаточных заметках (→ держать секреты вне git / самостоятельный Git против GitHub). Поверх этого мы наслаиваем детекторы в расчёте на то, что люди всегда оступятся. Проектирование гарантирует «не клади внутрь», а скан вроде gitleaks ловит «оно всё равно попало» — эти два слоя и есть защита этого сайта от утечки секретов. Сам принцип обращения с секретами продолжается в .env-файлы и секреты и безопасное хранение паролей.

Читать дальше

FAQ

QЧто такое gitleaks?
A

Бесплатный инструмент, сканирующий рабочее дерево и историю коммитов Git-репозитория, чтобы обнаружить, не закоммичены ли секреты — API-ключи, приватные ключи, токены. Он находит «строки, похожие на секреты» по правилам regex и энтропии строк (случайности) и может работать как хук pre-commit или в CI для автоматических проверок.

QРазве помещение в .gitignore не защищает секреты?
A

Недостаточно. .gitignore лишь останавливает «новое отслеживание» — он не умеет обнаруживать секреты, уже закоммиченные, или принудительно добавленные через git add -f. Он блокирует лишь часть аварии, так что сочетайте его с детектором вроде gitleaks и в pre-commit, и в CI.

QЧто если я случайно закоммитил и запушил секрет?
A

Считайте этот секрет утёкшим. Высший приоритет — не переписать историю, а отозвать и сменить (перевыпустить) раскрытый ключ или токен. Исходите из того, что секрет, попавший в публичный репозиторий или лог, нельзя отозвать — сначала аннулируйте его, затем чистите историю и добавьте профилактику (gitleaks).