Пометка variable как sensitive скрывает значение в части вывода Terraform, но не превращает его в зашифрованный секрет. Значение может остаться в tfvars, state, CI-логе или истории Git.

Считайте уже опубликованный секрет скомпрометированным: сначала ограничьте доступ и ротируйте его, затем удаляйте из репозитория и переносите выдачу в secret manager.

Что сделать в первую очередь

  • Определите все секреты и места, куда они могли попасть.
  • Отзовите или ротируйте действующие токены и пароли.
  • Ограничьте доступ к state и журналам CI.
  • Сохраните минимальный аудит действий без копирования значений.

Почему возникает проблема

Terraform управляет инфраструктурой, но его state должен знать многие итоговые значения и не является хранилищем секретов по умолчанию.

  • Файл terraform.tfvars добавлен в Git.
  • Секрет передаётся аргументом командной строки.
  • CI печатает environment и plan.
  • Remote state хранится без шифрования и ограничения ролей.
  • Провайдер возвращает секрет в state.

Пошаговая диагностика

  • Проверьте Git history и артефакты CI.
  • Проверьте state локально и в backend, не публикуя его.
  • Составьте список пользователей и сервисов с доступом.
  • Найдите output без sensitive.
  • Проверьте резервные копии state.

Как исправить

Цель — не только убрать секрет из кода, но и сократить его присутствие в state и журналах.

  • Храните секрет в Vault или облачном secret manager.
  • Передавайте Terraform ссылку или идентификатор секрета, где это возможно.
  • Используйте защищённые переменные CI без вывода в лог.
  • Зашифруйте remote state и включите блокировку и версионирование.
  • Очистите историю репозитория после ротации, согласовав последствия.

Как проверить результат

  • Новый секрет отсутствует в Git и обычных логах.
  • Старое значение больше не действует.
  • Доступ к state есть только у нужной роли.
  • Plan не раскрывает чувствительные значения.

Как не допустить повторения

  • Добавьте secret scanning до push.
  • Проверяйте Terraform-модули на чувствительные outputs.
  • Разделяйте роли CI и человека.
  • Регулярно ротируйте краткоживущие credentials.

Чего не стоит делать

  • Не ограничивайтесь sensitive=true.
  • Не удаляйте строку из последнего commit, оставляя историю.
  • Не отправляйте state в тикет или чат.

Что подготовить для диагностики

  • Список затронутых репозиториев и state.
  • Типы секретов без их значений.
  • Схема CI и backend Terraform.
  • Перечень систем, где нужна ротация.

Частые вопросы

Sensitive шифрует значение?

Нет. Он в основном скрывает отображение; state всё равно может содержать значение.

Можно ли полностью исключить секреты из state?

Не всегда, это зависит от провайдера. Но можно минимизировать их число и строго защитить backend.

Когда стоит обратиться за помощью

Если секрет уже попал в Git, CI и state, нужен согласованный план ротации, чтобы не остановить рабочую инфраструктуру.

Итог

Безопасность Terraform начинается с ротации и контроля state, а не с маскировки вывода. Я могу помочь перенести секреты, закрыть доступ и настроить проверку утечек в CI.