Управление секретами
Что это такое
Управление секретами — это держание ключей API, паролей баз данных, ключей подписи и токенов вне репозитория, вне артефактов сборки и логов, с заданным сроком жизни, чтобы раскрытие было переживаемым. Артефакт — это документированный источник истины для секретов: хранилище секретов или конфигурация окружения, плюс процедура ротации.
Почему это важно
Ключ в репозитории — это ключ, опубликованный для каждого, кто когда-либо клонирует. Ошибка чрезвычайно распространена, потому что локально невидима: однажды закоммиченный файл окружения, строка подключения, вставленная в конфиг, чтобы тесты прошли, токен в логе CI. Особенная ловушка в том, что удаление файла ничего не исправляет — значение остаётся в истории git, в каждом клоне и форке и в кэшах каждого зеркала. Это точка, где большинство читателей уже проиграли, поэтому работа — обнаружение и ротация, а не только предотвращение.
Ключевые идеи
Держите секреты вне репозитория по умолчанию
Загружайте их из окружения или хранилища секретов во время выполнения, а коммитьте только шаблон со списком имён и пустыми или плейсхолдерными значениями.
Коммитится: .env.example DATABASE_URL=
STRIPE_KEY=
Игнорируется: .env (в .gitignore, не коммитится)
Выполняется: хранилище секретов платформы подставляет реальные значения
Запись в .gitignore — это ограждение, а не контроль: она останавливает случайный git add ., и ничего больше.
Удаление файла не убирает секрет
Значение живёт в истории. Должно произойти одно из трёх: ротация учётных данных, чтобы раскрытое значение обесценилось, очистка истории на каждом клоне или осознанное принятие раскрытия. Ротация почти всегда самое дешёвое из трёх.
1. Ротация: выпустить новый ключ, развернуть, отозвать старый
2. Очистка (если требуется): переписать историю И заставить всех соавторов переклонировать
3. Ни то ни другое: ключ публичен навсегда; считайте его таким
Дайте каждому секрету срок жизни и владельца
Статические, никогда не ротируемые учётные данные — те, что всплывают в старых резервных копиях. Предпочитайте короткоживущие токены от службы идентичности платформы, где она есть, и ротируйте остальные по расписанию.
Обнаружьте раньше, чем найдут за вас
Включите сканирование публичных репозиториев на стороне провайдера и проверку высокоэнтропийных строк перед коммитом. Секрет, отправленный в 10:00, обычно выгребают в течение минут.
Держите секреты вне логов и отчётов об ошибках
Самый частый канал утечки после репозитория — стек-трейс со строкой подключения или отладочный дамп окружения. Редактируйте конфигурацию в выводе ошибок.
Практика
Ищите в истории, а не только в рабочем дереве
Просмотрите всю историю git на предмет возможных шаблонов секретов и имён ваших секретных переменных.
Готово, когда: у вас есть список всех учётных данных, когда-либо закоммиченных, с решением по каждому — ротация, очистка или принятие.
Ротируйте одни раскрытые учётные данные от начала до конца
Возьмите один ключ из списка, выпустите замену, разверните её, убедитесь, что старый перестал работать, и отзовите его.
Готово, когда: старое значение возвращает ошибку авторизации, а новое загружается из хранилища секретов, а не из файла.
Частые ошибки
- Коммит файла окружения — ключ опубликован для каждого с клоном; исправить: коммитьте только шаблон, а настоящий файл игнорируйте.
- Удалить файл и счесть вопрос закрытым — значение остаётся в истории и в каждом клоне; исправить: ротируйте учётные данные.
- Одни учётные данные на все окружения — утечка стенда раскрывает продакшен; исправить: разделяйте учётные данные по окружениям.
- Нет ротации — ключ действителен годами и обнаруживается в резервной копии; исправить: короткие сроки жизни где возможно, ротация по расписанию иначе.
- Секреты в логах или ошибках — утечка происходит после того, как все прочие контроли пройдены; исправить: редактируйте конфигурацию в выводе логов и ошибок.
Что читать дальше
- Веб-безопасность (OWASP Top 10) (07-security/01-web-security-owasp-top-10) — классы недостатков, превращающие утёкшие учётные данные во вторжение.
- Сканирование зависимостей (SCA) (07-security/04-dependency-scanning-sca) — другой путь, которым секреты и уязвимый код попадают в проект.
- HTTPS и TLS (07-security/02-https-tls) — учётные данные, отправленные по сломанному каналу, раскрываются ещё до использования.
- Управление пакетами (npm) (02-frontend/04-package-management-npm) — где живут токены публикации пакетов и как они утекают.