// Engineering Log
Безопасная разработка: Часть 2 — Секреты в коде
Опубликовано 22.09.2026
// Быстрый маршрут
Эта статья относится к теме Деплой и стабильная работа.
Секрет — любые данные, которые дают доступ к ресурсу: пароль базы данных, API-ключ платёжной системы или облака, токен бота, приватный SSH-ключ. Если такой секрет попал в Git, удаление в следующем коммите ничего не исправляет: Git хранит всю историю, и старая версия файла доступна каждому, у кого есть копия репозитория. Автоматические сканеры постоянно просматривают публичные репозитории, поэтому ключ, попавший в публичный коммит, нужно считать скомпрометированным сразу.
Если секрет уже утёк
Порядок действий важнее инструментов:
- Отозвать или сменить секрет у поставщика: создать новый ключ, старый деактивировать, пароль базы данных сменить. Это единственный шаг, который действительно закрывает доступ.
- Проверить журналы доступа сервиса, к которому относился ключ: не использовал ли его кто-то посторонний.
- Сменить связанные доступы. Если утёк пароль, который использовался в нескольких местах, его меняют везде.
- Только после этого чистить историю репозитория. Проект Git рекомендует для этого git filter-repo вместо устаревшего
git filter-branch:
# удалить файл из всей истории
git filter-repo --path config/secrets.yml --invert-paths
# заменить строки из файла replacements.txt во всех коммитах
git filter-repo --replace-text replacements.txtПосле переписывания истории нужна принудительная отправка в удалённый репозиторий, а все участники должны заново клонировать проект. Копии, которые уже разошлись — форки, локальные клоны, кеши CI, — чистка не затрагивает. Поэтому она не заменяет первый шаг, а только убирает следы.
Где хранить секреты
- В разработке — в файле
.env, который перечислен в.gitignore. В репозиторий кладут.env.exampleс именами переменных и пустыми значениями, чтобы коллеги знали, что нужно заполнить. - В CI/CD — в защищённых переменных проекта: masked и protected в GitLab, secrets в GitHub Actions.
- На серверах — в окружении сервиса или в отдельном хранилище секретов, но не в коде и не в Docker-образе.
Если .env уже попал в репозиторий, одного добавления в .gitignore мало: файл нужно убрать из индекса командой git rm --cached .env — и, конечно, сменить всё, что в нём было.
Gitleaks
Gitleaks ищет в репозиториях и каталогах пароли, ключи и токены по набору регулярных выражений для сотен форматов. Лицензия MIT, актуальная версия на сентябрь 2026 года — 8.30.1. Автор объявил инструмент завершённым: новые функции больше не добавляются, выходят только исправления безопасности, а разработка продолжается в новом проекте Betterleaks.
Основные режимы работы:
gitleaks git -v # проверить всю историю текущего репозитория
gitleaks dir . # проверить файлы в каталоге без учёта историиКоманды detect и protect из старых версий объявлены устаревшими, хотя пока работают.
Проверка перед каждым коммитом: pre-commit
Фреймворк pre-commit запускает проверки автоматически при каждом git commit. Установка и подключение Gitleaks:
pip install pre-commitФайл .pre-commit-config.yaml в корне проекта:
repos:
- repo: https://github.com/gitleaks/gitleaks
rev: v8.30.1
hooks:
- id: gitleakspre-commit install # подключить хук к репозиторию
pre-commit run --all-files # проверить все файлы сразу после подключения
pre-commit autoupdate # обновить версии хуковЕсли Gitleaks найдёт секрет, коммит не состоится. Проверку можно пропустить переменной SKIP=gitleaks, поэтому локальный хук — удобство для разработчика, а не гарантия.
TruffleHog
TruffleHog решает ту же задачу, но умеет проверять найденное: для многих типов ключей он обращается к API поставщика и сообщает, действует ли ключ. Лицензия AGPL-3.0, актуальная версия — 3.97.5.
trufflehog git https://git.example.ru/team/project.git --results=verifiedФлаг --results=verified оставляет в отчёте только ключи, подтверждённые как действующие. Такие находки требуют немедленной смены секрета.
Проверка на сервере
Раз локальную проверку можно отключить, её повторяют в пайплайне — первой задачей, до сборки и тестов. Для GitHub Actions у Gitleaks есть готовое действие gitleaks-action; в GitLab CI и Gitea Actions достаточно задачи, которая запускает gitleaks git в каталоге проекта. Такая задача должна останавливать пайплайн при любой находке.
У GitHub есть и собственная защита — push protection. Для личных аккаунтов она включена по умолчанию и не даёт отправить секрет в публичный репозиторий. Защита на уровне репозитория, которая действует и для закрытых проектов, требует платной функции GitHub Secret Protection и включается администратором.
Типичные ошибки
- Удалить файл новым коммитом и считать проблему решённой. Секрет остаётся в истории.
- Чистить историю вместо смены ключа. Копии репозитория уже существуют.
- Печатать секреты в журналах CI. Команда
echo $TOKENдля отладки выводит ключ в журнал сборки; защищённые переменные маскируются, но полагаться только на это не стоит. - Передавать секреты в Docker-образ через
ARGилиENV. Они сохраняются в слоях образа; правильный способ — секреты BuildKit. - Один и тот же ключ для разработки и продакшена. Утечка тестового окружения открывает доступ к рабочему.
// Похожая задача
Если у вас похожая ситуация
Эта статья относится к одной из рабочих тем. Можно продолжить чтение по теме, перейти на главную, чтобы понять, чем я занимаюсь, или сразу открыть услуги.
Тема статьи
Деплой и стабильная работа
Docker, CI/CD, релизы, мониторинг, observability и разбор инцидентов.
Часто с этим приходят
- Настроить деплой без ручных действий и хаоса
- Подключить мониторинг, алерты и базовую observability
- Разобрать инциденты и стабилизировать production
// Следующий шаг
Если вам нужна не только статья, а помощь по этой теме, удобнее сразу перейти в услугу. Главная и подборка материалов остаются рядом.
Открыть услуги// Reviews
Отзывы по теме
Пришел с дорогим запросом по настройке VPS-сервера, но в процессе консультации Михаил предложил гораздо более простое и экономичное решение. В итоге сэкономил бюджет и время. Михаил — настоящий эксперт, который работает на результат клиента, а не на чек. Рекомендую!
Пришел с дорогим запросом по настройке VPS-сервера, но в процессе консультации Михаил предложил гораздо более простое и экономичное решение. В итоге сэкономил бюджет и время. Михаил — настоящий эксперт, который работает …
Настройка vps, настройка сервера
12.05.2026 · ★ 5/5
Отличная работа! Очень быстро настроил сервер, установил панель, прописал IP. Однозначно могу порекомендовать!
Отличная работа ! Очень быстро настроил сервер, установил панель прописал IP Однозначно могу по рекомендовать !
Всё отлично, помог оперативно и профессионально, спасибо, рекомендую сообществу
Всё отлично, помог оперативно и профессионально, спасибо, рекомендую сообществу
Настройка vps, настройка сервера
16.04.2026 · ★ 5/5
Было несколько проблем касаясь как технической части так и понимания в целом. Михаил быстро ответил на запрос, помог разобраться и решил проблеммы технические и помог разобраться в понимании, за что отдельное спасибо. Результатом доволен.
Было несколько проблем касаясь как технической части так и понимания в целом. Михаил быстро ответил на запрос, помог разобраться и решил проблеммы технические и помог разобраться в понимании, за что отдельное спасибо. …
Настройка vps, настройка сервера
18.02.2026 · ★ 5/5
Все было сделано быстро и четко. Рекомендую
Все было сделано быстро и четко. Рекомендую
Настройка vps, настройка сервера
17.01.2026 · ★ 5/5
Всё прошло хорошо, исполнитель быстро реагировал на вопросы и помог решить проблему. Спасибо!
Всё прошло хорошо, исполнитель быстро реагировал на вопросы и помог решить проблему. Спасибо!
Настройка vps, настройка сервера
16.12.2025 · ★ 5/5
// Contact
Нужна помощь?
Свяжись со мной и я помогу решить проблему
Написать в TelegramОтвечаю в течение рабочего дня (03:00–13:00 GMT)
Или оставьте заявку здесь:
// Related