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

Posted

技术标签:

【中文标题】加密存储在远程后端(如 GCS 存储桶)上的 Terraform 状态是不是有用?【英文标题】:Is it useful to encrypt Terraform state stored on a remote backend (like GCS bucket)?加密存储在远程后端(如 GCS 存储桶)上的 Terraform 状态是否有用? 【发布时间】:2019-05-02 16:10:57 【问题描述】:

我正在使用 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】:

我对 GCP 知之甚少,但在 AWS 中,鉴于 AWS 管理的 ReadOnly 策略允许读取所有内容,包括从每个存储桶中获取对象,通常会向具有许多用户的非特权用户/角色提供相当广泛的读取权限.

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

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

作为一个额外的 AWS 特定事物,默认情况下不会对存储桶进行静态加密(不是 Google Cloud Storage 的问题,因为它是 encrypted at rest by default),因此从技术上讲,如果磁盘处置不当,可能会读取数据它包括任何国家文件机密。

【讨论】:

感谢您的解释!顺便说一句,我不知道 Google Cloud Storage 上的数据默认是加密的。也感谢您提醒我,如果有人意外访问了存储桶,他可以读取存储在 Terraform 状态中的所有敏感数据。这一点足以让我认为加密远程状态很有用。 不可能使用 KMS 密钥作为控制访问的额外方式。在将 KMS 密钥绑定到 GCS 存储桶的过程中,您授予 GCS 服务帐户权限以代表所有 GCS 调用方使用该密钥进行加密和解密。 cloud.google.com/storage/docs/encryption/customer-managed-keys @bdhess 如果您可以对此进行扩展,如果您比我更了解 GCP,那么使用客户管理的 KMS 密钥加密状态文件(可能包含纯文本中的秘密)有什么好处那很好啊。我的印象是服务帐户相当于 AWS IAM 角色,在这种情况下,如上所述,这仍然是有益的,但如果我错了,并且您有更好/更完整的答案,那么我很乐意删除此答案因为问题是以 GCP 为重点。 我找到了一些链接1,2,3,其中提供了一些有趣的方法来管理“服务帐户密钥”、“使用 Cloud KMS 进行秘密管理”等。

以上是关于加密存储在远程后端(如 GCS 存储桶)上的 Terraform 状态是不是有用?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 terraform 配置 GCS 存储桶权限?

使用数据流在 gcs 存储桶上按大小列出文件夹

Terraform 参考为远程后端创建了 S3 存储桶

如何设置 GCS 存储桶的限制

将多个 .gz 文件从一个 GCS 存储桶复制到 Java 中的另一个存储桶

Cloud Function 将存储桶中的所有文件复制到同一个 GCS 存储桶内的文件夹中