Управление секретами
Секреты — пароли, ключи и токены — нельзя держать в исходном коде; для них есть отдельные защищённые механизмы.
Секрет — любой чувствительный параметр доступа: пароль к БД, API-ключ, ключ шифрования, токен. Его утечка открывает доступ к системе.
Утечка секрета часто страшнее бага: с валидным ключом злоумышленник просто входит как свой. Поэтому управление секретами — отдельная дисциплина.
Почему нельзя хранить секреты в коде
Секрет, вписанный прямо в исходник (hardcoded), попадает в систему контроля версий и остаётся в истории навсегда — даже если вы его потом удалите. Любой, у кого есть доступ к репозиторию (или к утёкшему репозиторию), получает ключ. Публичные репозитории регулярно сканируются ботами в поисках случайно закоммиченных ключей.
// ПЛОХО: секрет в коде, попадёт в git навсегда
DB_PASSWORD = "super-secret-123"
// ХОРОШО: секрет берётся из окружения
DB_PASSWORD = читать_из_окружения("DB_PASSWORD")Где хранить секреты
- Переменные окружения — базовый подход: секрет задаётся в окружении процесса, а не в коде. Файл с ними (например, .env) исключают из репозитория.
- Секрет-менеджеры — специализированные хранилища, которые шифруют секреты, контролируют доступ и ведут аудит обращений. Подходят для продакшена и команд.
Ротация и реагирование
Ротация — периодическая замена секретов. Если ключ всё же утёк, его нужно немедленно отозвать и заменить, а не «надеяться, что не заметят». Срок жизни скомпрометированного секрета должен быть минимальным.
Как защищаться
- Никогда не коммитьте секреты; добавьте файлы с ними в .gitignore.
- Берите секреты из переменных окружения или секрет-менеджера.
- Используйте сканеры секретов (secret scanning), чтобы ловить случайные коммиты ключей.
- Если секрет утёк — отзывайте и меняйте немедленно, не «зачищайте» только из истории.
- Давайте каждому секрету минимальные права (least privilege) и срок жизни.
Частые ошибки разработчиков
- Коммитят .env с ключами, а потом думают, что
git rmубрал их из истории (нет, они остаются). - Кладут ключи в фронтенд-код — там их видит любой пользователь.
- После утечки только удаляют ключ из репозитория, но не отзывают сам ключ.
Итог
- Секреты не место в коде: git хранит их в истории навсегда.
- Используйте переменные окружения и секрет-менеджеры.
- Внедрите сканирование секретов и немедленную ротацию при утечке.