Почему это важно
Ключ API, токен или пароль БД в коде — это не «строчка», это открытая дверь к твоим деньгам, данным и инфраструктуре. Боты круглосуточно сканируют GitHub, npm, Docker Hub и pastebin-ы регулярными выражениями вида sk-..., AKIA..., ghp_... — публичный ключ находят за секунды-минуты, ещё до того как ты успел его удалить.
Живой сценарий. Разработчик закоммитил config.js с ключом OpenAI и AWS-кредами, через 4 минуты запушил фикс с удалением. Поздно: бот уже выкачал ключ из истории коммитов. К утру — счёт на сотни долларов за чужой трафик к модели и поднятые в его AWS майнинг-инстансы. История git помнит всё: даже git rm + новый коммит не убирает секрет из прошлых ревизий.
Что делать (по шагам)
- Вынеси все секреты в
.envи сразу добавь файл в.gitignore— до первого коммита:
# .gitignore
.env
.env.*
!.env.example # шаблон без значений — коммитить можно
# .env (НЕ коммитится)
OPENAI_API_KEY=sk-...
DATABASE_URL=postgres://user:pass@host:5432/db
- Отдельный scope-токен на каждый проект с минимально нужными правами (read-only там, где не нужна запись).
- Ротация по расписанию и немедленно при любом подозрении. Если ключ хоть раз попал в git/чат/скриншот — считай его скомпрометированным и перевыпусти.
- Для команды — менеджер секретов (1Password / HashiCorp Vault / Doppler), а не переписка и не закреп в чате.
- Поставь pre-commit-страховку, чтобы секрет физически не ушёл в коммит:
pip install pre-commit detect-secrets
detect-secrets scan > .secrets.baseline # завести базлайн
# затем добавить хук detect-secrets в .pre-commit-config.yaml
- Если ключ уже утёк в историю — мало удалить файл. Ротируй ключ, затем чисти историю
git filter-repo(или BFG) и форс-пушь по согласованию с командой.
Чего НЕ делать
- Не коммить ключи в git — даже «временно», даже в приватный репозиторий (приватный может стать публичным).
- Не вставляй токены в чаты, ИИ-боты, Issues, скриншоты и публичные репозитории.
- Не давай один «всемогущий» ключ всем сервисам сразу — компрометация одного = компрометация всего.
- Не хардкодь секреты «на минутку для теста» — именно такие коммиты и утекают.
- Не клади
.envв Docker-образ слоемCOPY . .— он останется в слоях образа.
Как проверить себя
- В репозитории нет ни одного реального ключа:
git grep -nE "(sk-|AKIA|ghp_|xox|-----BEGIN)"ничего боевого не находит. -
.envесть в.gitignore, аgit ls-files | grep -i envне показывает боевой.env. - У каждого токена ограниченный scope и понятно, какой именно проект его использует.
- Знаю, как и где перевыпустить каждый ключ (есть ссылка/процедура).
- Прогнал репозиторий сканером секретов хотя бы раз.
Инструменты
- Менеджер секретов команды: 1Password, HashiCorp Vault, Doppler, Infisical.
- Сканеры секретов: gitleaks, detect-secrets, trufflehog.
- Чистка истории git: git-filter-repo, BFG Repo-Cleaner.
- Проверка утечек: GitHub Secret Scanning (Push Protection) — включи в настройках репозитория.