Secrets management — это не выбор “Vault или Secrets Manager”, а контроль всего жизненного цикла секрета: создание, хранение, выдача приложению, появление копий, ротация, отзыв и аудит.
Секрет может храниться правильно, но утечь уже после выдачи: через CI-логи, Helm values, слой Docker-образа, переменную окружения, аварийный дамп, kubectl describe, бэкап etcd или слишком широкие права service account. Поэтому защищать нужно не только хранилище, а весь маршрут секрета.
Инструменты закрывают разные роли:
- Vault — источник истины, контроль доступа, динамические и короткоживущие секреты, подробный аудит;
- Cloud secrets manager — управляемое хранилище секретов с IAM, KMS, ротацией и облачным аудитом;
- Kubernetes Secrets — механизм доставки значения внутри кластера, но не полноценная стратегия управления секретами;
- External Secrets Operator — синхронизатор, который переносит секрет из внешнего источника в Kubernetes, но не устраняет риски Kubernetes-слоя.
Главный принцип: у секрета должен быть один управляемый источник истины, а все копии должны иметь понятный срок жизни, ограниченные права и путь отзыва. Если секрет попал в Git, CI-лог, Docker-слой или Helm-релиз, его нужно считать скомпрометированным: исправить файл недостаточно, нужна ротация и проверка, что старый доступ больше не работает.
Что такое Secrets Management и зачем он нужен

После TL;DR стоит начать с терминов. Secrets Management — это управление чувствительными техническими значениями, которые дают доступ к системам, данным и инфраструктуре. Речь не только о паролях: секретом может быть любая строка, файл, сертификат или ключ, с помощью которых приложение, пользователь или пайплайн получает доступ к ресурсу.
Чтобы не сводить секреты только к паролям, их удобно разделить на несколько групп:
| Что считается секретом | Примеры |
| Учётные данные | Пароли баз данных, логины сервисных аккаунтов, строки подключения |
| Токены и ключи доступа | API-ключи, OAuth-токены, cloud credentials, временные credentials |
| Криптографические материалы | Приватные ключи, ключи шифрования, сертификаты |
| Сервисные параметры доступа | Webhook secrets, signing keys, токены интеграций и CI/CD |
Задача secrets management — не просто убрать пароль из кода. Нужно сделать так, чтобы секрет хранился в контролируемом месте, имел однозначного владельца (ответственного за него человека), выдавался только проверенным приложениям и пользователям, имел ограниченную область действия, регулярно обновлялся, мог быть быстро отозван и оставлял следы в аудите.
Без такой схемы секреты начинают жить как обычные строки. Их копируют в .env-файлы, отправляют в чат, кладут в CI/CD variables без ротации, добавляют в Helm values, передают через переменные окружения, записывают в логи или случайно сохраняют внутри Docker-образа. Команда может думать, что “пароли больше не в коде”, но фактически они остаются в десятке других мест.
Последствия обычно проявляются не сразу. Утекший токен может дать доступ к базе, облачному аккаунту, production API или внутреннему сервису. Если секрет долгоживущий и не привязан к конкретной роли, среде или workload, радиус поражения становится шире: один ключ открывает больше систем, чем нужно конкретному приложению.
Владелец секрета
Важным и часто забываемым моментом является определение владельца секрета. Это человек, который отвечает за секрет - где он используется, как используется, для чего используется, обеспечивает контроль за сроком жизни и ротацию. Без назначенного владельца, и если владелец размыт (команда DevOps-инженеров), рано или поздно может возникнуть ситуация, когда при плановой и неплановой ротации секрета что-то не учтено и приложение теряет нужный доступ.
Жизненный цикл секрета: от создания до аудита

В одной из предыдущих глав мы зафиксировали главное: секрет — это не просто пароль или токен, который нужно “куда-то положить”. Это значение, которое проходит через разные среды, инструменты и процессы. Поэтому дальше важно смотреть не только на место хранения, а на весь жизненный цикл секрета.
Если не описать этот жизненный цикл, любой менеджер секретов легко превращается в “надёжное место, куда положили пароль”. Но утечка часто случается не в момент хранения, а до записи в Vault или cloud secrets manager — либо уже после выдачи приложению. Поэтому секрет нужно рассматривать как объект в движении: на каждом этапе меняются участники, права, копии и модель риска.
Сначала стоит разобрать путь до выдачи секрета приложению:
| Этап | Что происходит | Где риск |
| Создание | Секрет появляется у разработчика, администратора, CI/CD-пайплайна, автоматизированного сервиса или через cloud API | Значение остаётся в локальном файле, истории shell, временном артефакте сборки или диагностическом логе |
| Хранение | Выбирается источник истины: Vault или cloud secrets manager | Kubernetes Secret ошибочно используют как главное хранилище без полноценной модели ротации, отзыва и владения |
| Аутентификация приложения | Приложение доказывает право на доступ через service account, IAM-роль, workload identity, токен и политику | Доступ выдаётся слишком широкой роли или не привязан к конкретной workload |
| Выдача | Секрет передаётся через прямой запрос, синхронизацию в Kubernetes, файл, volume mount или переменную окружения | Появляются копии, которые живут уже по правилам среды доставки, а не только secret manager |
После выдачи риск не заканчивается. Секрет попадает в процесс приложения, начинает использоваться в подключениях и может появиться в памяти, логах, дампах или диагностике. Поэтому вторая часть жизненного цикла отвечает уже не за “где хранить”, а за “как безопасно использовать, обновлять, отзывать и проверять доступ”:
| Этап | Что происходит | Где риск |
| Использование | Приложение применяет секрет для подключения к базе, API или внешнему сервису | Значение попадает в память процесса, трассировку, аварийный дамп или внутренний лог |
| Ротация | Создаётся новое значение, доставляется потребителям, проверяется переключение | Старый секрет остаётся рабочим, потому что приложение не перезагрузилось или не обновило подключение |
| Отзыв или истечение | Старый пароль, токен, сессия или учётная запись прекращают действовать | Копия секрета где-то осталась и продолжает давать доступ, временный токен по факту становится постоянным |
| Аудит | Фиксируются выдача, изменение, отзыв и неуспешные попытки доступа | Хранилище видит факт получения секрета, но не всегда видит, что приложение сделало с ним дальше |
Если контролируется только хранение, схема остаётся хрупкой. Менеджер секретов снижает риск, но не закрывает автоматически выдачу, копии в Kubernetes и CI/CD, обновление потребителей и отзыв старых значений.
Например, пароль к базе может создать пайплайн, записать его в cloud secrets manager, затем приложение получит доступ через IAM-роль, значение окажется в pod как файл, после чего при ротации будет заменено и старое значение отозвано. В этом сценарии важно не название инструмента, а управляемость переходов между этапами: кто создал секрет, кто запросил, где появилась копия, когда она обновилась и можно ли доказать, что доступ был легитимным.
Именно поэтому инструменты нужно сравнивать не как конкурирующие “сейфы”, а как разные слои одного маршрута.
Один отвечает за источник истины и политики доступа, другой — за синхронизацию, третий — за доставку значения в Kubernetes, а способ передачи в pod определяет, где появится следующая копия секрета. Следующая глава разделяет эти роли и показывает, где заканчивается зона ответственности Vault или cloud secrets manager и где начинаются риски Kubernetes-слоя.
Роли инструментов: хранилище, синхронизация и доставка — разные слои

Kubernetes Secrets: доставка внутри кластера
Kubernetes Secrets полезны, когда приложению нужен стандартный объект внутри кластера: файл в volume, значение для конфигурации или интеграция с контроллером. Но Kubernetes Secret не должен автоматически считаться полноценной стратегией управления секретами.
По умолчанию base64 — это кодирование, а не шифрование. Без дополнительной настройки секрет хранится в Kubernetes API и обычно в etcd, а его безопасность зависит от шифрования etcd, RBAC, service accounts, namespaces, доступа pod’ов, бэкапов и аудита Kubernetes.
Главный риск Kubernetes Secrets — широкая зона чтения. Если у роли, оператора, контроллера или сервисного аккаунта есть доступ к секретам namespace, внешнее хранилище уже не помогает: копия значения существует внутри кластера и должна защищаться отдельно.
Vault: источник истины и контроль выдачи
Vault сильнее всего там, где нужен строгий контроль доступа, короткоживущие или динамические секреты, отзыв, детальные политики и подробный аудит. Его модель можно описать как auth → policy → token → access: рабочая нагрузка проходит аутентификацию, получает политику, затем токен с ограниченными правами и только после этого доступ к конкретному секрету.
Преимущество Vault — управляемая выдача. Он может не просто хранить статический пароль, а выпускать временные учётные данные, ограничивать срок жизни, отзывать доступ и фиксировать действия в аудит-логах.
Но Vault требует эксплуатации: отказоустойчивости, распечатывания или автораспечатывания, резервных копий, обновлений, политик, мониторинга и готовности разбирать инциденты. Если у команды нет ресурсов на сопровождение, Vault может стать не усилением безопасности, а новой критичной платформой без достаточной поддержки.
Cloud secrets manager: управляемый источник истины

Cloud secrets manager снимает часть операционной нагрузки, потому что работает как управляемый сервис провайдера. В AWS это может быть связка Secrets Manager, KMS, IAM, ресурсных политик, CloudTrail и CloudWatch. В Google Cloud и Azure похожую роль выполняют Google Secret Manager и Azure Key Vault.
Такой подход удобен, если инфраструктура в основном живёт в одном облаке и модель доступа можно выразить через IAM, KMS/HSM, политики ресурса и облачный аудит. Команда получает управляемое хранилище, встроенную интеграцию с облачными сервисами и меньше задач по эксплуатации самой платформы секретов.
Главный риск — зависимость от облачной модели прав. Если IAM-роли слишком широкие, аккаунты плохо разделены, а политики ресурса настроены “на всякий случай”, cloud secrets manager не спасает от легитимного, но избыточного доступа.
External Secrets Operator: синхронизация, а не защита сама по себе
External Secrets Operator не становится самостоятельным хранилищем секретов. Его задача — взять значение из внешнего источника, например Vault или cloud secrets manager, и создать или обновить Kubernetes Secret в нужном namespace.
Это полезно: секреты не нужно хранить в Git или вручную переносить в кластер. Но ESO не устраняет риски Kubernetes-слоя. После синхронизации значение всё равно существует как Kubernetes Secret, а значит зависит от RBAC, service accounts, etcd, доступа pod’ов, аудита и бэкапов кластера.
Для чувствительных сценариев права ESO должны быть минимальными: читать только нужные секреты во внешнем источнике и записывать только в ограниченный набор namespaces. Иначе синхронизатор превращается в механизм автоматического размножения чувствительных данных по кластеру.
Как эти роли собираются в одну схему
В рабочей архитектуре инструменты обычно не заменяют друг друга, а собираются в цепочку:
- Источник истины — Vault или cloud secrets manager хранит оригинал секрета, управляет доступом, ротацией и аудитом.
- Идентичность workload — приложение, pod, CI/CD-job или сервисный аккаунт доказывает, что имеет право запросить секрет.
- Синхронизация или выдача — секрет либо запрашивается напрямую, либо передаётся через External Secrets Operator, Secrets Store CSI Driver или другой механизм доставки.
- Локальная копия — в Kubernetes появляется Secret, файл в volume, переменная окружения или другой способ передачи значения в процесс.
- Использование приложением — приложение подключается к базе, API или внешнему сервису и не должно писать секрет в логи, дампы или трассировки.
- Ротация и отзыв — новое значение доставляется потребителям, старое перестаёт работать, а события фиксируются в аудите.
Из этого следует практический вывод: после передачи секрета на следующий слой его нужно защищать как отдельный экземпляр. Нельзя считать Kubernetes Secret “безопасным автоматически” только потому, что оригинал лежит в Vault или cloud secrets manager.
Дальше можно переходить к выбору подхода по сценариям. Для небольшого проекта, Kubernetes-кластера, регулируемой нагрузки и CI/CD схема будет разной: где-то достаточно cloud secrets manager, где-то нужен Vault, а где-то Kubernetes Secrets и External Secrets Operator остаются только слоем доставки.
Как выбрать подход: небольшой проект, Kubernetes-кластер, регулируемая нагрузка и CI/CD

Небольшой проект
Для небольшого проекта обычно разумнее начать с cloud secrets manager как источника истины. Если приложение живёт в одном облаке, доступ можно выразить через IAM, а секреты защищаются через KMS, политики доступа, аудит и ротацию критичных значений.
В этом сценарии не стоит поднимать собственный Vault без команды сопровождения. Он может быть технически более развитым и гибким, но добавит затраты на эксплуатацию: отказоустойчивость, обновления, политики, резервные копии, мониторинг и реагирование на инциденты.
Минимальная схема для небольшого проекта: отдельные секреты по средам, минимальные права, журналирование доступа, ротация важных ключей и запрет хранения секретов в Git, образах и CI-логах. Если есть Kubernetes-кластер, Kubernetes Secrets можно использовать как слой доставки, а External Secrets Operator — как способ синхронизации из внешнего источника.
Kubernetes-кластер
Для Kubernetes-кластера безопаснее использовать внешний источник истины: Vault или cloud secrets manager. Kubernetes Secret в этой схеме остаётся локальной копией, которая нужна приложению внутри кластера, но не должна быть единственным местом управления секретом.
Здесь важны шифрование etcd, строгий RBAC, отдельные service accounts, разделение namespaces, аудит Kubernetes API и запрет хранения секретов в Git/Helm. Для доставки можно использовать External Secrets Operator или Secrets Store CSI Driver, но они не отменяют риски Kubernetes-слоя.
Vault нужен, если кластеров несколько, политика доступа сложная, нужны короткоживущие учётные данные или единая модель доступа для разных сред. Cloud secrets manager может быть достаточен, если кластер привязан к одному облаку и права удобно описываются через IAM.
Регулируемая нагрузка
Для регулируемой нагрузки важны не только хранение и доставка, но и доказуемость контроля: кто получил секрет, по какой политике, на какой срок, где появилась копия и когда старое значение перестало работать.
Здесь обычно требуется централизованное управление, подробный аудит, KMS или HSM, разделение обязанностей, короткий срок жизни секретов, строгие политики и регулярный отзыв. Vault часто оправдан, если нужны динамические секреты, изоляция команд или арендаторов, тонкие политики и единая модель доступа вне одного облака.
Cloud secrets manager тоже может быть достаточен, если требования закрываются облачным аудитом, KMS/HSM, IAM и политиками доступа. Но Kubernetes Secrets в regulated-сценарии должны оставаться только контролируемой точкой выдачи, а не основным хранилищем.
External Secrets Operator здесь важно не переоценивать. Он может быть полезным транспортным слоем: забрать значение из Vault, AWS Secrets Manager, Google Secret Manager или Azure Key Vault и создать Kubernetes Secret в нужном namespace. Но ESO не доказывает соответствие требованиям аудита и не управляет сроком жизни копии сам по себе. Права оператора должны быть минимальными: только чтение конкретных секретов во внешнем источнике и запись в ограниченный набор namespaces.
CI/CD
В CI/CD главный риск — долгоживущие ключи в настройках пайплайна. Лучше использовать учётные данные с областью действия в пределах конкретной задачи, разделение dev/stage/prod, OIDC или workload identity, короткие токены и автоматический отзыв после выполнения job.
Если пайплайну нужно получить доступ к облаку, базе данных или API, желательно не хранить постоянный ключ в переменных CI/CD. Более безопасная схема — выдать временный доступ на время задачи и зафиксировать это в аудите.
Vault нужен, если пайплайны должны получать динамические доступы к базам, облакам и внутренним API. Cloud secrets manager достаточен, если CI/CD интегрирован с облачным IAM и OIDC без постоянных ключей. Kubernetes Secrets обычно не являются источником для CI/CD, но могут появляться на этапе деплоя, когда секреты доставляются в кластер через ESO или другой механизм.
Итог простой: выбор определяется не размером проекта и не “самым безопасным” инструментом, а управляемостью. Нужно учитывать минимальные права, аудит, скорость отзыва, радиус поражения и наличие команды, которая сможет сопровождать выбранную схему.
Где секреты действительно утекают: Git, логи CI/CD, образы, Helm values и переменные окружения

В предыдущих главах мы разделили роли инструментов и выбрали подход под сценарий. Но даже правильная архитектура с Vault или cloud secrets manager не гарантирует, что секрет не окажется в менее защищённом месте. После выдачи значение начинает жить в пайплайнах, манифестах, образах, pod’ах, логах и диагностике.
Типичный пример: пароль хранится в AWS Secrets Manager, пайплайн получает его перед деплоем и случайно печатает в лог из-за echo, set -x, трассировки shell-команд или ошибки curl. Источник защищён, но копия уже стала обычной строкой в CI/CD.
Для ревью инфраструктуры такие места удобнее проверять как маршрут копий секрета:
- Git. Удаление секрета из текущего файла не решает проблему. Значение могло остаться в истории коммитов, форках, зеркалах репозитория и локальных клонах разработчиков.
- Логи CI/CD. Секреты всплывают через отладочный вывод, трассировку команд, дампы переменных, ошибки деплоя и слишком подробные сообщения пайплайна.
- Слои контейнерного образа. Секрет в Dockerfile, build args или временном файле может сохраниться в предыдущем слое, даже если позже файл был удалён.
- Helm values. Values-файлы, шаблоны и metadata релиза могут превратиться в скрытое хранилище секретов, доступное через историю релизов и инструменты деплоя.
- Переменные окружения. Они удобны для запуска, но могут попасть в дампы процесса, отчёты о сбоях, debug endpoints и диагностические утилиты.
В Kubernetes к этому добавляется собственная модель риска. Секрет может раскрыться через kubectl logs, kubectl describe, возможность exec в pod, бэкапы etcd, широкие service accounts и лишние права на чтение секретов в namespace. Это уже не проблема Vault или cloud secrets manager, а проблема копий после выдачи.
Практическое правило простое: если секрет появился в Git, CI/CD-логе, Docker-слое, Helm-релизе или переменной окружения, его нужно считать скомпрометированным. Исправить файл или пайплайн недостаточно. Нужно отозвать старое значение, провести ротацию, обновить потребителей и проверить, что прежний доступ больше не работает.
Именно здесь замыкается вся логика secrets management. Безопасность определяется не только тем, где лежит оригинал секрета, а тем, насколько управляемы его копии, доставка, использование, ротация, отзыв и следы в аудите.
Заключение

Secrets management работает только тогда, когда контролируется весь маршрут секрета: от создания и хранения до выдачи приложению, копий, ротации, отзыва и аудита. Vault, cloud secrets manager, Kubernetes Secrets и External Secrets Operator закрывают разные участки этого маршрута, но ни один инструмент не защищает автоматически все остальные слои.
Практический критерий простой: у секрета должен быть владелец, управляемый источник истины, ограниченная область действия, понятный срок жизни и проверяемый путь отзыва. Если значение попало в Git, CI/CD-лог, Docker-слой, Helm-релиз или переменную окружения, его нужно считать раскрытым: исправить файл недостаточно, старый доступ должен быть отозван и проверен.
FAQ
Можно ли использовать только Kubernetes Secrets?
Можно, но только для ограниченных сценариев: при включённом шифровании etcd, строгом RBAC, разделении service accounts, контроле доступа к pod’ам и настроенном аудите. Kubernetes Secret удобен как механизм доставки внутри кластера, но не заменяет полноценный источник истины с ротацией, отзывом и централизованным аудитом.
Когда нужен Vault, а когда достаточно cloud secrets manager?
Vault оправдан, если нужны динамические секреты, короткоживущие доступы, единые политики для разных сред и детальный контроль выдачи. Cloud secrets manager обычно достаточно, если инфраструктура живёт в одном облаке, а требования закрываются IAM, KMS, ротацией и облачным аудитом.
External Secrets Operator делает Kubernetes Secrets безопаснее?
Не сам по себе. ESO синхронизирует данные из внешнего источника в Kubernetes Secret и помогает убрать секреты из Git, но после синхронизации значение всё равно существует внутри Kubernetes. Значит, его нужно защищать через RBAC, namespaces, service accounts, шифрование etcd, аудит и контроль доступа к pod’ам.
Что безопаснее для pod: переменная окружения или файл в volume?
Оба варианта имеют риски. Переменные окружения чаще попадают в дампы, диагностический вывод и отладочные инструменты. Файл в volume удобнее контролировать правами файловой системы и обновлением, но он тоже остаётся копией секрета внутри pod. Выбор зависит от приложения и модели ротации.
Что делать, если секрет попал в Git или CI-лог?
Считать секрет скомпрометированным. Нужно отозвать или заменить значение, обновить потребителей, проверить, что старый доступ больше не работает, и устранить причину утечки: debug output, echo, set -x, небезопасные Helm values, артефакты сборки или отсутствие secret scanning.
Как уменьшить ущерб при утечке?
Сократить радиус поражения: выдавать доступ только конкретной роли, workload и среде, разделять dev/stage/prod, использовать короткоживущие токены, ограничивать service accounts и IAM-роли, включать аудит и регулярно проверять ротацию. Чем меньше срок жизни и область действия секрета, тем проще локализовать инцидент.
Список источников
1. OWASP Secrets Management Cheat Sheet
2. Kubernetes Documentation: Secrets



