Sensitive скрывает вывод, но что остаётся в state Terraform и OpenTofu

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

Поэтому анализ начинается с пути данных. Откуда приходит секрет, какие ресурсы его получают, куда сохраняется состояние и кто умеет читать эту копию? Невидимость в терминале полезна, но не отвечает на вопросы хранения и доступа.

Проверим механизм на ненастоящем значении

В отдельном учебном каталоге создайте main.tf. Пример использует terraform_data и строку demo-not-a-real-secret. Она намеренно несекретная, чтобы исследование state не раскрывало действующие credentials. Для Terraform нужен CLI 1.4+ из-за terraform_data.

variable "demo_secret" {
  type      = string
  sensitive = true
  default   = "demo-not-a-real-secret"
}

resource "terraform_data" "demo" {
  input = var.demo_secret
}

output "demo_value" {
  value     = terraform_data.demo.output
  sensitive = true
}

В новом локальном состоянии выполните init, plan и подтверждённый apply своего инструмента. Обычный вывод должен скрывать значение. Затем изучите локальный terraform.tfstate на наличие учебной строки. При включённом шифровании OpenTofu файл может иметь другое представление; проверять открытое хранение нужно в отдельном стенде без такой настройки, а не отключать защиту рабочего backend.

from pathlib import Path

state = Path("terraform.tfstate").read_bytes()
marker = b"demo-not-a-real-secret"
print("Demo marker present:", marker in state)

Этот скрипт выводит только факт наличия известного маркера. В обычном незашифрованном локальном state после apply ожидается True. Он не является универсальной проверкой безопасности: отсутствие конкретной строки не доказывает отсутствие других секретов или наличие шифрования.

Машиночитаемый вывод требует отдельной осторожности

Команды show -json и output -json предназначены для автоматизации и могут раскрывать значения, скрытые в человекочитаемом выводе. Не публикуйте полный JSON в открытых CI-логах. Сохранённый plan тоже следует считать чувствительным объектом, даже если текстовый plan показывал только sensitive value.

В Terraform sensitive и OpenTofu sensitive data метка не подменяет политику хранения. Секретные значения также могут попасть в файлы, созданные provisioner, сторонние логи и резервные копии состояния.

Защитим каждую сохраняемую копию

Для удалённого backend проверьте шифрование в хранилище и при передаче, права чтения и записи, резервные версии и журналы доступа. Доступ к state часто даёт больше информации, чем доступ к отдельному выводу модуля. CI-учётной записи следует выдавать нужные полномочия, а право скачивания plan ограничивать участниками релизного процесса.

Локальный state не коммитят в Git. Добавление .gitignore защищает только от будущего случайного добавления: если секрет уже попал в историю или artifact, нужен отдельный разбор распространённых копий и ротация действующих credentials. Смена sensitive на true не удаляет прежние записи.

Где продукты различаются

У OpenTofu есть отдельная встроенная настройка шифрования state и plan с выбором источника ключей и правилами миграции. Она включается отдельно от sensitive. При её использовании надо продумать доступ CI к ключам и восстановление: утраченный ключ может лишить возможности прочитать состояние.

Не переносите блок encryption из OpenTofu в Terraform: это не общий синтаксис двух продуктов. Для Terraform выбор защиты опирается на возможности backend и платформы выполнения, а дополнительные средства исключения некоторых значений из state зависят от версии и контракта provider. Сначала проверяйте, подходит ли конкретному аргументу такой режим.

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

Ещё по теме

Продолжить изучение

Хотите управлять инфраструктурой через код и понимать последствия изменений? Plan, state, модули и работа с существующими ресурсами — темы программы «Terraform и OpenTofu: инфраструктура как код».

Продолжить на практике

  • Terraform и OpenTofu: инфраструктура как код ↗

    Описывайте инфраструктуру в коде, проверяйте изменения до применения и работайте со state без сюрпризов. HCL, модули, remote state, импорт, CI и различия Terraform/OpenTofu — на воспроизводимом учебном окружении.