Безопасность

·5 мин чтения·Обновлено

Secrets Management: почему пароли и ключи не должны жить в коде

Удалить ключ из файла недостаточно. Разбираем его отзыв, безопасную замену и проверку приложений, которые могли сохранить прежнее значение.

Ключ почтового сервиса случайно попал в репозиторий. Его быстро удалили из файла и закрыли задачу. Но прежний ключ продолжает работать: он остался в истории, сборочных артефактах и, возможно, уже скопирован. Удаление строки изменило видимый код, а не полномочия того, кто этой строкой располагает.

Управление секретами начинается с возможности прекратить такой доступ. Хранилище — только часть решения. Компания должна знать владельца ключа, использующие его приложения, разрешённые действия и способ замены. Здесь речь прежде всего об учётных данных приложений и интеграций, а не о требовании регулярно менять личные пароли всех сотрудников.

При утечке сначала лишают полномочий

Удаление секрета из истории не гарантирует его исчезновения из чужих копий. Поэтому GitHub рекомендует сначала отозвать или заменить раскрытые учётные данные. Очистка истории может потребовать отдельной координации и не должна задерживать прекращение доступа.

Для почтовой интеграции это означает проверить, какие действия разрешал ключ, где он использовался и не было ли подозрительных отправок. Затем обеспечить работу приложения с новым доступом и убедиться, что прежний действительно отклоняется поставщиком. Если нужен немедленный отзыв, временная остановка отправки может оказаться необходимой; обещать бесшовную замену при любой аварии неправильно.

Приложение должно сохранить сообщения, которые уже обязалось отправить, и не выдавать отказ авторизации за успешную доставку. После восстановления потребуется безопасно продолжить работу. Это тот участок, где вопрос безопасности становится обычной задачей эксплуатации продукта.

Ключ от хранилища не должен открывать всё

Секреты выносят из исходников в контролируемое хранилище. Но приложению всё равно нужно доказать, кто оно. Если всем сервисам раздать один постоянный пароль администратора хранилища, мы получим новую общую точку риска вместо множества старых файлов.

Где платформа позволяет, приложение использует собственную машинную идентичность и получает только необходимые полномочия. Например, управляемые идентичности Azure позволяют обращаться к поддерживаемым ресурсам без самостоятельно распространяемого пароля. Это конкретная возможность платформы, а не универсальная совместимость с любым внешним API.

Обычные настройки также стоит отделить от секретов. Адрес сервиса не равен паролю к нему. У открытого сертификата и закрытого ключа разные требования к конфиденциальности. Чем яснее этот состав, тем меньше лишних людей и процессов получают чувствительные значения ради редактирования безобидной настройки.

Ротация — изменение двух сторон

Записать новый пароль в хранилище недостаточно: база или партнёр должны начать его принимать, а приложения — использовать. Для плановой замены нужен согласованный порядок подготовки, проверки и перехода. Если поставщик допускает одновременно два ключа, это может дать ограниченное окно совместимости. Если нет, потребуется другой порядок и, возможно, остановка части работы.

Хороший технический пример — четыре этапа ротации AWS Secrets Manager: создать значение, изменить его в целевой системе, проверить и завершить переход. Эти этапы не гарантируют, что каждое приложение уже перечитало настройку. Потребители требуют собственной проверки.

Процесс мог загрузить ключ только при старте, а пул базы — продолжать использовать старые соединения. Поэтому испытание должно включать новое соединение, перезапуск потребителя и отключение прежнего ключа. Без последнего шага успешный тест иногда показывает лишь то, что старый доступ пока ещё работает.

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

Короткий срок помогает только при работающем прекращении доступа

Некоторые системы выдают отдельные временные учётные данные вместо общего постоянного пароля. Так проще связать использование с конкретным потребителем и ограничить срок. Но потребуется продление или получение новых данных, а также корректное поведение после истечения срока. Механизм lease, продления и отзыва описан в документации Vault.

Не стоит приписывать такую механику любой строке, положенной в хранилище. Для статического API-ключа срок записи у нас может ничего не менять у партнёра. Проверять надо действие на стороне, которая принимает ключ. И отдельно — остаются ли установленные сеансы после его отзыва.

Что будет без хранилища секретов

Работающий сервис может какое-то время обходиться уже полученным значением, а новый экземпляр — не суметь запуститься. Поэтому тест одной давно работающей копии не показывает устойчивость всей схемы. Нужно проверить старт, обновление и плановую смену ключа при недоступности зависимости.

Допустимость локального кэширования зависит от срока и риска. Бесконечно использовать старые данные опасно; запрашивать их при каждой операции тоже может создавать лишнюю зависимость. Решение должно учитывать время обновления, отзыв и ограничения хранения. Аварийный доступ не стоит оформлять как всем известный постоянный обход защиты.

В руководстве OWASP управление секретами охватывает выдачу, аудит, замену и завершение использования. Журнал полезен, если показывает, кто запросил доступ и что произошло; сами значения секретов туда попадать не должны. Маскирование в одном интерфейсе не гарантирует, что значение не сохранилось в другом журнале или дампе.

Начать с одной живой интеграции

Выберите ключ с известным владельцем и понятным влиянием на продукт. Найдите рабочие, тестовые и резервные потребители, включая редкие задания. Настройте ограниченную выдачу и выполните замену с проверкой нового подключения. Затем убедитесь, что старое значение больше не даёт разрешённых раньше возможностей.

Для небольшой команды достаточно подходящего механизма существующей платформы; собственное универсальное хранилище не обязательно. Но порядок обнаружения утечки, отзыва и восстановления работы нужен независимо от масштаба. Завершённая задача — не «пароль перенесли», а проверенная возможность заменить его без поисков автора интеграции и с понятной судьбой незавершённой работы.