Каждый веб-проект работает с секретами: ключами платёжного шлюза, токеном Telegram-бота, паролем от базы данных, доступами к CRM и 1С. Пока они лежат правильно, о них никто не вспоминает, но один случайный коммит или скриншот — и ключ уже в открытом доступе. По данным GitGuardian, только за 2023 год в публичных репозиториях GitHub было найдено более 12,7 млн новых секретов — на 34% больше, чем годом ранее. Последствия утечки измеряются деньгами: списания за чужие API-запросы, спам по вашей клиентской базе, компрометация данных покупателей. Разбираем практические правила хранения секретов, которые стоит проверить в своём проекте уже сегодня.
Переменные окружения простыми словами
Секрет — это не часть логики сайта, а настройка доступа к внешним системам, поэтому хранить его нужно отдельно от кода. Для этого используют переменные окружения: обычно это файл.env на сервере со строками вида DB_PASSWORD=... или TELEGRAM_TOKEN=..., и он не попадает в репозиторий. Приложение при запуске читает значения из этого файла, а в коде разработчик видит только имя переменной, но не сам ключ. Бонус подхода: на тестовом стенде и в продакшене можно использовать разные ключи, не меняя ни строчки кода, а перевыпуск ключа не требует релиза.Правило №1: секреты никогда не попадают в Git
Файл.env должен быть добавлен в .gitignore до первого коммита, а в репозитории лежит только шаблон .env.example — с названиями переменных, но пустыми значениями, чтобы новый разработчик понимал, что заполнить. Критичный нюанс, о котором часто не знают: удаление файла из проекта в следующем коммите не помогает — Git хранит всю историю, и любой, у кого есть доступ к репозиторию, вытащит старую версию одной командой. Поэтому если секрет всё же попал в коммит, он считается скомпрометированным, даже если вы «сразу всё удалили». Чистить историю можно инструментами вроде git filter-repo или BFG Repo-Cleaner, но проще и надёжнее сразу перевыпустить ключ.Что именно выносим в переменные окружения
Минимальный список секретов любого веб-проекта выглядит так:- ключи платёжных систем
- токены Telegram-бота и других мессенджеров;
- логин и пароль от базы данных;
- доступы к CRM и 1С, которые используются в интеграциях;
- SMTP-данные почтового сервиса для отправки писем;
- секретные ключи подписи — JWT и вебхуков.
Пять ошибок, из-за которых ключи утекают
Практика показывает, что утечки почти всегда происходят по одному и тому же сценарию:- ключ «зашит» прямо в код и уезжает в репозиторий вместе с ним;
.envзакоммичен командой git add . «по привычке»;- секреты попадают в логи — через debug-вывод переменных или логирование заголовков запросов с токенами;
- ключи остаются на скриншотах и записях демо, которые потом уходят в общий чат;
- секреты размещаются во фронтенде, хотя код в браузере виден любому — там допустимы только публичные ключи.
Логи: тихий канал утечки
Логи копируются, хранятся месяцами и доступны многим: разработчикам, службе поддержки хостинга, сервисам мониторинга. Секреты попадают туда незаметно: упавшее исключение распечатывает весь конфиг, в лог запросов пишется заголовок Authorization с живым токеном, а debug-режим выводит значения переменных окружения. Правила простые: секреты не логируются вообще, токены в логах маскируются (видны только последние 4 символа), debug-режим в продакшене выключен. Доступ к логам выдаётся по принципу минимальных прав — это касается и аутсорс-команды.Скриншоты и демонстрации: недооценённый риск
Классический сценарий: разработчик показывает экран на созвоне с открытым конфигом или кидает в чат скриншот с видимым токеном. Скриншот невозможно «отозвать» — он остаётся в переписке, облаке и записи встречи навсегда. Поэтому перед демонстрацией экрана конфиги закрываются, а для демо и обучающих записей используются тестовые ключи из песочницы провайдера. Если ключ всё-таки попал в кадр — он считается скомпрометированным: перевыпуск занимает минуты, разбор последствий утечки — дни и деньги.Когда проект вырос: менеджеры секретов
Пока команда небольшая, файла.env на сервере с правами доступа 600 достаточно. Но когда разработчиков трое и больше, сред окружения несколько, а деплой идёт через CI/CD, ручное управление перестаёт работать: никто точно не знает, у кого какие копии и кто что менял. На этом этапе переходят к менеджерам секретов или встроенным механизмам CI/CD вроде GitHub Secrets и GitLab CI Variables. Они дают централизованное хранение, разграничение прав по людям, аудит «кто читал ключ» и ротацию без доступа на сервер.Если ключ уже утёк: порядок действий
Действуйте по протоколу, а не по наитию:- немедленно отзовите и перевыпустите ключ у провайдера — до разбирательства, не откладывая;
- проверьте логи и биллинг: были ли чужие запросы и списания;
- убедитесь, что настройки вебхуков и интеграций не подменены — злоумышленник мог перенаправить данные на свой адрес;
- найдите источник утечки: история Git, логи, скриншоты, переписка;
- устраните причину и проведите ревизию остальных секретов — если утёк один, вероятно, доступны и соседние.

