加密存储在远程后端(如 GCS 存储桶)上的 Terraform 状态是否有用?

Is it useful to encrypt Terraform state stored on a remote backend (like GCS bucket)?

我正在使用 Terraform 管理 Google 云平台 (GCP) 资源。我使用 Google Cloud Storage backend to store the state file. GCP provides a managed Key Management Service,因此可以管理密钥并使用这些密钥在存储桶上轻松启用加密。所以我使用以下内容来加密我的后端存储桶(test-terraform-state,这个存储桶将只包含 Terraform 状态)。

variable my-project {}
variable my-region {}

provider "google" {
  project = "${var.my-project}"
  region  = "${var.my-region}"
  version = "1.19.1"
}

resource "google_kms_key_ring" "test-terraform-state" {
  name     = "test-terraform-state"
  location = "${var.my-region}"
}

resource "google_kms_crypto_key" "test-terraform-state-bucket" {
  name            = "test-terraform-state-bucket"
  key_ring        = "${google_kms_key_ring.test-terraform-state.self_link}"
  rotation_period = "86400s"

  lifecycle {
    prevent_destroy = true
  }
}

resource "google_storage_bucket" "test-terraform-state" {
  name = "test-terraform-state"

  location      = "${var.my-region}"
  storage_class = "REGIONAL"

  versioning {
    enabled = true
  }

  encryption {
    default_kms_key_name = "${google_kms_crypto_key.test-terraform-state-bucket.self_link}"
  }
}

所以我的问题是:存储桶内容(此处为 Terraform 状态)可以加密,但它真的有用吗?如果存储桶上有策略,例如 "only some users can access it (read/write)",添加加密是否有好处?我在这里只看到一个额外的安全层(必要的?),因为人们需要访问这个存储桶 + 角色 roles/cloudkms.cryptoKeyEncrypterDecrypter 才能访问内容。但我认为我缺少一些证明 Terraform 状态加密合理的用例。

我对 GCP 知之甚少,但在 AWS 中,给许多用户非特权 users/roles 相当广泛的读取权限是很典型的,因为 AWS 管理的 ReadOnly 策略允许读取所有内容,包括从每个桶中获取对象。

使用非特权用户无法获得解密访问权限的特定 KMS 密钥加密状态文件提供了一种额外的方式来控制对状态文件及其中潜在敏感信息的访问。

即使在 GCP 中不是这种情况,它仍然提供了另一层安全性,以防万一情况发生变化,并且无特权的人意外获得了对您的状态文件存储桶的广泛读取权限。

作为额外的 AWS 特定事物,存储桶在默认情况下不会在静态时加密(这不是 Google Cloud Storage 的问题,因为它是 encrypted at rest by default)所以从技术上讲,可能会出现不正确的情况处理磁盘以读取数据,包括任何状态文件机密。