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

时间:2018-11-30 13:36:40

标签: encryption google-cloud-platform terraform google-cloud-kms terraform-provider-gcp

我正在使用Terraform来管理Google Cloud Platform(GCP)资源。我使用Google Cloud Storage backend存储状态文件。 GCP提供了受管理的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状态)可以加密,但这真的有用吗?如果存储桶中有策略,例如“只有某些用户可以访问它(读/写)”之类的东西,添加加密是否有好处?我在这里只看到了额外的安全层(必要吗?),因为人们将需要访问此存储桶+角色roles/cloudkms.cryptoKeyEncrypterDecrypter才能访问内容。但是我认为我缺少一些证明Terraform状态加密的用例。

1 个答案:

答案 0 :(得分:2)

我对GCP的了解不多,但是在AWS中,很典型的做法是,鉴于AWS托管ReadOnly策略允许读取所有内容,包括从中获取对象,向许多用户授予非特权用户/角色相当广泛的读取权限每个桶。

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

即使在GCP中不是这种情况,它仍然可以在发生意外情况时提供另一层安全保护,并且意外地给没有特权的人提供对状态文件存储桶的广泛读取权限。

另外,默认情况下,不会在静止状态下对额外的AWS特定事物存储桶进行加密(这不是encrypted at rest by default的Google Cloud Storage的问题),因此从技术上来说,不当处置磁盘可以存储数据读取其中的所有状态文件机密。