Mozilla SOPS

Тема дорожной карты · Terraform

SOPS с Terraform — это паттерн интеграции, использующий Mozilla SOPS (Secrets OPerationS) для шифрования tfvars-файлов и других HCL-файлов секретов в покое в системе контроля версий с расшифровкой только во время terraform plan или terraform apply. SOPS шифрует файлы с помощью AWS KMS, GCP KMS, Azure Key Vault или PGP-ключей, сохраняя зашифрованный шифртекст вместе со структурой открытого текста — так что diff остаётся читаемым в Git без раскрытия значений секретов. Провайдер terraform-sops или pre-hook в CI расшифровывает сконфигурированные через .sops.yaml файлы до того, как Terraform их парсит, исключая учётные данные из незашифрованных tfvars и избавляя от необходимости хранить секреты в отдельном хранилище для простых рабочих процессов. SOPS с Terraform особенно популярен в GitOps-конвейерах, где IaC-код и зашифрованные секреты хранятся в одном репозитории и развёртываются инструментами типа GitHub Actions или Atlantis.

Как это работает

Mozilla SOPS — как секреты попадают в Terraform без попадания в git или plaintext-state. Варианты: env vars (TF_VAR_db_password), data-источники (data "aws_secretsmanager_secret_version" "db"), провайдер Vault, SOPS-зашифрованные *.tfvars, cloud-managed secrets (Yandex Lockbox, AWS Secrets Manager). State-файлы содержат resolved значения — шифруйте backend bucket + ограничивайте доступ. sensitive = true для переменных — для редакции в plan-выводе.

Когда применять

Никогда не коммитьте секреты в *.tf или *.tfvars в git. В CI — env vars; в production — secrets manager. Шифруйте state at rest (S3 SSE, Yandex Object Storage encryption) и ограничивайте, кто может его читать. Для team dev — SOPS-шифрованные tfvars + age/PGP-ключи. Периодический аудит terraform state pull | grep -i secret.

Типичные ошибки

Ловушки Mozilla SOPS: output "password" { value = ... } без sensitive = true (печатается в CI-логах); секреты в tags или name ресурсов (state их содержит); ротация секрета руками, потом Terraform перезаписывает на следующий apply; расчёт, что "state-файл приватный" без проверки прав на backend. Read state — это audit-дыра.

Связанные понятия

Полезные ресурсы