Управление секретами

Секреты — пароли, ключи и токены — нельзя держать в исходном коде; для них есть отдельные защищённые механизмы.

Секрет — любой чувствительный параметр доступа: пароль к БД, API-ключ, ключ шифрования, токен. Его утечка открывает доступ к системе.

Утечка секрета часто страшнее бага: с валидным ключом злоумышленник просто входит как свой. Поэтому управление секретами — отдельная дисциплина.

Почему нельзя хранить секреты в коде

Секрет, вписанный прямо в исходник (hardcoded), попадает в систему контроля версий и остаётся в истории навсегда — даже если вы его потом удалите. Любой, у кого есть доступ к репозиторию (или к утёкшему репозиторию), получает ключ. Публичные репозитории регулярно сканируются ботами в поисках случайно закоммиченных ключей.

// ПЛОХО: секрет в коде, попадёт в git навсегда
DB_PASSWORD = "super-secret-123"

// ХОРОШО: секрет берётся из окружения
DB_PASSWORD = читать_из_окружения("DB_PASSWORD")

Где хранить секреты

  • Переменные окружения — базовый подход: секрет задаётся в окружении процесса, а не в коде. Файл с ними (например, .env) исключают из репозитория.
  • Секрет-менеджеры — специализированные хранилища, которые шифруют секреты, контролируют доступ и ведут аудит обращений. Подходят для продакшена и команд.

Ротация и реагирование

Ротация — периодическая замена секретов. Если ключ всё же утёк, его нужно немедленно отозвать и заменить, а не «надеяться, что не заметят». Срок жизни скомпрометированного секрета должен быть минимальным.

Как защищаться

  • Никогда не коммитьте секреты; добавьте файлы с ними в .gitignore.
  • Берите секреты из переменных окружения или секрет-менеджера.
  • Используйте сканеры секретов (secret scanning), чтобы ловить случайные коммиты ключей.
  • Если секрет утёк — отзывайте и меняйте немедленно, не «зачищайте» только из истории.
  • Давайте каждому секрету минимальные права (least privilege) и срок жизни.

Частые ошибки разработчиков

  • Коммитят .env с ключами, а потом думают, что git rm убрал их из истории (нет, они остаются).
  • Кладут ключи в фронтенд-код — там их видит любой пользователь.
  • После утечки только удаляют ключ из репозитория, но не отзывают сам ключ.

Итог

  • Секреты не место в коде: git хранит их в истории навсегда.
  • Используйте переменные окружения и секрет-менеджеры.
  • Внедрите сканирование секретов и немедленную ротацию при утечке.
Проверьте себя
1. Почему нельзя хранить API-ключ прямо в исходном коде?
AКод будет медленнее
BСекрет попадёт в историю системы контроля версий навсегда и доступен всем с доступом к репозиторию
CКлюч перестанет работать
DЭто удобно и безопасно
2. Что нужно сделать в первую очередь, если секрет утёк?
AУдалить его только из последнего коммита
BНемедленно отозвать и заменить (ротация) сам секрет
CНичего, если репозиторий приватный
DПоменять название переменной