← Назад к вопросам

Шифруется ли state file

1.7 Middle🔥 181 комментариев
#Безопасность

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Шифрование State File в Terraform

Короткий ответ: Нет, по умолчанию state file (файл состояния) в Terraform НЕ шифруется. Это один из самых критичных аспектов безопасности инфраструктуры как кода (IaC), который часто упускают из виду. Файл terraform.tfstate по умолчанию хранится в виде обычного текстового JSON-файла на локальной файловой системе, содержащего все конфиденциальные данные вашей инфраструктуры.

Почему это критично?

State file содержит чрезвычайно чувствительную информацию:

  • Сырые ресурсные ID всех управляемых ресурсов
  • Конфиденциальные выходные значения (outputs), включая пароли, ключи API, приватные IP-адреса
  • Атрибуты ресурсов, которые могут включать секреты (например, connection strings для баз данных)
  • Метаданные зависимостей между ресурсами
{
  "version": 4,
  "terraform_version": "1.5.0",
  "outputs": {
    "database_password": {
      "value": "SuperSecretPassword123!",
      "type": "string",
      "sensitive": false
    }
  },
  "resources": [
    {
      "mode": "managed",
      "type": "aws_db_instance",
      "name": "production",
      "provider": "provider[\"registry.terraform.io/hashicorp/aws\"]",
      "instances": [
        {
          "schema_version": 1,
          "attributes": {
            "password": "AnotherSecret!",
            "endpoint": "prod-db.abc123.us-east-1.rds.amazonaws.com:5432"
          }
        }
      ]
    }
  ]
}

Как видно из примера выше, даже с sensitive = true в конфигурации, значения в state file хранятся в открытом виде.

Рекомендуемые подходы к защите State File

1. Remote Backend с шифрованием

Наиболее правильный подход — использование удаленного бэкенда с встроенным шифрованием:

# Пример с AWS S3 + DynamoDB + KMS
terraform {
  backend "s3" {
    bucket         = "my-terraform-state-bucket"
    key            = "production/terraform.tfstate"
    region         = "us-east-1"
    encrypt        = true  # Включает SSE-S3 шифрование
    kms_key_id     = "arn:aws:kms:us-east-1:123456789012:key/abc123"
    dynamodb_table = "terraform-state-lock"
  }
}

Популярные защищенные бэкенды:

  • AWS S3 + KMS (Server-Side Encryption)
  • Azure Storage с Azure Key Vault
  • Google Cloud Storage с Cloud KMS
  • HashiCorp Terraform Cloud/Enterprise (полное управление шифрованием)
  • HashiCorp Consul с TLS

2. Использование External Secrets Management

Никогда не храните секреты непосредственно в Terraform:

# Использование AWS Secrets Manager
data "aws_secretsmanager_secret_version" "db_credentials" {
  secret_id = "production/database"
}

resource "aws_db_instance" "example" {
  # ...
  password = jsondecode(data.aws_secretsmanager_secret_version.db_credentials.secret_string)["password"]
}

3. Практики безопасности для State File

  • Никогда не коммитить state file в Git — добавьте *.tfstate и *.tfstate.* в .gitignore
  • Использовать state locking для предотвращения параллельного изменения
  • Регулярно ротировать ключи шифрования в KMS
  • Настроить strict IAM policies для доступа к бэкенду
  • Включить versioning в S3-бакете для восстановления предыдущих версий
  • Использовать разные state files для разных окружений (dev/stage/prod)

4. Дополнительные меры защиты

# Пример настройки S3 bucket policy для минимальных привилегий
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Deny",
      "Principal": "*",
      "Action": "s3:*",
      "Resource": [
        "arn:aws:s3:::my-terraform-state-bucket/*"
      ],
      "Condition": {
        "Bool": {
          "aws:SecureTransport": "false"
        }
      }
    }
  ]
}

Чего следует избегать

  • Локальное хранение state file в CI/CD системах
  • Передача state file по незащищенным каналам
  • Использование самописных решений шифрования вместо проверенных бэкендов
  • Хранение state file на общих сетевых дисках без шифрования

Вывод

Шифрование state file — это обязательное требование безопасности, а не опция. HashiCorp сознательно не включает встроенное шифрование в локальный state file, чтобы подтолкнуть пользователей к использованию удаленных бэкендов с правильной моделью безопасности. Современные best practices диктуют использование managed remote backends с включенным шифрованием, strict access controls и интеграцией с enterprise secrets management системами. Пренебрежение защитой state file может привести к полной компрометации вашей инфраструктуры и данных.

Шифруется ли state file | PrepBro