我正在使用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状态加密的用例。
答案 0 :(得分:2)
我对GCP的了解不多,但是在AWS中,很典型的做法是,鉴于AWS托管ReadOnly
策略允许读取所有内容,包括从中获取对象,向许多用户授予非特权用户/角色相当广泛的读取权限每个桶。
使用非特权用户无法获得解密访问权限的特定KMS密钥对状态文件进行加密,提供了控制状态文件及其中潜在敏感信息访问的另一种方式。
即使在GCP中不是这种情况,它仍然可以在发生意外情况时提供另一层安全保护,并且意外地给没有特权的人提供对状态文件存储桶的广泛读取权限。
另外,默认情况下,不会在静止状态下对额外的AWS特定事物存储桶进行加密(这不是encrypted at rest by default的Google Cloud Storage的问题),因此从技术上来说,不当处置磁盘可以存储数据读取其中的所有状态文件机密。