Инструменты управления секретами: Yandex Lockbox, Vault, SOPS

Рейтинг: 61% · 6 голосов
Подробный курс по Terraform и OpenTofu на примерах Yandex Cloud: ресурсы и провайдеры, состояние и бэкенды, модули, циклы и условия HCL, секреты и Lockbox, тестирование, CI/CD и командная работа. С актуализацией на 2026 (Terraform 1.3-1.10, OpenTofu).
Ответить
Аватара пользователя
Vlad_DevOps
Сообщения: 47
Зарегистрирован: 11 май 2026, 05:31

Инструменты управления секретами: Yandex Lockbox, Vault, SOPS

Сообщение Vlad_DevOps »

Оглавление курса (47)
  1. Что такое инфраструктура как код и зачем она нужна
  2. Категории инструментов IaC: чем отличаются Ansible, Packer, Kubernetes и Terraform
  3. Чем Terraform отличается от Ansible, Pulumi и CloudFormation
  4. Как работает Terraform под капотом и кто такой OpenTofu
  5. Установка Terraform и OpenTofu, подготовка Yandex Cloud
  6. Первый ресурс: разворачиваем виртуальную машину в Yandex Cloud
  7. Веб-сервер на ВМ: метаданные, user-data и группы безопасности
  8. Переменные ввода и выходные значения в Terraform
  9. Кластер ВМ: группа экземпляров Yandex Compute Instance Group
  10. Балансировщик нагрузки: Application Load Balancer в Yandex Cloud
  11. Состояние Terraform: что такое tfstate и чем опасен локальный файл
  12. Удалённое хранилище состояния: бэкенд на Yandex Object Storage
  13. Изоляция состояния: рабочие области против раскладки по папкам
  14. Источники данных и terraform_remote_state: связываем компоненты
  15. Модули Terraform: переиспользуем инфраструктуру
  16. Входные, локальные и выходные переменные модуля
  17. Версионирование модулей и подводные камни
  18. Циклы в Terraform: параметр count
  19. Циклы в Terraform: for_each по множествам и картам
  20. Выражения for и строковые директивы
  21. Условная логика: count-трюк, for_each и директива if
  22. Встроенные функции, типы и выражения HCL
  23. Развёртывание без простоя: create_before_destroy
  24. Подводные камни Terraform и рефакторинг с блоком moved
  25. Управление секретами: основы и типы
  26. Инструменты управления секретами: Yandex Lockbox, Vault, SOPS (вы здесь)
  27. Аутентификация провайдера и секреты: сервисные аккаунты и OIDC
  28. Секреты в ресурсах и состоянии, ephemeral-значения
  29. Провайдеры Terraform: установка, версии, required_providers
  30. Несколько копий одного провайдера: alias и мультизона
  31. Несколько провайдеров и аккаунтов: configuration_aliases
  32. Terraform, Docker и Kubernetes: Managed Kubernetes в Yandex Cloud
  33. Код Terraform промышленного уровня: почему это долго
  34. Мелкие компонуемые модули вместо монолита
  35. Тестируемые модули и проверки: validation, precondition, postcondition
  36. Версионирование, публикация модулей и Terragrunt
  37. Ручное тестирование Terraform и очистка ресурсов
  38. Автоматические тесты на Terratest: модульные тесты
  39. Интеграционные и сквозные тесты, пирамида тестирования
  40. Нативный terraform test и статический анализ
  41. Внедрение Terraform в команде: процессы и культура
  42. Конвейер развёртывания прикладного кода
  43. Конвейер инфраструктурного кода и золотое правило Terraform
  44. Стиль, ревью и CI/CD-инструменты: Atlantis, TACOS, policy as code
  45. Что нового в Terraform 1.3-1.10: моды, импорт, провайдер-функции, Stacks
  46. OpenTofu в 2026: чем живёт форк и как мигрировать
  47. Сертификация HashiCorp Terraform Associate и карьера
Рано или поздно в каждом проекте появляется этот момент: ты добавляешь в файл переменных пароль от базы, токен от API или ключ доступа, делаешь git add, и где то на краю сознания мелькает мысль - а нормально ли это вообще? Спойлер: ненормально. Секрет, попавший в git, остаётся в истории навсегда, даже если ты его потом удалишь коммитом. А Terraform любит хранить значения переменных в state, который тоже легко утекает. В этом уроке разберёмся, как держать чувствительные данные подальше от кода и при этом всё равно подсовывать их Terraform - на примере Yandex Lockbox, а заодно посмотрим на HashiCorp Vault и связку SOPS + age.

Почему секреты в коде - это бомба замедленного действия

Терраформ работает с инфраструктурой как код (infrastructure as code, iac), и сама идея iac в том, чтобы всё лежало в репозитории и версионировалось. Беда в том, что секреты в эту картину вписываются плохо. Если ты пишешь пароль прямо в HCL или в terraform.tfvars, ты получаешь три проблемы сразу.
  • Утечка через git. История коммитов хранит всё. Один невнимательный push в публичный репозиторий - и боты находят твой ключ за минуты.
  • Утечка через state. Terraform state - это JSON, где значения ресурсов лежат открытым текстом. Пароль, который ты передал в ресурс, окажется в state как есть. Помечать переменную как sensitive = true помогает только скрыть её в выводе plan, но в state она всё равно ляжет в чистом виде.
  • Невозможность ротации. Поменял пароль в облаке - и забыл обновить в десяти местах. Жёстко вшитые секреты гниют.
Решение простое по идее: секрет должен жить в одном месте, защищённом, с контролем доступа и аудитом, а Terraform пусть забирает его оттуда в момент применения. Это место и называется менеджером секретов.

Изображение

Два подхода: файлы против централизованного сервиса

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

Файловый подход - секреты лежат рядом с кодом, но в зашифрованном виде. Зашифрованный файл можно спокойно коммитить в git: без приватного ключа он бесполезен. Расшифровка происходит локально на машине того, у кого есть ключ. Сюда относится SOPS вместе с age. Плюсы: ничего не нужно поднимать, всё в одном репозитории, отлично для маленьких команд и pet проектов. Минусы: нет централизованной ротации, нет тонкого аудита кто что прочитал, ключи расшифровки надо как то раздать людям.

Централизованный сервис - секреты хранятся в отдельной системе с API, доступ выдаётся по ролям, есть журнал обращений и версии. Сюда относятся Yandex Lockbox, HashiCorp Vault, AWS Secrets Manager. Плюсы: единая точка правды, гранулярный доступ, ротация, аудит. Минусы: это ещё один сервис, за который надо платить или который надо администрировать.
Грубое правило: один человек и пара секретов - бери SOPS. Команда и облачная инфраструктура - бери сервис. В Yandex Cloud этот сервис - Lockbox, и он родной для платформы, так что начнём с него.
Yandex Lockbox: создаём и читаем секрет

Lockbox - это управляемое хранилище секретов в Yandex Cloud. Доступ к нему регулируется через IAM, шифрование - через KMS, а провайдер terraform yandex cloud даёт для работы с ним два ресурса и один data source.

Ключевая модель такая: есть секрет (yandex_lockbox_secret) - это контейнер с именем и метаданными, и есть версия секрета (yandex_lockbox_secret_version) - конкретный набор пар ключ значение. Версии - это важно: каждый раз, когда ты меняешь содержимое, создаётся новая версия, а старые остаются. Это и есть встроенная история, удобная для отката.

Сначала заведём секрет и положим в него версию с парой записей:

Код: Выделить всё

resource "yandex_lockbox_secret" "db" {
  name        = "prod-db-credentials"
  description = "Логин и пароль для прод базы"
  labels = {
    env = "prod"
  }
  deletion_protection = true
}

resource "yandex_lockbox_secret_version" "db_v1" {
  secret_id = yandex_lockbox_secret.db.id

  entries {
    key        = "username"
    text_value = "app_user"
  }
  entries {
    key        = "password"
    text_value = var.db_password
  }
}
Обрати внимание: записи задаются блоками entries, у каждого свой key, а значение - либо text_value (явная строка), либо command (значение генерится скриптом и тогда не попадает в state - удобно). Сам пароль я всё равно не вшиваю в код, а прокидываю через var.db_password, который задаётся переменной окружения TF_VAR_db_password при запуске. То есть пароль проходит через Terraform ровно один раз - чтобы лечь в Lockbox.

Lockbox умеет и сам генерировать пароль, чтобы тебе вообще не пришлось его придумывать. Для этого у секрета есть блок password_payload_specification, и тогда версия создаётся пустой - без entries:

Код: Выделить всё

resource "yandex_lockbox_secret" "generated" {
  name = "service-token"

  password_payload_specification {
    password_key        = "token"
    length              = 24
    include_punctuation = false
  }
}

resource "yandex_lockbox_secret_version" "generated_v1" {
  secret_id = yandex_lockbox_secret.generated.id
}
Теперь самое интересное - как другой код читает секрет из Lockbox. Для этого есть data source yandex_lockbox_secret_version. Указываешь secret_id, и если хочешь конкретную версию - version_id, иначе берётся последняя:

Код: Выделить всё

data "yandex_lockbox_secret_version" "db" {
  secret_id  = yandex_lockbox_secret.db.id
  version_id = yandex_lockbox_secret_version.db_v1.id
}

locals {
  db_password = [
    for e in data.yandex_lockbox_secret_version.db.entries :
    e.text_value if e.key == "password"
  ][0]
}
Data source возвращает список entries, и каждая запись - это объект с полями key и text_value. Чтобы достать нужное значение, фильтруем список по ключу. Дальше local.db_password можно подставить, например, в строку подключения managed PostgreSQL.
Важная деталь из документации: если секрет создаётся в том же проекте, всегда указывай version_id явно. Иначе data source может зацепить не ту версию - например, самую первую, ещё пустую, и ты будешь долго гадать, почему пароль приходит пустым.
HashiCorp Vault и SOPS + age - когда они уместнее

HashiCorp Vault - это тяжёлая артиллерия мира секретов. Он умеет не только хранить статические значения, но и выдавать динамические: например, по запросу создавать временную пару логин пароль для базы, которая сама протухнет через час. Есть свой terraform провайдер vault с ресурсами вроде vault_kv_secret_v2 и data source vault_generic_secret. Если у тебя мультиоблако, строгие требования compliance или нужны короткоживущие учётки - Vault мощнее любого облачного менеджера. Цена за это - его надо развернуть, настроить unseal, бэкапить и обслуживать. Для проекта целиком внутри Yandex Cloud это чаще оверкилл, и Lockbox закрывает 90 процентов задач без головной боли.

SOPS + age - элегантный файловый вариант. SOPS шифрует только значения в YAML или JSON, оставляя ключи и структуру читаемыми, поэтому в git diff видно, какие поля поменялись, но не сами секреты. age - это современный простой инструмент шифрования с короткими ключами, пришедший на смену громоздкому GPG. Зашифрованный secrets.enc.yaml коммитится в репозиторий, а расшифровать его может любой, у кого есть приватный age ключ. В Terraform такие файлы обычно подтягивают через провайдер carlpett/sops и его data source sops_file. Это идеальный выбор, когда нет желания поднимать сервис, а секретов немного.

Кстати, всё сказанное про state и переменные одинаково справедливо и для opentofu - открытого форка Terraform. Lockbox, Vault и SOPS работают с ним точно так же, синтаксис HCL общий.

Типичные грабли
  • Секрет всё равно утёк в state. Помни: когда ты читаешь Lockbox через data source, расшифрованное значение ложится в terraform state. Lockbox защищает хранилище, но не твой state файл. Держи state в зашифрованном backend (Object Storage с KMS) и ограничивай к нему доступ.
  • Забыл про IAM. Сервисный аккаунт, под которым крутится Terraform, должен иметь роль lockbox.payloadViewer, чтобы читать содержимое версий. Без неё apply упадёт с access denied, хотя ресурс существует.
  • Перепутал секрет и версию. yandex_lockbox_secret сам по себе пустой - это просто контейнер. Реальные данные живут в yandex_lockbox_secret_version. Новичок часто пишет entries прямо в секрет и удивляется ошибке.
  • Не указал version_id и поймал пустой результат - см. цитату выше.
  • Положил password_payload_specification и одновременно свои entries в версию. Так нельзя: для секрета со спецификацией пароля версия должна быть без entries.
Мини лаба

Повтори руками, чтобы отложилось:
  • Заведи yandex_lockbox_secret с именем lab-secret и одну версию с двумя записями: api_key и api_url. Пароль прокинь через TF_VAR.
  • Сделай terraform plan и terraform apply, проверь секрет в консоли Yandex Cloud.
  • Добавь второй yandex_lockbox_secret_version с изменённым значением - убедись, что в Lockbox появилось две версии.
  • Через data source yandex_lockbox_secret_version прочитай конкретную версию по version_id и выведи нужное значение в output (с пометкой sensitive = true).
Контрольные вопросы
  • Чем отличается ресурс yandex_lockbox_secret от yandex_lockbox_secret_version и где реально лежат данные?
  • Почему при чтении секрета через data source важно указывать version_id?
  • В каких случаях ты выберешь SOPS + age, а в каких - централизованный сервис вроде Lockbox или Vault?
  • Защищает ли Lockbox твой Terraform state от утечки прочитанного секрета? Что с этим делать?
Итог: что запомнить

Секретам не место в коде и в чистом виде в state. Файловый подход (SOPS + age) хорош для соло и малых команд, централизованный сервис - для командной облачной инфраструктуры. В Yandex Cloud родной выбор - Lockbox: секрет это контейнер (yandex_lockbox_secret), данные это версия (yandex_lockbox_secret_version) с блоками entries, чтение через data source с обязательным version_id, доступ по IAM. Vault бери, когда нужны динамические короткоживущие секреты и ты готов его обслуживать. И всегда помни про защиту самого state - менеджер секретов прикрывает хранилище, а не твой terraform plan apply.
👍3 ❤️1 🔥 😄 🤔3
Аватара пользователя
vovan11
Сообщения: 1
Зарегистрирован: 10 май 2026, 23:52

Re: Инструменты управления секретами: Yandex Lockbox, Vault, SOPS

Сообщение vovan11 »

Спасибо, наконец дошло в чём разница между secret и secret_version, я реально пихал entries прямо в секрет и не понимал чё за ошибка. Теперь ясно что секрет это просто коробка.
👍 ❤️ 🔥 😄 🤔
Аватара пользователя
kanghsi
Сообщения: 1
Зарегистрирован: 17 май 2026, 06:51

Re: Инструменты управления секретами: Yandex Lockbox, Vault, SOPS

Сообщение kanghsi »

А вот про утечку в state прям отрезвило. Думал раз достаю из Lockbox то всё безопасно, а оно в state открытым текстом лежит. Пошёл проверять свой backend в Object Storage.
👍 ❤️1 🔥 😄 🤔2
Ответить
← Предыдущая глава
Управление секретами: основы и типы
Следующая глава →
Аутентификация провайдера и секреты: сервисные аккаунты и OIDC

Все главы курса «Terraform: инфраструктура как код на Yandex Cloud»

Поделиться темой: ✈ Telegram VK
Похожие запросы: управление секретами в terraform yandex lockboxansible vault как зашифровать секреты и паролиjenkins credentials как хранить секреты в пайплайне

Вернуться в «Terraform: инфраструктура как код на Yandex Cloud»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость